delete: add using clause, possibility of using aliases (#541)

Signed-off-by: Maciej Obuchowski <obuchowski.maciej@gmail.com>
This commit is contained in:
Maciej Obuchowski 2022-07-18 16:29:03 +02:00 committed by GitHub
parent 93e16e9864
commit 4706d8b1d2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 86 additions and 5 deletions

View file

@ -253,7 +253,12 @@ fn parse_delete_statement() {
match verified_stmt(sql) {
Statement::Delete { table_name, .. } => {
assert_eq!(
ObjectName(vec![Ident::with_quote('"', "table")]),
TableFactor::Table {
name: ObjectName(vec![Ident::with_quote('"', "table")]),
alias: None,
args: None,
with_hints: vec![]
},
table_name
);
}
@ -269,11 +274,20 @@ fn parse_where_delete_statement() {
match verified_stmt(sql) {
Statement::Delete {
table_name,
using,
selection,
..
} => {
assert_eq!(ObjectName(vec![Ident::new("foo")]), table_name);
assert_eq!(
TableFactor::Table {
name: ObjectName(vec![Ident::new("foo")]),
alias: None,
args: None,
with_hints: vec![]
},
table_name,
);
assert_eq!(None, using);
assert_eq!(
Expr::BinaryOp {
left: Box::new(Expr::Identifier(Ident::new("name"))),
@ -287,6 +301,61 @@ fn parse_where_delete_statement() {
}
}
#[test]
fn parse_where_delete_with_alias_statement() {
use self::BinaryOperator::*;
let sql = "DELETE FROM basket AS a USING basket AS b WHERE a.id < b.id";
match verified_stmt(sql) {
Statement::Delete {
table_name,
using,
selection,
} => {
assert_eq!(
TableFactor::Table {
name: ObjectName(vec![Ident::new("basket")]),
alias: Some(TableAlias {
name: Ident::new("a"),
columns: vec![]
}),
args: None,
with_hints: vec![]
},
table_name,
);
assert_eq!(
Some(TableFactor::Table {
name: ObjectName(vec![Ident::new("basket")]),
alias: Some(TableAlias {
name: Ident::new("b"),
columns: vec![]
}),
args: None,
with_hints: vec![]
}),
using
);
assert_eq!(
Expr::BinaryOp {
left: Box::new(Expr::CompoundIdentifier(vec![
Ident::new("a"),
Ident::new("id")
])),
op: Lt,
right: Box::new(Expr::CompoundIdentifier(vec![
Ident::new("b"),
Ident::new("id")
])),
},
selection.unwrap(),
);
}
_ => unreachable!(),
}
}
#[test]
fn parse_top_level() {
verified_stmt("SELECT 1");