Skip to content

Commit dae3d39

Browse files
authored
squawk_parser: fix parsing paren_select in materialized view (#651)
rel: #646
1 parent 39dff36 commit dae3d39

File tree

4 files changed

+104
-9
lines changed

4 files changed

+104
-9
lines changed

Cargo.lock

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/squawk_parser/src/grammar.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8674,7 +8674,7 @@ fn create_materialized_view(p: &mut Parser<'_>) -> CompletedMarker {
86748674
// A SELECT, TABLE, or VALUES command.
86758675
let statement = stmt(p, &StmtRestrictions::default());
86768676
match statement.map(|x| x.kind()) {
8677-
Some(SELECT | SELECT_INTO | COMPOUND_SELECT | TABLE | VALUES) => (),
8677+
Some(SELECT | SELECT_INTO | COMPOUND_SELECT | PAREN_SELECT | TABLE | VALUES) => (),
86788678
Some(kind) => {
86798679
p.error(format!(
86808680
"expected SELECT, TABLE, or VALUES statement, got {kind:?}"

crates/squawk_parser/tests/data/ok/create_materialized_view.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,9 @@ create materialized view t
1919
create materialized view t
2020
as values (1), (2, 2);
2121

22+
-- https://github.com/sbdchd/squawk/issues/646
23+
CREATE MATERIALIZED VIEW "public"."user_countries_view"
24+
AS (
25+
select distinct "client_id", "address"->>'country' as "country"
26+
from "users" where "users"."address"->>'country' IS NOT NULL
27+
);

crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,3 +202,92 @@ SOURCE_FILE
202202
R_PAREN ")"
203203
SEMICOLON ";"
204204
WHITESPACE "\n\n"
205+
COMMENT "-- https://github.com/sbdchd/squawk/issues/646"
206+
WHITESPACE "\n"
207+
CREATE_MATERIALIZED_VIEW
208+
CREATE_KW "CREATE"
209+
WHITESPACE " "
210+
MATERIALIZED_KW "MATERIALIZED"
211+
WHITESPACE " "
212+
VIEW_KW "VIEW"
213+
WHITESPACE " "
214+
PATH
215+
PATH
216+
PATH_SEGMENT
217+
NAME_REF
218+
IDENT "\"public\""
219+
DOT "."
220+
PATH_SEGMENT
221+
NAME
222+
IDENT "\"user_countries_view\""
223+
WHITESPACE " \n"
224+
AS_KW "AS"
225+
WHITESPACE " "
226+
PAREN_SELECT
227+
L_PAREN "("
228+
WHITESPACE "\n "
229+
SELECT
230+
SELECT_CLAUSE
231+
SELECT_KW "select"
232+
WHITESPACE " "
233+
DISTINCT_CLAUSE
234+
DISTINCT_KW "distinct"
235+
WHITESPACE " "
236+
TARGET_LIST
237+
TARGET
238+
NAME_REF
239+
IDENT "\"client_id\""
240+
COMMA ","
241+
WHITESPACE " "
242+
TARGET
243+
BIN_EXPR
244+
NAME_REF
245+
IDENT "\"address\""
246+
CUSTOM_OP
247+
MINUS "-"
248+
R_ANGLE ">"
249+
R_ANGLE ">"
250+
LITERAL
251+
STRING "'country'"
252+
WHITESPACE " "
253+
AS_KW "as"
254+
WHITESPACE " "
255+
NAME
256+
IDENT "\"country\""
257+
WHITESPACE " \n "
258+
FROM_CLAUSE
259+
FROM_KW "from"
260+
WHITESPACE " "
261+
FROM_ITEM
262+
NAME_REF
263+
IDENT "\"users\""
264+
WHITESPACE " "
265+
WHERE_CLAUSE
266+
WHERE_KW "where"
267+
WHITESPACE " "
268+
BIN_EXPR
269+
BIN_EXPR
270+
FIELD_EXPR
271+
NAME_REF
272+
IDENT "\"users\""
273+
DOT "."
274+
NAME_REF
275+
IDENT "\"address\""
276+
CUSTOM_OP
277+
MINUS "-"
278+
R_ANGLE ">"
279+
R_ANGLE ">"
280+
LITERAL
281+
STRING "'country'"
282+
WHITESPACE " "
283+
IS_NOT
284+
IS_KW "IS"
285+
WHITESPACE " "
286+
NOT_KW "NOT"
287+
WHITESPACE " "
288+
LITERAL
289+
NULL_KW "NULL"
290+
WHITESPACE "\n"
291+
R_PAREN ")"
292+
SEMICOLON ";"
293+
WHITESPACE "\n"

0 commit comments

Comments
 (0)