diff --git a/src/sqlast/mod.rs b/src/sqlast/mod.rs index aeb30355..d1a57206 100644 --- a/src/sqlast/mod.rs +++ b/src/sqlast/mod.rs @@ -179,7 +179,7 @@ pub enum SQLStatement { /// DELETE SQLDelete { /// FROM - relation: Option>, + table_name: SQLObjectName, /// WHERE selection: Option>, }, @@ -279,13 +279,10 @@ impl ToString for SQLStatement { s } SQLStatement::SQLDelete { - relation, + table_name, selection, } => { - let mut s = String::from("DELETE"); - if let Some(relation) = relation { - s += &format!(" FROM {}", relation.as_ref().to_string()); - } + let mut s = format!("DELETE FROM {}", table_name.to_string()); if let Some(selection) = selection { s += &format!(" WHERE {}", selection.as_ref().to_string()); } diff --git a/src/sqlparser.rs b/src/sqlparser.rs index ffd25396..8b313327 100644 --- a/src/sqlparser.rs +++ b/src/sqlparser.rs @@ -1105,12 +1105,8 @@ impl Parser { } pub fn parse_delete(&mut self) -> Result { - let relation: Option> = if self.parse_keyword("FROM") { - Some(Box::new(self.parse_subexpr(0)?)) /* TBD (4) */ - } else { - None - }; - + self.expect_keyword("FROM")?; + let table_name = self.parse_object_name()?; let selection = if self.parse_keyword("WHERE") { Some(Box::new(self.parse_expr()?)) } else { @@ -1118,7 +1114,7 @@ impl Parser { }; Ok(SQLStatement::SQLDelete { - relation, + table_name, selection, }) } diff --git a/tests/sqlparser_generic.rs b/tests/sqlparser_generic.rs index 657223f1..de538fda 100644 --- a/tests/sqlparser_generic.rs +++ b/tests/sqlparser_generic.rs @@ -8,16 +8,10 @@ use sqlparser::sqltokenizer::*; #[test] fn parse_delete_statement() { - let sql: &str = "DELETE FROM 'table'"; - - match verified_stmt(&sql) { - SQLStatement::SQLDelete { relation, .. } => { - assert_eq!( - Some(Box::new(ASTNode::SQLValue(Value::SingleQuotedString( - "table".to_string() - )))), - relation - ); + let sql = "DELETE FROM \"table\""; + match verified_stmt(sql) { + SQLStatement::SQLDelete { table_name, .. } => { + assert_eq!(SQLObjectName(vec!["\"table\"".to_string()]), table_name); } _ => assert!(false), @@ -26,23 +20,17 @@ fn parse_delete_statement() { #[test] fn parse_where_delete_statement() { - let sql: &str = "DELETE FROM 'table' WHERE name = 5"; - use self::ASTNode::*; use self::SQLOperator::*; - match verified_stmt(&sql) { + let sql = "DELETE FROM foo WHERE name = 5"; + match verified_stmt(sql) { SQLStatement::SQLDelete { - relation, + table_name, selection, .. } => { - assert_eq!( - Some(Box::new(ASTNode::SQLValue(Value::SingleQuotedString( - "table".to_string() - )))), - relation - ); + assert_eq!(SQLObjectName(vec!["foo".to_string()]), table_name); assert_eq!( SQLBinaryExpr {