diff --git a/Cargo.lock b/Cargo.lock index 192859ae..e0c45040 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1861,7 +1861,7 @@ dependencies = [ [[package]] name = "squawk_github" -version = "2.25.0" +version = "2.25.1" dependencies = [ "jsonwebtoken", "log", @@ -1872,14 +1872,14 @@ dependencies = [ [[package]] name = "squawk_lexer" -version = "2.25.0" +version = "2.25.1" dependencies = [ "insta", ] [[package]] name = "squawk_linter" -version = "2.25.0" +version = "2.25.1" dependencies = [ "enum-iterator", "insta", @@ -1893,7 +1893,7 @@ dependencies = [ [[package]] name = "squawk_parser" -version = "2.25.0" +version = "2.25.1" dependencies = [ "camino", "dir-test", @@ -1906,7 +1906,7 @@ dependencies = [ [[package]] name = "squawk_server" -version = "2.25.0" +version = "2.25.1" dependencies = [ "anyhow", "insta", @@ -1924,7 +1924,7 @@ dependencies = [ [[package]] name = "squawk_syntax" -version = "2.25.0" +version = "2.25.1" dependencies = [ "camino", "dir-test", @@ -1936,7 +1936,7 @@ dependencies = [ [[package]] name = "squawk_wasm" -version = "2.25.0" +version = "2.25.1" dependencies = [ "console_error_panic_hook", "console_log", @@ -2800,7 +2800,7 @@ checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" [[package]] name = "xtask" -version = "2.25.0" +version = "2.25.1" dependencies = [ "anyhow", "camino", diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index c8ddb9d4..2d628137 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -8674,7 +8674,7 @@ fn create_materialized_view(p: &mut Parser<'_>) -> CompletedMarker { // A SELECT, TABLE, or VALUES command. 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 | PAREN_SELECT | TABLE | VALUES) => (), Some(kind) => { p.error(format!( "expected SELECT, TABLE, or VALUES statement, got {kind:?}" diff --git a/crates/squawk_parser/tests/data/ok/create_materialized_view.sql b/crates/squawk_parser/tests/data/ok/create_materialized_view.sql index 68738098..be7ba64d 100644 --- a/crates/squawk_parser/tests/data/ok/create_materialized_view.sql +++ b/crates/squawk_parser/tests/data/ok/create_materialized_view.sql @@ -19,3 +19,9 @@ create materialized view t create materialized view t as values (1), (2, 2); +-- https://github.com/sbdchd/squawk/issues/646 +CREATE MATERIALIZED VIEW "public"."user_countries_view" +AS ( + select distinct "client_id", "address"->>'country' as "country" + from "users" where "users"."address"->>'country' IS NOT NULL +); diff --git a/crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap index 9e6aa699..7c3c3dc5 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_materialized_view_ok.snap @@ -202,3 +202,92 @@ SOURCE_FILE R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" + COMMENT "-- https://github.com/sbdchd/squawk/issues/646" + WHITESPACE "\n" + CREATE_MATERIALIZED_VIEW + CREATE_KW "CREATE" + WHITESPACE " " + MATERIALIZED_KW "MATERIALIZED" + WHITESPACE " " + VIEW_KW "VIEW" + WHITESPACE " " + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "\"public\"" + DOT "." + PATH_SEGMENT + NAME + IDENT "\"user_countries_view\"" + WHITESPACE " \n" + AS_KW "AS" + WHITESPACE " " + PAREN_SELECT + L_PAREN "(" + WHITESPACE "\n " + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + DISTINCT_CLAUSE + DISTINCT_KW "distinct" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "\"client_id\"" + COMMA "," + WHITESPACE " " + TARGET + BIN_EXPR + NAME_REF + IDENT "\"address\"" + CUSTOM_OP + MINUS "-" + R_ANGLE ">" + R_ANGLE ">" + LITERAL + STRING "'country'" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "\"country\"" + WHITESPACE " \n " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "\"users\"" + WHITESPACE " " + WHERE_CLAUSE + WHERE_KW "where" + WHITESPACE " " + BIN_EXPR + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "\"users\"" + DOT "." + NAME_REF + IDENT "\"address\"" + CUSTOM_OP + MINUS "-" + R_ANGLE ">" + R_ANGLE ">" + LITERAL + STRING "'country'" + WHITESPACE " " + IS_NOT + IS_KW "IS" + WHITESPACE " " + NOT_KW "NOT" + WHITESPACE " " + LITERAL + NULL_KW "NULL" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n"