Skip to content

Commit 1b7007c

Browse files
committed
Fix GO failing to find following newline
1 parent b5c523f commit 1b7007c

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
@@ -15163,11 +15163,27 @@ impl<'a> Parser<'a> {
1516315163
};
1516415164
};
1516515165

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+
};
1517115187
}
1517215188

1517315189
Ok(Statement::Go(GoStatement { count }))

tests/sqlparser_mssql.rs

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

2138+
let cte_following_go =
2139+
"USE some_database;\nGO\n;WITH cte AS (\nSELECT 1 x\n)\nSELECT * 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+
21382144
let actually_column_alias = "SELECT NULL GO";
21392145
let stmt = ms().one_statement_parses_to(actually_column_alias, "SELECT NULL AS GO");
21402146
match &stmt {
@@ -2164,6 +2170,13 @@ fn parse_mssql_go_keyword() {
21642170
err.unwrap_err().to_string(),
21652171
"sql parser error: Expected: literal int or newline, found: x"
21662172
);
2173+
2174+
let invalid_go_delimiter = "SELECT 1\nGO;";
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+
);
21672180
}
21682181

21692182
#[test]

0 commit comments

Comments
 (0)