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 @@ -15324,11 +15324,27 @@ impl<'a> Parser<'a> {
1532415324 };
1532515325 };
1532615326
15327- if self.peek_token().token == Token::SemiColon {
15328- parser_err!(
15329- "GO may not end with a semicolon",
15330- self.peek_token().span.start
15331- )?;
15327+ loop {
15328+ let next_token = self.peek_token_no_skip();
15329+ match next_token.token {
15330+ Token::EOF => break,
15331+ Token::Whitespace(ref w) => match w {
15332+ Whitespace::Newline => break,
15333+ Whitespace::SingleLineComment { comment, prefix: _ } => {
15334+ if comment.ends_with('\n') {
15335+ break;
15336+ }
15337+ _ = self.next_token_no_skip();
15338+ }
15339+ _ => _ = self.next_token_no_skip(),
15340+ },
15341+ _ => {
15342+ parser_err!(
15343+ "GO must be followed by a newline or EOF",
15344+ self.peek_token().span.start
15345+ )?;
15346+ }
15347+ };
1533215348 }
1533315349
1533415350 Ok(Statement::Go(GoStatement { count }))
Original file line number Diff line number Diff line change @@ -2221,6 +2221,12 @@ fn parse_mssql_go_keyword() {
22212221 ms ( ) . statements_parse_to ( multi_line_comment_following, 2 , "USE some_database\n GO 42" ) ;
22222222 assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: Some ( 42 ) } ) ) ;
22232223
2224+ let cte_following_go =
2225+ "USE some_database;\n GO\n ;WITH cte AS (\n SELECT 1 x\n )\n SELECT * FROM cte;" ;
2226+ let stmts = ms ( ) . parse_sql_statements ( cte_following_go) . unwrap ( ) ;
2227+ assert_eq ! ( stmts. len( ) , 3 ) ;
2228+ assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: None } ) ) ;
2229+
22242230 let actually_column_alias = "SELECT NULL GO" ;
22252231 let stmt = ms ( ) . one_statement_parses_to ( actually_column_alias, "SELECT NULL AS GO" ) ;
22262232 match & stmt {
@@ -2250,6 +2256,13 @@ fn parse_mssql_go_keyword() {
22502256 err. unwrap_err( ) . to_string( ) ,
22512257 "sql parser error: Expected: literal int or newline, found: x"
22522258 ) ;
2259+
2260+ let invalid_go_delimiter = "SELECT 1\n GO;" ;
2261+ let err = ms ( ) . parse_sql_statements ( invalid_go_delimiter) ;
2262+ assert_eq ! (
2263+ err. unwrap_err( ) . to_string( ) ,
2264+ "sql parser error: Expected: literal int or newline, found: ;"
2265+ ) ;
22532266}
22542267
22552268#[ test]
You can’t perform that action at this time.
0 commit comments