Skip to content

Commit 1c01035

Browse files
committed
Fix GO failing to find following newline
1 parent 827dfe7 commit 1c01035

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

src/parser/mod.rs

+21-5
Original file line numberDiff line numberDiff 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 }))

tests/sqlparser_mssql.rs

+13
Original file line numberDiff line numberDiff line change
@@ -2221,6 +2221,12 @@ fn parse_mssql_go_keyword() {
22212221
ms().statements_parse_to(multi_line_comment_following, 2, "USE some_database\nGO 42");
22222222
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(42) }));
22232223

2224+
let cte_following_go =
2225+
"USE some_database;\nGO\n;WITH cte AS (\nSELECT 1 x\n)\nSELECT * 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\nGO;";
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]

0 commit comments

Comments
 (0)