@@ -395,6 +395,76 @@ fn join_with_ambiguous_column() {
395395 quick_test ( sql, expected) ;
396396}
397397
398+ #[ test]
399+ fn using_join_multiple_keys ( ) {
400+ let sql = "SELECT * FROM person a join person b using (id, age)" ;
401+ let expected = "Projection: a.id, a.first_name, a.last_name, a.age, a.state, a.salary, a.birth_date, a.😀, \
402+ b.first_name, b.last_name, b.state, b.salary, b.birth_date, b.😀\
403+ \n Inner Join: Using a.id = b.id, a.age = b.age\
404+ \n SubqueryAlias: a\
405+ \n TableScan: person\
406+ \n SubqueryAlias: b\
407+ \n TableScan: person";
408+ quick_test ( sql, expected) ;
409+ }
410+
411+ #[ test]
412+ fn using_join_multiple_keys_subquery ( ) {
413+ let sql =
414+ "SELECT age FROM (SELECT * FROM person a join person b using (id, age, state))" ;
415+ let expected = "Projection: a.age\
416+ \n Projection: a.id, a.first_name, a.last_name, a.age, a.state, a.salary, a.birth_date, a.😀, \
417+ b.first_name, b.last_name, b.salary, b.birth_date, b.😀\
418+ \n Inner Join: Using a.id = b.id, a.age = b.age, a.state = b.state\
419+ \n SubqueryAlias: a\
420+ \n TableScan: person\
421+ \n SubqueryAlias: b\
422+ \n TableScan: person";
423+ quick_test ( sql, expected) ;
424+ }
425+
426+ #[ test]
427+ fn using_join_multiple_keys_qualified_wildcard_select ( ) {
428+ let sql = "SELECT a.* FROM person a join person b using (id, age)" ;
429+ let expected = "Projection: a.id, a.first_name, a.last_name, a.age, a.state, a.salary, a.birth_date, a.😀\
430+ \n Inner Join: Using a.id = b.id, a.age = b.age\
431+ \n SubqueryAlias: a\
432+ \n TableScan: person\
433+ \n SubqueryAlias: b\
434+ \n TableScan: person";
435+ quick_test ( sql, expected) ;
436+ }
437+
438+ #[ test]
439+ fn using_join_multiple_keys_select_all_columns ( ) {
440+ let sql = "SELECT a.*, b.* FROM person a join person b using (id, age)" ;
441+ let expected = "Projection: a.id, a.first_name, a.last_name, a.age, a.state, a.salary, a.birth_date, a.😀, \
442+ b.id, b.first_name, b.last_name, b.age, b.state, b.salary, b.birth_date, b.😀\
443+ \n Inner Join: Using a.id = b.id, a.age = b.age\
444+ \n SubqueryAlias: a\
445+ \n TableScan: person\
446+ \n SubqueryAlias: b\
447+ \n TableScan: person";
448+ quick_test ( sql, expected) ;
449+ }
450+
451+ #[ test]
452+ fn using_join_multiple_keys_multiple_joins ( ) {
453+ let sql = "SELECT * FROM person a join person b using (id, age, state) join person c using (id, age, state)" ;
454+ let expected = "Projection: a.id, a.first_name, a.last_name, a.age, a.state, a.salary, a.birth_date, a.😀, \
455+ b.first_name, b.last_name, b.salary, b.birth_date, b.😀, \
456+ c.first_name, c.last_name, c.salary, c.birth_date, c.😀\
457+ \n Inner Join: Using a.id = c.id, a.age = c.age, a.state = c.state\
458+ \n Inner Join: Using a.id = b.id, a.age = b.age, a.state = b.state\
459+ \n SubqueryAlias: a\
460+ \n TableScan: person\
461+ \n SubqueryAlias: b\
462+ \n TableScan: person\
463+ \n SubqueryAlias: c\
464+ \n TableScan: person";
465+ quick_test ( sql, expected) ;
466+ }
467+
398468#[ test]
399469fn select_with_having ( ) {
400470 let sql = "SELECT id, age
0 commit comments