Skip to content

Commit 3a13158

Browse files
committed
Fix GO failing to find following newline
1 parent 73d7589 commit 3a13158

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

src/parser/mod.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff 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 }))

tests/sqlparser_mssql.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2571,6 +2571,12 @@ fn parse_mssql_go_keyword() {
25712571
ms().statements_parse_to(multi_line_comment_following, 2, "USE some_database\nGO 42");
25722572
assert_eq!(stmts[1], Statement::Go(GoStatement { count: Some(42) }));
25732573

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

0 commit comments

Comments
 (0)