File tree Expand file tree Collapse file tree 2 files changed +34
-5
lines changed Expand file tree Collapse file tree 2 files changed +34
-5
lines changed Original file line number Diff line number Diff line change @@ -16571,11 +16571,27 @@ impl<'a> Parser<'a> {
16571
16571
};
16572
16572
};
16573
16573
16574
- if self.peek_token().token == Token::SemiColon {
16575
- parser_err!(
16576
- "GO may not end with a semicolon",
16577
- self.peek_token().span.start
16578
- )?;
16574
+ loop {
16575
+ let next_token = self.peek_token_no_skip();
16576
+ match next_token.token {
16577
+ Token::EOF => break,
16578
+ Token::Whitespace(ref w) => match w {
16579
+ Whitespace::Newline => break,
16580
+ Whitespace::SingleLineComment { comment, prefix: _ } => {
16581
+ if comment.ends_with('\n') {
16582
+ break;
16583
+ }
16584
+ _ = self.next_token_no_skip();
16585
+ }
16586
+ _ => _ = self.next_token_no_skip(),
16587
+ },
16588
+ _ => {
16589
+ parser_err!(
16590
+ "GO must be followed by a newline or EOF",
16591
+ self.peek_token().span.start
16592
+ )?;
16593
+ }
16594
+ };
16579
16595
}
16580
16596
16581
16597
Ok(Statement::Go(GoStatement { count }))
Original file line number Diff line number Diff line change @@ -2571,6 +2571,12 @@ fn parse_mssql_go_keyword() {
2571
2571
ms ( ) . statements_parse_to ( multi_line_comment_following, 2 , "USE some_database\n GO 42" ) ;
2572
2572
assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: Some ( 42 ) } ) ) ;
2573
2573
2574
+ let cte_following_go =
2575
+ "USE some_database;\n GO\n ;WITH cte AS (\n SELECT 1 x\n )\n SELECT * FROM cte;" ;
2576
+ let stmts = ms ( ) . parse_sql_statements ( cte_following_go) . unwrap ( ) ;
2577
+ assert_eq ! ( stmts. len( ) , 3 ) ;
2578
+ assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: None } ) ) ;
2579
+
2574
2580
let actually_column_alias = "SELECT NULL GO" ;
2575
2581
let stmt = ms ( ) . one_statement_parses_to ( actually_column_alias, "SELECT NULL AS GO" ) ;
2576
2582
match & stmt {
@@ -2600,6 +2606,13 @@ fn parse_mssql_go_keyword() {
2600
2606
err. unwrap_err( ) . to_string( ) ,
2601
2607
"sql parser error: Expected: literal int or newline, found: x"
2602
2608
) ;
2609
+
2610
+ let invalid_go_delimiter = "SELECT 1\n GO;" ;
2611
+ let err = ms ( ) . parse_sql_statements ( invalid_go_delimiter) ;
2612
+ assert_eq ! (
2613
+ err. unwrap_err( ) . to_string( ) ,
2614
+ "sql parser error: Expected: literal int or newline, found: ;"
2615
+ ) ;
2603
2616
}
2604
2617
2605
2618
#[ test]
You can’t perform that action at this time.
0 commit comments