Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 (#468).

## v2.3.0 - 2025-05-13

### Fixed
Expand Down
6 changes: 2 additions & 4 deletions crates/squawk_parser/src/grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2709,10 +2709,8 @@ 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);
// 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);
}
JSON_TABLE_KW => {
Expand Down
Original file line number Diff line number Diff line change
@@ -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"
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
141 changes: 72 additions & 69 deletions crates/squawk_parser/src/snapshots/squawk_parser__test__merge_ok.snap
Original file line number Diff line number Diff line change
Expand Up @@ -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 " "
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down
Loading
Loading