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