From 147de1c4e58adf132fdbf38887655a3113a846b0 Mon Sep 17 00:00:00 2001 From: Christopher Dignam Date: Tue, 13 May 2025 08:44:34 -0400 Subject: [PATCH 1/4] fix parsing `create view` with nested parens fixes #467 --- CHANGELOG.md | 4 + crates/squawk_parser/src/grammar.rs | 5 +- ...er__test__create_view_extra_parens_ok.snap | 73 ++++++ .../squawk_parser__test__delete_ok.snap | 75 +++--- .../squawk_parser__test__merge_ok.snap | 141 +++++----- .../squawk_parser__test__merge_pg17_ok.snap | 39 +-- .../squawk_parser__test__misc_ok.snap | 102 ++++---- .../squawk_parser__test__select_ok.snap | 243 +++++++++--------- .../squawk_parser__test__values_ok.snap | 98 +++---- .../test_data/ok/create_view_extra_parens.sql | 3 + 10 files changed, 439 insertions(+), 344 deletions(-) create mode 100644 crates/squawk_parser/src/snapshots/squawk_parser__test__create_view_extra_parens_ok.snap create mode 100644 crates/squawk_parser/test_data/ok/create_view_extra_parens.sql diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f40567b..d2d02281 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Fixed parsing `create view` with nested parens. + ## v2.2.0 - 2025-05-12 ### Added diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index df7f441c..f89b7445 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -2709,10 +2709,7 @@ fn data_source(p: &mut Parser<'_>) { p.eat(LATERAL_KW); match p.current() { L_PAREN => { - p.bump(L_PAREN); - // we're at the start of a nested select statement - select_stmt(p, None); - p.expect(R_PAREN); + tuple_expr(p); opt_alias(p); } JSON_TABLE_KW => { diff --git a/crates/squawk_parser/src/snapshots/squawk_parser__test__create_view_extra_parens_ok.snap b/crates/squawk_parser/src/snapshots/squawk_parser__test__create_view_extra_parens_ok.snap new file mode 100644 index 00000000..4ef4e894 --- /dev/null +++ b/crates/squawk_parser/src/snapshots/squawk_parser__test__create_view_extra_parens_ok.snap @@ -0,0 +1,73 @@ +--- +source: crates/squawk_parser/src/test.rs +input_file: crates/squawk_parser/test_data/ok/create_view_extra_parens.sql +--- +SOURCE_FILE + CREATE_VIEW_STMT + CREATE_KW "create" + WHITESPACE " " + VIEW_KW "view" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "foo" + WHITESPACE " " + AS_KW "as" + WHITESPACE " \n " + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + FIELD_EXPR + NAME_REF + IDENT "b" + DOT "." + NAME_REF + IDENT "y" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + PAREN_EXPR + L_PAREN "(" + PAREN_EXPR + L_PAREN "(" + WHITESPACE " " + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "y" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + NAME_REF + IDENT "bar" + WHITESPACE " " + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME + IDENT "b" + WHITESPACE "\n " + ORDER_BY_CLAUSE + ORDER_KW "order" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + NAME_REF + IDENT "y" + WHITESPACE " " + DESC_KW "desc" + SEMICOLON ";" + WHITESPACE "\n" diff --git a/crates/squawk_parser/src/snapshots/squawk_parser__test__delete_ok.snap b/crates/squawk_parser/src/snapshots/squawk_parser__test__delete_ok.snap index 8ba6168c..e4a0dc86 100644 --- a/crates/squawk_parser/src/snapshots/squawk_parser__test__delete_ok.snap +++ b/crates/squawk_parser/src/snapshots/squawk_parser__test__delete_ok.snap @@ -254,46 +254,47 @@ SOURCE_FILE IDENT "u" COMMA "," WHITESPACE "\n " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "user_id" - COMMA "," + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " - TARGET - CALL_EXPR + TARGET_LIST + TARGET NAME_REF - IDENT "max" - ARG_LIST - L_PAREN "(" - NAME_REF - IDENT "login_time" - R_PAREN ")" + IDENT "user_id" + COMMA "," WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "last_login" - WHITESPACE "\n " - FROM_CLAUSE - FROM_KW "from" - WHITESPACE " " - NAME_REF - IDENT "login_history" - WHITESPACE "\n " - GROUP_BY_CLAUSE - GROUP_KW "group" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - NAME_REF - IDENT "user_id" - R_PAREN ")" + TARGET + CALL_EXPR + NAME_REF + IDENT "max" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "login_time" + R_PAREN ")" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "last_login" + WHITESPACE "\n " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + NAME_REF + IDENT "login_history" + WHITESPACE "\n " + GROUP_BY_CLAUSE + GROUP_KW "group" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + NAME_REF + IDENT "user_id" + R_PAREN ")" WHITESPACE " " ALIAS NAME diff --git a/crates/squawk_parser/src/snapshots/squawk_parser__test__merge_ok.snap b/crates/squawk_parser/src/snapshots/squawk_parser__test__merge_ok.snap index e308900c..46644340 100644 --- a/crates/squawk_parser/src/snapshots/squawk_parser__test__merge_ok.snap +++ b/crates/squawk_parser/src/snapshots/squawk_parser__test__merge_ok.snap @@ -334,22 +334,23 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "id" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "from" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "id" WHITESPACE " " - NAME_REF - IDENT "bar" - R_PAREN ")" + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + NAME_REF + IDENT "bar" + R_PAREN ")" WHITESPACE "\n " ON_KW "on" WHITESPACE " " @@ -396,53 +397,54 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "id" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "from" - WHITESPACE " " - NAME_REF - IDENT "bar" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "id" WHITESPACE " " - JOIN - JOIN_KW "join" + FROM_CLAUSE + FROM_KW "from" WHITESPACE " " NAME_REF - IDENT "foo" + IDENT "bar" WHITESPACE " " - ALIAS - AS_KW "as" + JOIN + JOIN_KW "join" WHITESPACE " " - NAME - IDENT "f" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF + NAME_REF + IDENT "foo" + WHITESPACE " " + ALIAS + AS_KW "as" + WHITESPACE " " + NAME IDENT "f" - DOT "." - NAME_REF - IDENT "id" WHITESPACE " " - EQ "=" + ON_KW "on" WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "bar" - DOT "." - NAME_REF - IDENT "id" - R_PAREN ")" + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "f" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "bar" + DOT "." + NAME_REF + IDENT "id" + R_PAREN ")" WHITESPACE " " ALIAS AS_KW "as" @@ -495,22 +497,23 @@ SOURCE_FILE USING_CLAUSE USING_KW "using" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "id" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "from" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "id" WHITESPACE " " - NAME_REF - IDENT "bar" - R_PAREN ")" + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + NAME_REF + IDENT "bar" + R_PAREN ")" WHITESPACE " " ALIAS NAME diff --git a/crates/squawk_parser/src/snapshots/squawk_parser__test__merge_pg17_ok.snap b/crates/squawk_parser/src/snapshots/squawk_parser__test__merge_pg17_ok.snap index 38758be1..b1573330 100644 --- a/crates/squawk_parser/src/snapshots/squawk_parser__test__merge_pg17_ok.snap +++ b/crates/squawk_parser/src/snapshots/squawk_parser__test__merge_pg17_ok.snap @@ -1020,27 +1020,28 @@ SOURCE_FILE USING_CLAUSE USING_KW "USING" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "customer_id" - COMMA "," + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" WHITESPACE " " - TARGET - NAME_REF - IDENT "transaction_value" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "FROM" + TARGET_LIST + TARGET + NAME_REF + IDENT "customer_id" + COMMA "," + WHITESPACE " " + TARGET + NAME_REF + IDENT "transaction_value" WHITESPACE " " - NAME_REF - IDENT "recent_transactions" - R_PAREN ")" + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + NAME_REF + IDENT "recent_transactions" + R_PAREN ")" WHITESPACE " " ALIAS AS_KW "AS" diff --git a/crates/squawk_parser/src/snapshots/squawk_parser__test__misc_ok.snap b/crates/squawk_parser/src/snapshots/squawk_parser__test__misc_ok.snap index 9e346c43..02461ef2 100644 --- a/crates/squawk_parser/src/snapshots/squawk_parser__test__misc_ok.snap +++ b/crates/squawk_parser/src/snapshots/squawk_parser__test__misc_ok.snap @@ -5225,35 +5225,36 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - DISTINCT_CLAUSE - DISTINCT_KW "DISTINCT" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "user_id" - WHITESPACE " \n " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE " " - NAME_REF - IDENT "events" - WHITESPACE " \n " - ORDER_BY_CLAUSE - ORDER_KW "ORDER" - WHITESPACE " " - BY_KW "BY" - WHITESPACE " " - NAME_REF - TIMESTAMP_KW "timestamp" - WHITESPACE "\n" - R_PAREN ")" + PAREN_EXPR + L_PAREN "(" + WHITESPACE "\n " + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + DISTINCT_CLAUSE + DISTINCT_KW "DISTINCT" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "user_id" + WHITESPACE " \n " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + NAME_REF + IDENT "events" + WHITESPACE " \n " + ORDER_BY_CLAUSE + ORDER_KW "ORDER" + WHITESPACE " " + BY_KW "BY" + WHITESPACE " " + NAME_REF + TIMESTAMP_KW "timestamp" + WHITESPACE "\n" + R_PAREN ")" WHITESPACE " " ALIAS NAME @@ -5292,27 +5293,28 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - DISTINCT_CLAUSE - DISTINCT_KW "DISTINCT" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "user_id" - WHITESPACE " \n " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE " " - NAME_REF - IDENT "events" - WHITESPACE "\n" - R_PAREN ")" + PAREN_EXPR + L_PAREN "(" + WHITESPACE "\n " + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + DISTINCT_CLAUSE + DISTINCT_KW "DISTINCT" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "user_id" + WHITESPACE " \n " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + NAME_REF + IDENT "events" + WHITESPACE "\n" + R_PAREN ")" WHITESPACE " " ALIAS NAME diff --git a/crates/squawk_parser/src/snapshots/squawk_parser__test__select_ok.snap b/crates/squawk_parser/src/snapshots/squawk_parser__test__select_ok.snap index e6bd9f77..8bb81177 100644 --- a/crates/squawk_parser/src/snapshots/squawk_parser__test__select_ok.snap +++ b/crates/squawk_parser/src/snapshots/squawk_parser__test__select_ok.snap @@ -151,26 +151,27 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "2" - COMMA "," + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "3" - R_PAREN ")" + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "3" + R_PAREN ")" WHITESPACE " " ALIAS AS_KW "as" @@ -232,26 +233,27 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "2" - COMMA "," + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "3" - R_PAREN ")" + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "3" + R_PAREN ")" WHITESPACE " " ALIAS AS_KW "as" @@ -319,26 +321,27 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "2" - COMMA "," + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "3" - R_PAREN ")" + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "3" + R_PAREN ")" WHITESPACE " " ALIAS NAME @@ -1621,16 +1624,17 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" SELECT @@ -1646,16 +1650,17 @@ SOURCE_FILE WHITESPACE " " LATERAL_KW "lateral" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE " " ALIAS AS_KW "as" @@ -2554,16 +2559,17 @@ SOURCE_FILE WHITESPACE " " LATERAL_KW "lateral" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE " " ALIAS AS_KW "as" @@ -2599,16 +2605,17 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE " " ALIAS AS_KW "as" @@ -2644,16 +2651,17 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE " " ALIAS NAME @@ -2671,16 +2679,17 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "from" WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- lateral function_name" diff --git a/crates/squawk_parser/src/snapshots/squawk_parser__test__values_ok.snap b/crates/squawk_parser/src/snapshots/squawk_parser__test__values_ok.snap index 6460184b..a48e589a 100644 --- a/crates/squawk_parser/src/snapshots/squawk_parser__test__values_ok.snap +++ b/crates/squawk_parser/src/snapshots/squawk_parser__test__values_ok.snap @@ -195,28 +195,29 @@ SOURCE_FILE IDENT "f" COMMA "," WHITESPACE " " - L_PAREN "(" - SELECT - VALUES_KW "VALUES" - L_PAREN "(" - LITERAL - STRING "'MGM'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Horror'" - R_PAREN ")" - COMMA "," - WHITESPACE " " + PAREN_EXPR L_PAREN "(" - LITERAL - STRING "'UA'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Sci-Fi'" + SELECT + VALUES_KW "VALUES" + L_PAREN "(" + LITERAL + STRING "'MGM'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Horror'" + R_PAREN ")" + COMMA "," + WHITESPACE " " + L_PAREN "(" + LITERAL + STRING "'UA'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Sci-Fi'" + R_PAREN ")" R_PAREN ")" - R_PAREN ")" WHITESPACE " " ALIAS AS_KW "AS" @@ -310,36 +311,37 @@ SOURCE_FILE FROM_CLAUSE FROM_KW "FROM" WHITESPACE " " - L_PAREN "(" - SELECT - VALUES_KW "VALUES" + PAREN_EXPR L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "200000" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "1.2" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "400000" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "1.4" + SELECT + VALUES_KW "VALUES" + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "200000" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "1.2" + R_PAREN ")" + COMMA "," + WHITESPACE " " + L_PAREN "(" + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "400000" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "1.4" + R_PAREN ")" R_PAREN ")" - R_PAREN ")" WHITESPACE " " ALIAS AS_KW "AS" diff --git a/crates/squawk_parser/test_data/ok/create_view_extra_parens.sql b/crates/squawk_parser/test_data/ok/create_view_extra_parens.sql new file mode 100644 index 00000000..881adcc2 --- /dev/null +++ b/crates/squawk_parser/test_data/ok/create_view_extra_parens.sql @@ -0,0 +1,3 @@ +create view foo as + select b.y from (( select y from bar )) as b + order by y desc; From 78d54284baa3a6255c24e387752ca53f34351491 Mon Sep 17 00:00:00 2001 From: Christopher Dignam Date: Tue, 13 May 2025 08:44:52 -0400 Subject: [PATCH 2/4] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2d02281..46a23cd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Fixed parsing `create view` with nested parens. +- Fixed parsing `create view` with nested parens (#468). ## v2.2.0 - 2025-05-12 From ab419fb40c6c49ff372d4bb3ed7bd22781f3cc2e Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Tue, 13 May 2025 20:48:26 -0400 Subject: [PATCH 3/4] Update crates/squawk_parser/src/grammar.rs --- crates/squawk_parser/src/grammar.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 38c8552a..60257554 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -2709,6 +2709,7 @@ fn data_source(p: &mut Parser<'_>) { p.eat(LATERAL_KW); match p.current() { L_PAREN => { + // TODO: this should be `paren_select` instead of a general `tuple_expr`, since only a select statement is allowed inside tuple_expr(p); opt_alias(p); } From 59d6d5cbce2e58557d42328daed2f5cdf914476f Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Tue, 13 May 2025 21:47:57 -0400 Subject: [PATCH 4/4] fix --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ce336ce..85d86c91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - ### Fixed - Fixed parsing `create view` with nested parens (#468).