@@ -2523,3 +2523,73 @@ DECLARE @Y AS NVARCHAR(MAX)='y'
25232523 assert_eq ! ( stmts. len( ) , 2 ) ;
25242524 assert ! ( stmts. iter( ) . all( |s| matches!( s, Statement :: Declare { .. } ) ) ) ;
25252525}
2526+
2527+ #[ test]
2528+ fn parse_mssql_go_keyword ( ) {
2529+ let single_go_keyword = "USE some_database;\n GO" ;
2530+ let stmts = ms ( ) . parse_sql_statements ( single_go_keyword) . unwrap ( ) ;
2531+ assert_eq ! ( stmts. len( ) , 2 ) ;
2532+ assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: None } ) , ) ;
2533+
2534+ let go_with_count = "SELECT 1;\n GO 5" ;
2535+ let stmts = ms ( ) . parse_sql_statements ( go_with_count) . unwrap ( ) ;
2536+ assert_eq ! ( stmts. len( ) , 2 ) ;
2537+ assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: Some ( 5 ) } ) ) ;
2538+
2539+ let bare_go = "GO" ;
2540+ let stmts = ms ( ) . parse_sql_statements ( bare_go) . unwrap ( ) ;
2541+ assert_eq ! ( stmts. len( ) , 1 ) ;
2542+ assert_eq ! ( stmts[ 0 ] , Statement :: Go ( GoStatement { count: None } ) ) ;
2543+
2544+ let go_then_statements = "/* whitespace */ GO\n RAISERROR('This is a test', 16, 1);" ;
2545+ let stmts = ms ( ) . parse_sql_statements ( go_then_statements) . unwrap ( ) ;
2546+ assert_eq ! ( stmts. len( ) , 2 ) ;
2547+ assert_eq ! ( stmts[ 0 ] , Statement :: Go ( GoStatement { count: None } ) ) ;
2548+ assert_eq ! (
2549+ stmts[ 1 ] ,
2550+ Statement :: RaisError {
2551+ message: Box :: new( Expr :: Value (
2552+ ( Value :: SingleQuotedString ( "This is a test" . to_string( ) ) ) . with_empty_span( )
2553+ ) ) ,
2554+ severity: Box :: new( Expr :: Value ( number( "16" ) . with_empty_span( ) ) ) ,
2555+ state: Box :: new( Expr :: Value ( number( "1" ) . with_empty_span( ) ) ) ,
2556+ arguments: vec![ ] ,
2557+ options: vec![ ] ,
2558+ }
2559+ ) ;
2560+
2561+ let multiple_gos = "SELECT 1;\n GO 5\n SELECT 2;\n GO" ;
2562+ let stmts = ms ( ) . parse_sql_statements ( multiple_gos) . unwrap ( ) ;
2563+ assert_eq ! ( stmts. len( ) , 4 ) ;
2564+ assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: Some ( 5 ) } ) ) ;
2565+ assert_eq ! ( stmts[ 3 ] , Statement :: Go ( GoStatement { count: None } ) ) ;
2566+
2567+ let comment_following_go = "USE some_database;\n GO -- okay" ;
2568+ let stmts = ms ( ) . parse_sql_statements ( comment_following_go) . unwrap ( ) ;
2569+ assert_eq ! ( stmts. len( ) , 2 ) ;
2570+ assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: None } ) ) ;
2571+
2572+ let actually_column_alias = "SELECT NULL AS GO" ;
2573+ let stmt = ms ( ) . verified_only_select ( actually_column_alias) ;
2574+ assert_eq ! (
2575+ only( stmt. projection) ,
2576+ SelectItem :: ExprWithAlias {
2577+ expr: Expr :: Value ( Value :: Null . with_empty_span( ) ) ,
2578+ alias: Ident :: new( "GO" ) ,
2579+ }
2580+ ) ;
2581+
2582+ let invalid_go_position = "SELECT 1; GO" ;
2583+ let err = ms ( ) . parse_sql_statements ( invalid_go_position) ;
2584+ assert_eq ! (
2585+ err. unwrap_err( ) . to_string( ) ,
2586+ "sql parser error: Expected: newline before GO, found: ;"
2587+ ) ;
2588+
2589+ let invalid_go_count = "SELECT 1\n GO x" ;
2590+ let err = ms ( ) . parse_sql_statements ( invalid_go_count) ;
2591+ assert_eq ! (
2592+ err. unwrap_err( ) . to_string( ) ,
2593+ "sql parser error: Expected: end of statement, found: x"
2594+ ) ;
2595+ }
0 commit comments