Skip to content

Commit 07790fe

Browse files
committed
Improve DELETE FROM parsing (4.4/4.4)
Store (and parse) `table_name: SQLObjectName` instead of `relation: Option<Box<ASTNode>>`, which can be an arbitrary expression. Also remove the `Option<>`: the table name is not optional in any dialects I'm familiar with. While the FROM keyword itself _is_ optional in some dialects, there are more things to implement for those dialects, see https://stackoverflow.com/a/4484271/1026
1 parent f5bd9c3 commit 07790fe

File tree

3 files changed

+14
-33
lines changed

3 files changed

+14
-33
lines changed

src/sqlast/mod.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ pub enum SQLStatement {
179179
/// DELETE
180180
SQLDelete {
181181
/// FROM
182-
relation: Option<Box<ASTNode>>,
182+
table_name: SQLObjectName,
183183
/// WHERE
184184
selection: Option<Box<ASTNode>>,
185185
},
@@ -279,13 +279,10 @@ impl ToString for SQLStatement {
279279
s
280280
}
281281
SQLStatement::SQLDelete {
282-
relation,
282+
table_name,
283283
selection,
284284
} => {
285-
let mut s = String::from("DELETE");
286-
if let Some(relation) = relation {
287-
s += &format!(" FROM {}", relation.as_ref().to_string());
288-
}
285+
let mut s = format!("DELETE FROM {}", table_name.to_string());
289286
if let Some(selection) = selection {
290287
s += &format!(" WHERE {}", selection.as_ref().to_string());
291288
}

src/sqlparser.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,20 +1105,16 @@ impl Parser {
11051105
}
11061106

11071107
pub fn parse_delete(&mut self) -> Result<SQLStatement, ParserError> {
1108-
let relation: Option<Box<ASTNode>> = if self.parse_keyword("FROM") {
1109-
Some(Box::new(self.parse_subexpr(0)?)) /* TBD (4) */
1110-
} else {
1111-
None
1112-
};
1113-
1108+
self.expect_keyword("FROM")?;
1109+
let table_name = self.parse_object_name()?;
11141110
let selection = if self.parse_keyword("WHERE") {
11151111
Some(Box::new(self.parse_expr()?))
11161112
} else {
11171113
None
11181114
};
11191115

11201116
Ok(SQLStatement::SQLDelete {
1121-
relation,
1117+
table_name,
11221118
selection,
11231119
})
11241120
}

tests/sqlparser_generic.rs

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,10 @@ use sqlparser::sqltokenizer::*;
88

99
#[test]
1010
fn parse_delete_statement() {
11-
let sql: &str = "DELETE FROM 'table'";
12-
13-
match verified_stmt(&sql) {
14-
SQLStatement::SQLDelete { relation, .. } => {
15-
assert_eq!(
16-
Some(Box::new(ASTNode::SQLValue(Value::SingleQuotedString(
17-
"table".to_string()
18-
)))),
19-
relation
20-
);
11+
let sql = "DELETE FROM \"table\"";
12+
match verified_stmt(sql) {
13+
SQLStatement::SQLDelete { table_name, .. } => {
14+
assert_eq!(SQLObjectName(vec!["\"table\"".to_string()]), table_name);
2115
}
2216

2317
_ => assert!(false),
@@ -26,23 +20,17 @@ fn parse_delete_statement() {
2620

2721
#[test]
2822
fn parse_where_delete_statement() {
29-
let sql: &str = "DELETE FROM 'table' WHERE name = 5";
30-
3123
use self::ASTNode::*;
3224
use self::SQLOperator::*;
3325

34-
match verified_stmt(&sql) {
26+
let sql = "DELETE FROM foo WHERE name = 5";
27+
match verified_stmt(sql) {
3528
SQLStatement::SQLDelete {
36-
relation,
29+
table_name,
3730
selection,
3831
..
3932
} => {
40-
assert_eq!(
41-
Some(Box::new(ASTNode::SQLValue(Value::SingleQuotedString(
42-
"table".to_string()
43-
)))),
44-
relation
45-
);
33+
assert_eq!(SQLObjectName(vec!["foo".to_string()]), table_name);
4634

4735
assert_eq!(
4836
SQLBinaryExpr {

0 commit comments

Comments
 (0)