@@ -385,15 +385,101 @@ fn parse_no_table_name() {
385
385
fn parse_delete_statement ( ) {
386
386
let sql = "DELETE FROM \" table\" " ;
387
387
match verified_stmt ( sql) {
388
- Statement :: Delete { table_name , .. } => {
388
+ Statement :: Delete { from , .. } => {
389
389
assert_eq ! (
390
390
TableFactor :: Table {
391
391
name: ObjectName ( vec![ Ident :: with_quote( '"' , "table" ) ] ) ,
392
392
alias: None ,
393
393
args: None ,
394
394
with_hints: vec![ ] ,
395
395
} ,
396
- table_name
396
+ from[ 0 ] . relation
397
+ ) ;
398
+ }
399
+ _ => unreachable ! ( ) ,
400
+ }
401
+ }
402
+
403
+ #[ test]
404
+ fn parse_delete_statement_for_multi_tables ( ) {
405
+ let sql = "DELETE schema1.table1, schema2.table2 FROM schema1.table1 JOIN schema2.table2 ON schema2.table2.col1 = schema1.table1.col1 WHERE schema2.table2.col2 = 1" ;
406
+ match verified_stmt ( sql) {
407
+ Statement :: Delete { tables, from, .. } => {
408
+ assert_eq ! (
409
+ ObjectName ( vec![ Ident :: new( "schema1" ) , Ident :: new( "table1" ) ] ) ,
410
+ tables[ 0 ]
411
+ ) ;
412
+ assert_eq ! (
413
+ ObjectName ( vec![ Ident :: new( "schema2" ) , Ident :: new( "table2" ) ] ) ,
414
+ tables[ 1 ]
415
+ ) ;
416
+ assert_eq ! (
417
+ TableFactor :: Table {
418
+ name: ObjectName ( vec![ Ident :: new( "schema1" ) , Ident :: new( "table1" ) ] ) ,
419
+ alias: None ,
420
+ args: None ,
421
+ with_hints: vec![ ] ,
422
+ } ,
423
+ from[ 0 ] . relation
424
+ ) ;
425
+ assert_eq ! (
426
+ TableFactor :: Table {
427
+ name: ObjectName ( vec![ Ident :: new( "schema2" ) , Ident :: new( "table2" ) ] ) ,
428
+ alias: None ,
429
+ args: None ,
430
+ with_hints: vec![ ] ,
431
+ } ,
432
+ from[ 0 ] . joins[ 0 ] . relation
433
+ ) ;
434
+ }
435
+ _ => unreachable ! ( ) ,
436
+ }
437
+ }
438
+
439
+ #[ test]
440
+ fn parse_delete_statement_for_multi_tables_with_using ( ) {
441
+ let sql = "DELETE FROM schema1.table1, schema2.table2 USING schema1.table1 JOIN schema2.table2 ON schema2.table2.pk = schema1.table1.col1 WHERE schema2.table2.col2 = 1" ;
442
+ match verified_stmt ( sql) {
443
+ Statement :: Delete {
444
+ from,
445
+ using : Some ( using) ,
446
+ ..
447
+ } => {
448
+ assert_eq ! (
449
+ TableFactor :: Table {
450
+ name: ObjectName ( vec![ Ident :: new( "schema1" ) , Ident :: new( "table1" ) ] ) ,
451
+ alias: None ,
452
+ args: None ,
453
+ with_hints: vec![ ] ,
454
+ } ,
455
+ from[ 0 ] . relation
456
+ ) ;
457
+ assert_eq ! (
458
+ TableFactor :: Table {
459
+ name: ObjectName ( vec![ Ident :: new( "schema2" ) , Ident :: new( "table2" ) ] ) ,
460
+ alias: None ,
461
+ args: None ,
462
+ with_hints: vec![ ] ,
463
+ } ,
464
+ from[ 1 ] . relation
465
+ ) ;
466
+ assert_eq ! (
467
+ TableFactor :: Table {
468
+ name: ObjectName ( vec![ Ident :: new( "schema1" ) , Ident :: new( "table1" ) ] ) ,
469
+ alias: None ,
470
+ args: None ,
471
+ with_hints: vec![ ] ,
472
+ } ,
473
+ using[ 0 ] . relation
474
+ ) ;
475
+ assert_eq ! (
476
+ TableFactor :: Table {
477
+ name: ObjectName ( vec![ Ident :: new( "schema2" ) , Ident :: new( "table2" ) ] ) ,
478
+ alias: None ,
479
+ args: None ,
480
+ with_hints: vec![ ] ,
481
+ } ,
482
+ using[ 0 ] . joins[ 0 ] . relation
397
483
) ;
398
484
}
399
485
_ => unreachable ! ( ) ,
@@ -407,7 +493,8 @@ fn parse_where_delete_statement() {
407
493
let sql = "DELETE FROM foo WHERE name = 5" ;
408
494
match verified_stmt ( sql) {
409
495
Statement :: Delete {
410
- table_name,
496
+ tables : _,
497
+ from,
411
498
using,
412
499
selection,
413
500
returning,
@@ -419,7 +506,7 @@ fn parse_where_delete_statement() {
419
506
args: None ,
420
507
with_hints: vec![ ] ,
421
508
} ,
422
- table_name ,
509
+ from [ 0 ] . relation ,
423
510
) ;
424
511
425
512
assert_eq ! ( None , using) ;
@@ -444,7 +531,8 @@ fn parse_where_delete_with_alias_statement() {
444
531
let sql = "DELETE FROM basket AS a USING basket AS b WHERE a.id < b.id" ;
445
532
match verified_stmt ( sql) {
446
533
Statement :: Delete {
447
- table_name,
534
+ tables : _,
535
+ from,
448
536
using,
449
537
selection,
450
538
returning,
@@ -459,19 +547,21 @@ fn parse_where_delete_with_alias_statement() {
459
547
args: None ,
460
548
with_hints: vec![ ] ,
461
549
} ,
462
- table_name ,
550
+ from [ 0 ] . relation ,
463
551
) ;
464
-
465
552
assert_eq ! (
466
- Some ( TableFactor :: Table {
467
- name: ObjectName ( vec![ Ident :: new( "basket" ) ] ) ,
468
- alias: Some ( TableAlias {
469
- name: Ident :: new( "b" ) ,
470
- columns: vec![ ] ,
471
- } ) ,
472
- args: None ,
473
- with_hints: vec![ ] ,
474
- } ) ,
553
+ Some ( vec![ TableWithJoins {
554
+ relation: TableFactor :: Table {
555
+ name: ObjectName ( vec![ Ident :: new( "basket" ) ] ) ,
556
+ alias: Some ( TableAlias {
557
+ name: Ident :: new( "b" ) ,
558
+ columns: vec![ ] ,
559
+ } ) ,
560
+ args: None ,
561
+ with_hints: vec![ ] ,
562
+ } ,
563
+ joins: vec![ ] ,
564
+ } ] ) ,
475
565
using
476
566
) ;
477
567
assert_eq ! (
0 commit comments