diff --git a/src/sqlast/mod.rs b/src/sqlast/mod.rs index fe9901d3..0e996a4f 100644 --- a/src/sqlast/mod.rs +++ b/src/sqlast/mod.rs @@ -342,8 +342,8 @@ pub enum SQLStatement { table_name: SQLObjectName, /// COLUMNS columns: Vec, - /// VALUES (vector of rows to insert) - values: SQLValues, + /// A SQL query that specifies what to insert + source: Box, }, SQLCopy { /// TABLE @@ -409,13 +409,13 @@ impl ToString for SQLStatement { SQLStatement::SQLInsert { table_name, columns, - values, + source, } => { - let mut s = format!("INSERT INTO {}", table_name.to_string()); + let mut s = format!("INSERT INTO {} ", table_name.to_string()); if !columns.is_empty() { - s += &format!(" ({})", columns.join(", ")); + s += &format!("({}) ", columns.join(", ")); } - s += &format!(" {}", values.to_string()); + s += &source.to_string(); s } SQLStatement::SQLCopy { diff --git a/src/sqlparser.rs b/src/sqlparser.rs index 05b4e929..cbf67b05 100644 --- a/src/sqlparser.rs +++ b/src/sqlparser.rs @@ -1565,12 +1565,11 @@ impl Parser { self.expect_keyword("INTO")?; let table_name = self.parse_object_name()?; let columns = self.parse_parenthesized_column_list(Optional)?; - self.expect_keyword("VALUES")?; - let values = self.parse_values()?; + let source = Box::new(self.parse_query()?); Ok(SQLStatement::SQLInsert { table_name, columns, - values, + source, }) } diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index cd0ec3db..b8a88aae 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -52,16 +52,23 @@ fn parse_insert_values() { SQLStatement::SQLInsert { table_name, columns, - values, + source, .. } => { assert_eq!(table_name.to_string(), expected_table_name); assert_eq!(columns, expected_columns); - assert_eq!(values.0.as_slice(), expected_rows); + match &source.body { + SQLSetExpr::Values(SQLValues(values)) => { + assert_eq!(values.as_slice(), expected_rows) + } + _ => unreachable!(), + } } _ => unreachable!(), } } + + verified_stmt("INSERT INTO customer WITH foo AS (SELECT 1) SELECT * FROM foo UNION VALUES (1)"); } #[test]