@@ -2730,3 +2730,56 @@ fn parse_mssql_tran_shorthand() {
27302730 // ROLLBACK TRAN normalizes to ROLLBACK (same as ROLLBACK TRANSACTION)
27312731 ms ( ) . one_statement_parses_to ( "ROLLBACK TRAN" , "ROLLBACK" ) ;
27322732}
2733+
2734+ #[ test]
2735+ fn test_tsql_statement_keywords_not_implicit_aliases ( ) {
2736+ // T-SQL statement-starting keywords must never be consumed as implicit
2737+ // aliases for a preceding SELECT item or table reference when using
2738+ // newline-delimited multi-statement scripts.
2739+
2740+ // Without the fix, the parser would consume a statement-starting keyword
2741+ // as an implicit alias for the preceding SELECT item or table reference,
2742+ // then fail on the next token. Verify parsing succeeds and each input
2743+ // produces the expected number of statements.
2744+
2745+ // Keywords that should not become implicit column aliases
2746+ let col_alias_cases: & [ ( & str , usize ) ] = & [
2747+ ( "select 1\n declare @x as int" , 2 ) ,
2748+ ( "select 1\n exec sp_who" , 2 ) ,
2749+ ( "select 1\n insert into t values (1)" , 2 ) ,
2750+ ( "select 1\n update t set col=1" , 2 ) ,
2751+ ( "select 1\n delete from t" , 2 ) ,
2752+ ( "select 1\n drop table t" , 2 ) ,
2753+ ( "select 1\n create table t (id int)" , 2 ) ,
2754+ ( "select 1\n alter table t add col int" , 2 ) ,
2755+ ( "select 1\n return" , 2 ) ,
2756+ ] ;
2757+ for ( sql, expected) in col_alias_cases {
2758+ let stmts = tsql ( )
2759+ . parse_sql_statements ( sql)
2760+ . unwrap_or_else ( |e| panic ! ( "failed to parse {sql:?}: {e}" ) ) ;
2761+ assert_eq ! (
2762+ stmts. len( ) ,
2763+ * expected,
2764+ "expected {expected} stmts for: {sql:?}"
2765+ ) ;
2766+ }
2767+
2768+ // Keywords that should not become implicit table aliases
2769+ let tbl_alias_cases: & [ ( & str , usize ) ] = & [
2770+ ( "select * from t\n declare @x as int" , 2 ) ,
2771+ ( "select * from t\n drop table t" , 2 ) ,
2772+ ( "select * from t\n create table u (id int)" , 2 ) ,
2773+ ( "select * from t\n exec sp_who" , 2 ) ,
2774+ ] ;
2775+ for ( sql, expected) in tbl_alias_cases {
2776+ let stmts = tsql ( )
2777+ . parse_sql_statements ( sql)
2778+ . unwrap_or_else ( |e| panic ! ( "failed to parse {sql:?}: {e}" ) ) ;
2779+ assert_eq ! (
2780+ stmts. len( ) ,
2781+ * expected,
2782+ "expected {expected} stmts for: {sql:?}"
2783+ ) ;
2784+ }
2785+ }
0 commit comments