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 @@ -16477,11 +16477,27 @@ impl<'a> Parser<'a> {
1647716477 };
1647816478 };
1647916479
16480- if self.peek_token().token == Token::SemiColon {
16481- parser_err!(
16482- "GO may not end with a semicolon",
16483- self.peek_token().span.start
16484- )?;
16480+ loop {
16481+ let next_token = self.peek_token_no_skip();
16482+ match next_token.token {
16483+ Token::EOF => break,
16484+ Token::Whitespace(ref w) => match w {
16485+ Whitespace::Newline => break,
16486+ Whitespace::SingleLineComment { comment, prefix: _ } => {
16487+ if comment.ends_with('\n') {
16488+ break;
16489+ }
16490+ _ = self.next_token_no_skip();
16491+ }
16492+ _ => _ = self.next_token_no_skip(),
16493+ },
16494+ _ => {
16495+ parser_err!(
16496+ "GO must be followed by a newline or EOF",
16497+ self.peek_token().span.start
16498+ )?;
16499+ }
16500+ };
1648516501 }
1648616502
1648716503 Ok(Statement::Go(GoStatement { count }))
Original file line number Diff line number Diff line change @@ -2571,6 +2571,12 @@ fn parse_mssql_go_keyword() {
25712571 ms ( ) . statements_parse_to ( multi_line_comment_following, 2 , "USE some_database\n GO 42" ) ;
25722572 assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: Some ( 42 ) } ) ) ;
25732573
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+
25742580 let actually_column_alias = "SELECT NULL GO" ;
25752581 let stmt = ms ( ) . one_statement_parses_to ( actually_column_alias, "SELECT NULL AS GO" ) ;
25762582 match & stmt {
@@ -2600,6 +2606,13 @@ fn parse_mssql_go_keyword() {
26002606 err. unwrap_err( ) . to_string( ) ,
26012607 "sql parser error: Expected: literal int or newline, found: x"
26022608 ) ;
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+ ) ;
26032616}
26042617
26052618#[ test]
You can’t perform that action at this time.
0 commit comments