From 327b075d2049ec53fbae5b345fc9ae4018d50dcc Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Thu, 19 Jun 2025 14:55:21 -0400 Subject: [PATCH] parser: fix crash with trailing comma --- crates/squawk_parser/src/grammar.rs | 6 ++++- .../squawk_parser/tests/data/err/select.sql | 3 +++ .../tests/snapshots/tests__select_err.snap | 24 ++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 95a5b78a..c49bd0b2 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -4490,6 +4490,8 @@ const TARGET_FOLLOW: TokenSet = TokenSet::new(&[ R_PAREN, R_BRACK, RETURNING_KW, + SEMICOLON, + EOF, ]) .union(COMPOUND_SELECT_FIRST); @@ -4547,7 +4549,7 @@ fn opt_target_list(p: &mut Parser) -> Option { let m = p.start(); while !p.at(EOF) && !p.at(SEMICOLON) { if opt_target_el(p).is_some() { - if p.at(COMMA) && matches!(p.nth(1), SEMICOLON | EOF) { + if p.at(COMMA) && p.nth_at_ts(1, TARGET_FOLLOW) { p.err_and_bump("unexpected trailing comma"); break; } @@ -4564,6 +4566,8 @@ fn opt_target_list(p: &mut Parser) -> Option { break; } } + } else { + break; } } Some(m.complete(p, TARGET_LIST)) diff --git a/crates/squawk_parser/tests/data/err/select.sql b/crates/squawk_parser/tests/data/err/select.sql index a039f4cf..59736be4 100644 --- a/crates/squawk_parser/tests/data/err/select.sql +++ b/crates/squawk_parser/tests/data/err/select.sql @@ -29,5 +29,8 @@ select numeric 1234; -- warns about a missing semicolon select select; +-- extra comma +select a, from t; + -- trailing comma at EOF select 1, diff --git a/crates/squawk_parser/tests/snapshots/tests__select_err.snap b/crates/squawk_parser/tests/snapshots/tests__select_err.snap index 5cd7b14b..e104effd 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_err.snap @@ -223,6 +223,27 @@ SOURCE_FILE SELECT_KW "select" SEMICOLON ";" WHITESPACE "\n\n" + COMMENT "-- extra comma" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "a" + ERROR + COMMA "," + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t" + SEMICOLON ";" + WHITESPACE "\n\n" COMMENT "-- trailing comma at EOF" WHITESPACE "\n" SELECT @@ -248,4 +269,5 @@ ERROR@396: expected expression ERROR@397: expected expression ERROR@520: missing comma ERROR@646: expected SEMICOLON -ERROR@689: unexpected trailing comma +ERROR@679: unexpected trailing comma +ERROR@723: unexpected trailing comma