Skip to content

Commit 27d8ced

Browse files
authored
fix parsing create view with nested parens (#468)
fixes #467
1 parent 0f7e2e5 commit 27d8ced

10 files changed

+440
-344
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- Fixed parsing `create view` with nested parens (#468).
13+
1014
## v2.3.0 - 2025-05-13
1115

1216
### Fixed

crates/squawk_parser/src/grammar.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2709,10 +2709,8 @@ fn data_source(p: &mut Parser<'_>) {
27092709
p.eat(LATERAL_KW);
27102710
match p.current() {
27112711
L_PAREN => {
2712-
p.bump(L_PAREN);
2713-
// we're at the start of a nested select statement
2714-
select_stmt(p, None);
2715-
p.expect(R_PAREN);
2712+
// TODO: this should be `paren_select` instead of a general `tuple_expr`, since only a select statement is allowed inside
2713+
tuple_expr(p);
27162714
opt_alias(p);
27172715
}
27182716
JSON_TABLE_KW => {
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
---
2+
source: crates/squawk_parser/src/test.rs
3+
input_file: crates/squawk_parser/test_data/ok/create_view_extra_parens.sql
4+
---
5+
SOURCE_FILE
6+
CREATE_VIEW_STMT
7+
CREATE_KW "create"
8+
WHITESPACE " "
9+
VIEW_KW "view"
10+
WHITESPACE " "
11+
PATH
12+
PATH_SEGMENT
13+
NAME
14+
IDENT "foo"
15+
WHITESPACE " "
16+
AS_KW "as"
17+
WHITESPACE " \n "
18+
SELECT
19+
SELECT_CLAUSE
20+
SELECT_KW "select"
21+
WHITESPACE " "
22+
TARGET_LIST
23+
TARGET
24+
FIELD_EXPR
25+
NAME_REF
26+
IDENT "b"
27+
DOT "."
28+
NAME_REF
29+
IDENT "y"
30+
WHITESPACE " "
31+
FROM_CLAUSE
32+
FROM_KW "from"
33+
WHITESPACE " "
34+
PAREN_EXPR
35+
L_PAREN "("
36+
PAREN_EXPR
37+
L_PAREN "("
38+
WHITESPACE " "
39+
SELECT
40+
SELECT_CLAUSE
41+
SELECT_KW "select"
42+
WHITESPACE " "
43+
TARGET_LIST
44+
TARGET
45+
NAME_REF
46+
IDENT "y"
47+
WHITESPACE " "
48+
FROM_CLAUSE
49+
FROM_KW "from"
50+
WHITESPACE " "
51+
NAME_REF
52+
IDENT "bar"
53+
WHITESPACE " "
54+
R_PAREN ")"
55+
R_PAREN ")"
56+
WHITESPACE " "
57+
ALIAS
58+
AS_KW "as"
59+
WHITESPACE " "
60+
NAME
61+
IDENT "b"
62+
WHITESPACE "\n "
63+
ORDER_BY_CLAUSE
64+
ORDER_KW "order"
65+
WHITESPACE " "
66+
BY_KW "by"
67+
WHITESPACE " "
68+
NAME_REF
69+
IDENT "y"
70+
WHITESPACE " "
71+
DESC_KW "desc"
72+
SEMICOLON ";"
73+
WHITESPACE "\n"

crates/squawk_parser/src/snapshots/squawk_parser__test__delete_ok.snap

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -254,46 +254,47 @@ SOURCE_FILE
254254
IDENT "u"
255255
COMMA ","
256256
WHITESPACE "\n "
257-
L_PAREN "("
258-
SELECT
259-
SELECT_CLAUSE
260-
SELECT_KW "select"
261-
WHITESPACE " "
262-
TARGET_LIST
263-
TARGET
264-
NAME_REF
265-
IDENT "user_id"
266-
COMMA ","
257+
PAREN_EXPR
258+
L_PAREN "("
259+
SELECT
260+
SELECT_CLAUSE
261+
SELECT_KW "select"
267262
WHITESPACE " "
268-
TARGET
269-
CALL_EXPR
263+
TARGET_LIST
264+
TARGET
270265
NAME_REF
271-
IDENT "max"
272-
ARG_LIST
273-
L_PAREN "("
274-
NAME_REF
275-
IDENT "login_time"
276-
R_PAREN ")"
266+
IDENT "user_id"
267+
COMMA ","
277268
WHITESPACE " "
278-
AS_KW "as"
279-
WHITESPACE " "
280-
NAME
281-
IDENT "last_login"
282-
WHITESPACE "\n "
283-
FROM_CLAUSE
284-
FROM_KW "from"
285-
WHITESPACE " "
286-
NAME_REF
287-
IDENT "login_history"
288-
WHITESPACE "\n "
289-
GROUP_BY_CLAUSE
290-
GROUP_KW "group"
291-
WHITESPACE " "
292-
BY_KW "by"
293-
WHITESPACE " "
294-
NAME_REF
295-
IDENT "user_id"
296-
R_PAREN ")"
269+
TARGET
270+
CALL_EXPR
271+
NAME_REF
272+
IDENT "max"
273+
ARG_LIST
274+
L_PAREN "("
275+
NAME_REF
276+
IDENT "login_time"
277+
R_PAREN ")"
278+
WHITESPACE " "
279+
AS_KW "as"
280+
WHITESPACE " "
281+
NAME
282+
IDENT "last_login"
283+
WHITESPACE "\n "
284+
FROM_CLAUSE
285+
FROM_KW "from"
286+
WHITESPACE " "
287+
NAME_REF
288+
IDENT "login_history"
289+
WHITESPACE "\n "
290+
GROUP_BY_CLAUSE
291+
GROUP_KW "group"
292+
WHITESPACE " "
293+
BY_KW "by"
294+
WHITESPACE " "
295+
NAME_REF
296+
IDENT "user_id"
297+
R_PAREN ")"
297298
WHITESPACE " "
298299
ALIAS
299300
NAME

crates/squawk_parser/src/snapshots/squawk_parser__test__merge_ok.snap

Lines changed: 72 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -334,22 +334,23 @@ SOURCE_FILE
334334
USING_CLAUSE
335335
USING_KW "using"
336336
WHITESPACE " "
337-
L_PAREN "("
338-
SELECT
339-
SELECT_CLAUSE
340-
SELECT_KW "select"
341-
WHITESPACE " "
342-
TARGET_LIST
343-
TARGET
344-
NAME_REF
345-
IDENT "id"
346-
WHITESPACE " "
347-
FROM_CLAUSE
348-
FROM_KW "from"
337+
PAREN_EXPR
338+
L_PAREN "("
339+
SELECT
340+
SELECT_CLAUSE
341+
SELECT_KW "select"
342+
WHITESPACE " "
343+
TARGET_LIST
344+
TARGET
345+
NAME_REF
346+
IDENT "id"
349347
WHITESPACE " "
350-
NAME_REF
351-
IDENT "bar"
352-
R_PAREN ")"
348+
FROM_CLAUSE
349+
FROM_KW "from"
350+
WHITESPACE " "
351+
NAME_REF
352+
IDENT "bar"
353+
R_PAREN ")"
353354
WHITESPACE "\n "
354355
ON_KW "on"
355356
WHITESPACE " "
@@ -396,53 +397,54 @@ SOURCE_FILE
396397
USING_CLAUSE
397398
USING_KW "using"
398399
WHITESPACE " "
399-
L_PAREN "("
400-
SELECT
401-
SELECT_CLAUSE
402-
SELECT_KW "select"
403-
WHITESPACE " "
404-
TARGET_LIST
405-
TARGET
406-
NAME_REF
407-
IDENT "id"
408-
WHITESPACE " "
409-
FROM_CLAUSE
410-
FROM_KW "from"
411-
WHITESPACE " "
412-
NAME_REF
413-
IDENT "bar"
400+
PAREN_EXPR
401+
L_PAREN "("
402+
SELECT
403+
SELECT_CLAUSE
404+
SELECT_KW "select"
405+
WHITESPACE " "
406+
TARGET_LIST
407+
TARGET
408+
NAME_REF
409+
IDENT "id"
414410
WHITESPACE " "
415-
JOIN
416-
JOIN_KW "join"
411+
FROM_CLAUSE
412+
FROM_KW "from"
417413
WHITESPACE " "
418414
NAME_REF
419-
IDENT "foo"
415+
IDENT "bar"
420416
WHITESPACE " "
421-
ALIAS
422-
AS_KW "as"
417+
JOIN
418+
JOIN_KW "join"
423419
WHITESPACE " "
424-
NAME
425-
IDENT "f"
426-
WHITESPACE " "
427-
ON_KW "on"
428-
WHITESPACE " "
429-
BIN_EXPR
430-
FIELD_EXPR
431-
NAME_REF
420+
NAME_REF
421+
IDENT "foo"
422+
WHITESPACE " "
423+
ALIAS
424+
AS_KW "as"
425+
WHITESPACE " "
426+
NAME
432427
IDENT "f"
433-
DOT "."
434-
NAME_REF
435-
IDENT "id"
436428
WHITESPACE " "
437-
EQ "="
429+
ON_KW "on"
438430
WHITESPACE " "
439-
FIELD_EXPR
440-
NAME_REF
441-
IDENT "bar"
442-
DOT "."
443-
NAME_REF
444-
IDENT "id"
445-
R_PAREN ")"
431+
BIN_EXPR
432+
FIELD_EXPR
433+
NAME_REF
434+
IDENT "f"
435+
DOT "."
436+
NAME_REF
437+
IDENT "id"
438+
WHITESPACE " "
439+
EQ "="
440+
WHITESPACE " "
441+
FIELD_EXPR
442+
NAME_REF
443+
IDENT "bar"
444+
DOT "."
445+
NAME_REF
446+
IDENT "id"
447+
R_PAREN ")"
446448
WHITESPACE " "
447449
ALIAS
448450
AS_KW "as"
@@ -495,22 +497,23 @@ SOURCE_FILE
495497
USING_CLAUSE
496498
USING_KW "using"
497499
WHITESPACE " "
498-
L_PAREN "("
499-
SELECT
500-
SELECT_CLAUSE
501-
SELECT_KW "select"
502-
WHITESPACE " "
503-
TARGET_LIST
504-
TARGET
505-
NAME_REF
506-
IDENT "id"
507-
WHITESPACE " "
508-
FROM_CLAUSE
509-
FROM_KW "from"
500+
PAREN_EXPR
501+
L_PAREN "("
502+
SELECT
503+
SELECT_CLAUSE
504+
SELECT_KW "select"
505+
WHITESPACE " "
506+
TARGET_LIST
507+
TARGET
508+
NAME_REF
509+
IDENT "id"
510510
WHITESPACE " "
511-
NAME_REF
512-
IDENT "bar"
513-
R_PAREN ")"
511+
FROM_CLAUSE
512+
FROM_KW "from"
513+
WHITESPACE " "
514+
NAME_REF
515+
IDENT "bar"
516+
R_PAREN ")"
514517
WHITESPACE " "
515518
ALIAS
516519
NAME

0 commit comments

Comments
 (0)