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
11 changes: 6 additions & 5 deletions crates/squawk_parser/src/grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12318,7 +12318,7 @@ fn create_view(p: &mut Parser<'_>) -> CompletedMarker {
p.expect(AS_KW);
match stmt(p, &StmtRestrictions::default()) {
Some(statement) => match statement.kind() {
SELECT | COMPOUND_SELECT | SELECT_INTO | VALUES | TABLE => (),
SELECT | COMPOUND_SELECT | SELECT_INTO | VALUES | TABLE | PAREN_SELECT => (),
kind => p.error(format!("expected SELECT, got {kind:?}")),
},
None => p.error("expected SELECT"),
Expand Down Expand Up @@ -12548,7 +12548,7 @@ fn declare(p: &mut Parser<'_>) -> CompletedMarker {
// select stmt
let statement = stmt(p, &StmtRestrictions::default());
match statement.map(|x| x.kind()) {
Some(SELECT | SELECT_INTO | COMPOUND_SELECT | TABLE | VALUES) => (),
Some(SELECT | SELECT_INTO | COMPOUND_SELECT | TABLE | VALUES | PAREN_SELECT) => (),
Some(kind) => {
p.error(format!(
"expected SELECT, TABLE, or VALUES statement, got {kind:?}",
Expand Down Expand Up @@ -13461,7 +13461,10 @@ fn insert(p: &mut Parser<'_>, m: Option<Marker>, semi_allowed: bool) -> Complete
path_name_ref(p);
opt_as_alias_with_as(p);
// [ ( column_name [, ...] ) ]
opt_column_ref_list(p);
// a leading `(` may open a parenthesized query instead of a column list
if !(p.at(L_PAREN) && p.nth_at_ts(1, SELECT_FIRST)) {
opt_column_ref_list(p);
}
// [ OVERRIDING { SYSTEM | USER } VALUE ]
if p.eat(OVERRIDING_KW) {
let _ = p.eat(SYSTEM_KW) || p.expect(USER_KW);
Expand All @@ -13470,8 +13473,6 @@ fn insert(p: &mut Parser<'_>, m: Option<Marker>, semi_allowed: bool) -> Complete
// { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
if p.eat(DEFAULT_KW) {
p.expect(VALUES_KW);
} else if p.at(VALUES_KW) {
values(p, None, false);
} else {
query(p);
}
Expand Down
10 changes: 10 additions & 0 deletions crates/squawk_parser/tests/data/ok/create_view.sql
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,13 @@ with local check option;
-- regression test
create or replace view my_view as
select x from foo;

-- parenthesized / compound queries
create view v as (select 1);
create view v as (values (1));
create view v as (select 1 union select 2);
create view v as (values (1, 2) union values (3, 4));
create view v as (table t);
create view v as (select 1 order by 1);
create view v as ((select 1));
create view v as (with x as (select 1) select * from x);
5 changes: 5 additions & 0 deletions crates/squawk_parser/tests/data/ok/declare.sql
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,8 @@ cursor

declare c cursor for select 1;

-- parenthesized / compound queries
declare c cursor for (select 1);
declare c cursor for (values (1) union values (2));
declare c cursor for ((select 1));

8 changes: 8 additions & 0 deletions crates/squawk_parser/tests/data/ok/insert.sql
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,11 @@ on conflict
-- on conflict do select
INSERT INTO t (a) VALUES (1)
ON CONFLICT (a) DO SELECT FOR UPDATE WHERE a > 0 RETURNING *;

-- parenthesized / compound query sources
insert into t (values (1));
insert into t (values (1) union values (2));
insert into t values (1) union values (2);
insert into t (select 1);
insert into t (select 1 union select 2);
insert into t select 1 union select 2;
276 changes: 276 additions & 0 deletions crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap
Original file line number Diff line number Diff line change
Expand Up @@ -571,4 +571,280 @@ SOURCE_FILE
NAME_REF
IDENT "foo"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- parenthesized / compound queries"
WHITESPACE "\n"
CREATE_VIEW
CREATE_KW "create"
WHITESPACE " "
VIEW_KW "view"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "v"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
CREATE_VIEW
CREATE_KW "create"
WHITESPACE " "
VIEW_KW "view"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "v"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
VALUES
VALUES_KW "values"
WHITESPACE " "
ROW_LIST
ROW
L_PAREN "("
LITERAL
INT_NUMBER "1"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
CREATE_VIEW
CREATE_KW "create"
WHITESPACE " "
VIEW_KW "view"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "v"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
COMPOUND_SELECT
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
UNION_KW "union"
WHITESPACE " "
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "2"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
CREATE_VIEW
CREATE_KW "create"
WHITESPACE " "
VIEW_KW "view"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "v"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
COMPOUND_SELECT
VALUES
VALUES_KW "values"
WHITESPACE " "
ROW_LIST
ROW
L_PAREN "("
LITERAL
INT_NUMBER "1"
COMMA ","
WHITESPACE " "
LITERAL
INT_NUMBER "2"
R_PAREN ")"
WHITESPACE " "
UNION_KW "union"
WHITESPACE " "
VALUES
VALUES_KW "values"
WHITESPACE " "
ROW_LIST
ROW
L_PAREN "("
LITERAL
INT_NUMBER "3"
COMMA ","
WHITESPACE " "
LITERAL
INT_NUMBER "4"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
CREATE_VIEW
CREATE_KW "create"
WHITESPACE " "
VIEW_KW "view"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "v"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
TABLE
TABLE_KW "table"
WHITESPACE " "
RELATION_NAME
PATH
PATH_SEGMENT
NAME_REF
IDENT "t"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
CREATE_VIEW
CREATE_KW "create"
WHITESPACE " "
VIEW_KW "view"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "v"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
WHITESPACE " "
ORDER_BY_CLAUSE
ORDER_KW "order"
WHITESPACE " "
BY_KW "by"
WHITESPACE " "
SORT_BY_LIST
SORT_BY
LITERAL
INT_NUMBER "1"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
CREATE_VIEW
CREATE_KW "create"
WHITESPACE " "
VIEW_KW "view"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "v"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
PAREN_SELECT
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
R_PAREN ")"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
CREATE_VIEW
CREATE_KW "create"
WHITESPACE " "
VIEW_KW "view"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "v"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
PAREN_SELECT
L_PAREN "("
SELECT
WITH_CLAUSE
WITH_KW "with"
WHITESPACE " "
WITH_TABLE
NAME
IDENT "x"
WHITESPACE " "
AS_KW "as"
WHITESPACE " "
L_PAREN "("
SELECT
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
LITERAL
INT_NUMBER "1"
R_PAREN ")"
WHITESPACE " "
SELECT_CLAUSE
SELECT_KW "select"
WHITESPACE " "
TARGET_LIST
TARGET
STAR "*"
WHITESPACE " "
FROM_CLAUSE
FROM_KW "from"
WHITESPACE " "
FROM_ITEM
NAME_REF
IDENT "x"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
Loading
Loading