@@ -406,7 +406,7 @@ fn test_duplicate_cte_name() -> Result<()> {
406406
407407#[ test]
408408fn test_duplicate_table_alias ( ) -> Result < ( ) > {
409- let query = "SELECT * FROM /*a*/person a/*a*/, /*b*/person a/*b*/" ;
409+ let query = "SELECT * FROM person /*a*/a/*a*/, person /*b*/a/*b*/" ;
410410 let spans = get_spans ( query) ;
411411 let diag = do_query ( query) ;
412412 assert_snapshot ! ( diag. message, @"duplicate table alias in FROM clause" ) ;
@@ -419,7 +419,7 @@ fn test_duplicate_table_alias() -> Result<()> {
419419
420420#[ test]
421421fn test_duplicate_table_alias_not_first ( ) -> Result < ( ) > {
422- let query = "SELECT * FROM person a, /*b*/test_decimal b/*b*/, /*c*/person b/*c*/" ;
422+ let query = "SELECT * FROM person a, test_decimal /*b*/b/*b*/, person /*c*/b/*c*/" ;
423423 let spans = get_spans ( query) ;
424424 let diag = do_query ( query) ;
425425 assert_snapshot ! ( diag. message, @"duplicate table alias in FROM clause" ) ;
@@ -445,7 +445,7 @@ fn test_duplicate_bare_table_in_from() -> Result<()> {
445445
446446#[ test]
447447fn test_duplicate_alias_non_overlapping_columns ( ) -> Result < ( ) > {
448- let query = "SELECT * FROM /*a*/j1 AS t/*a*/, /*b*/j2 AS t/*b*/" ;
448+ let query = "SELECT * FROM j1 AS /*a*/t/*a*/, j2 AS /*b*/t/*b*/" ;
449449 let spans = get_spans ( query) ;
450450 let diag = do_query ( query) ;
451451 assert_snapshot ! ( diag. message, @"duplicate table alias in FROM clause" ) ;
@@ -458,7 +458,63 @@ fn test_duplicate_alias_non_overlapping_columns() -> Result<()> {
458458
459459#[ test]
460460fn test_duplicate_alias_non_overlapping_three_tables ( ) -> Result < ( ) > {
461- let query = "SELECT * FROM j1 AS x, /*a*/j2 AS t/*a*/, j3 AS y, /*b*/j1 AS t/*b*/" ;
461+ let query = "SELECT * FROM j1 AS x, j2 AS /*a*/t/*a*/, j3 AS y, j1 AS /*b*/t/*b*/" ;
462+ let spans = get_spans ( query) ;
463+ let diag = do_query ( query) ;
464+ assert_snapshot ! ( diag. message, @"duplicate table alias in FROM clause" ) ;
465+ assert_eq ! ( diag. span, Some ( spans[ "b" ] ) ) ;
466+ assert_eq ! ( diag. notes. len( ) , 1 ) ;
467+ assert_snapshot ! ( diag. notes[ 0 ] . message, @"first defined here" ) ;
468+ assert_eq ! ( diag. notes[ 0 ] . span, Some ( spans[ "a" ] ) ) ;
469+ Ok ( ( ) )
470+ }
471+
472+ #[ test]
473+ fn test_duplicate_derived_subquery_alias ( ) -> Result < ( ) > {
474+ let query =
475+ "SELECT * FROM (SELECT 1) AS /*a*/t/*a*/, (SELECT 2) AS /*b*/t/*b*/" ;
476+ let spans = get_spans ( query) ;
477+ let diag = do_query ( query) ;
478+ assert_snapshot ! ( diag. message, @"duplicate table alias in FROM clause" ) ;
479+ assert_eq ! ( diag. span, Some ( spans[ "b" ] ) ) ;
480+ assert_eq ! ( diag. notes. len( ) , 1 ) ;
481+ assert_snapshot ! ( diag. notes[ 0 ] . message, @"first defined here" ) ;
482+ assert_eq ! ( diag. notes[ 0 ] . span, Some ( spans[ "a" ] ) ) ;
483+ Ok ( ( ) )
484+ }
485+
486+ #[ test]
487+ fn test_duplicate_alias_table_and_derived ( ) -> Result < ( ) > {
488+ let query =
489+ "SELECT * FROM person AS /*a*/t/*a*/, (SELECT 1) AS /*b*/t/*b*/" ;
490+ let spans = get_spans ( query) ;
491+ let diag = do_query ( query) ;
492+ assert_snapshot ! ( diag. message, @"duplicate table alias in FROM clause" ) ;
493+ assert_eq ! ( diag. span, Some ( spans[ "b" ] ) ) ;
494+ assert_eq ! ( diag. notes. len( ) , 1 ) ;
495+ assert_snapshot ! ( diag. notes[ 0 ] . message, @"first defined here" ) ;
496+ assert_eq ! ( diag. notes[ 0 ] . span, Some ( spans[ "a" ] ) ) ;
497+ Ok ( ( ) )
498+ }
499+
500+ #[ test]
501+ fn test_duplicate_alias_derived_and_table ( ) -> Result < ( ) > {
502+ let query =
503+ "SELECT * FROM (SELECT 1) AS /*a*/t/*a*/, person AS /*b*/t/*b*/" ;
504+ let spans = get_spans ( query) ;
505+ let diag = do_query ( query) ;
506+ assert_snapshot ! ( diag. message, @"duplicate table alias in FROM clause" ) ;
507+ assert_eq ! ( diag. span, Some ( spans[ "b" ] ) ) ;
508+ assert_eq ! ( diag. notes. len( ) , 1 ) ;
509+ assert_snapshot ! ( diag. notes[ 0 ] . message, @"first defined here" ) ;
510+ assert_eq ! ( diag. notes[ 0 ] . span, Some ( spans[ "a" ] ) ) ;
511+ Ok ( ( ) )
512+ }
513+
514+ #[ test]
515+ fn test_duplicate_nested_join_alias ( ) -> Result < ( ) > {
516+ let query =
517+ "SELECT * FROM (person CROSS JOIN j1) AS /*a*/t/*a*/, (person CROSS JOIN j2) AS /*b*/t/*b*/" ;
462518 let spans = get_spans ( query) ;
463519 let diag = do_query ( query) ;
464520 assert_snapshot ! ( diag. message, @"duplicate table alias in FROM clause" ) ;
0 commit comments