File tree 2 files changed +34
-5
lines changed
2 files changed +34
-5
lines changed Original file line number Diff line number Diff line change @@ -15163,11 +15163,27 @@ impl<'a> Parser<'a> {
15163
15163
};
15164
15164
};
15165
15165
15166
- if self.peek_token().token == Token::SemiColon {
15167
- parser_err!(
15168
- "GO may not end with a semicolon",
15169
- self.peek_token().span.start
15170
- )?;
15166
+ loop {
15167
+ let next_token = self.peek_token_no_skip();
15168
+ match next_token.token {
15169
+ Token::EOF => break,
15170
+ Token::Whitespace(ref w) => match w {
15171
+ Whitespace::Newline => break,
15172
+ Whitespace::SingleLineComment { comment, prefix: _ } => {
15173
+ if comment.ends_with('\n') {
15174
+ break;
15175
+ }
15176
+ _ = self.next_token_no_skip();
15177
+ }
15178
+ _ => _ = self.next_token_no_skip(),
15179
+ },
15180
+ _ => {
15181
+ parser_err!(
15182
+ "GO must be followed by a newline or EOF",
15183
+ self.peek_token().span.start
15184
+ )?;
15185
+ }
15186
+ };
15171
15187
}
15172
15188
15173
15189
Ok(Statement::Go(GoStatement { count }))
Original file line number Diff line number Diff line change @@ -2135,6 +2135,12 @@ fn parse_mssql_go_keyword() {
2135
2135
ms ( ) . statements_parse_to ( multi_line_comment_following, 2 , "USE some_database\n GO 42" ) ;
2136
2136
assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: Some ( 42 ) } ) ) ;
2137
2137
2138
+ let cte_following_go =
2139
+ "USE some_database;\n GO\n ;WITH cte AS (\n SELECT 1 x\n )\n SELECT * FROM cte;" ;
2140
+ let stmts = ms ( ) . parse_sql_statements ( cte_following_go) . unwrap ( ) ;
2141
+ assert_eq ! ( stmts. len( ) , 3 ) ;
2142
+ assert_eq ! ( stmts[ 1 ] , Statement :: Go ( GoStatement { count: None } ) ) ;
2143
+
2138
2144
let actually_column_alias = "SELECT NULL GO" ;
2139
2145
let stmt = ms ( ) . one_statement_parses_to ( actually_column_alias, "SELECT NULL AS GO" ) ;
2140
2146
match & stmt {
@@ -2164,6 +2170,13 @@ fn parse_mssql_go_keyword() {
2164
2170
err. unwrap_err( ) . to_string( ) ,
2165
2171
"sql parser error: Expected: literal int or newline, found: x"
2166
2172
) ;
2173
+
2174
+ let invalid_go_delimiter = "SELECT 1\n GO;" ;
2175
+ let err = ms ( ) . parse_sql_statements ( invalid_go_delimiter) ;
2176
+ assert_eq ! (
2177
+ err. unwrap_err( ) . to_string( ) ,
2178
+ "sql parser error: Expected: literal int or newline, found: ;"
2179
+ ) ;
2167
2180
}
2168
2181
2169
2182
#[ test]
You can’t perform that action at this time.
0 commit comments