diff --git a/crates/squawk_linter/src/visitors.rs b/crates/squawk_linter/src/visitors.rs index 9860180a..584f5f59 100644 --- a/crates/squawk_linter/src/visitors.rs +++ b/crates/squawk_linter/src/visitors.rs @@ -42,8 +42,8 @@ pub(crate) fn check_not_allowed_types( for stmt in file.stmts() { match stmt { ast::Stmt::CreateTable(create_table) => { - if let Some(table_args) = create_table.table_args() { - for arg in table_args.args() { + if let Some(table_arg_list) = create_table.table_arg_list() { + for arg in table_arg_list.args() { if let ast::TableArg::Column(column) = arg { check_ty(ctx, column.ty()); } diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index fcc212fb..227a4a4a 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -625,12 +625,12 @@ pub enum SyntaxKind { COMMENT_ON, COMMIT, COMPOUND_SELECT, + COMPRESSION_METHOD, CONSTRAINT, CONSTRAINT_EXCLUSIONS, CONSTRAINT_INCLUDE_CLAUSE, CONSTRAINT_INDEX_METHOD, CONSTRAINT_INDEX_TABLESPACE, - CONSTRAINT_STORAGE_PARAMS, CONSTRAINT_WHERE_CLAUSE, COPY, COST_FUNC_OPTION, @@ -683,6 +683,7 @@ pub enum SyntaxKind { DEFERRABLE, DEFERRABLE_CONSTRAINT_OPTION, DELETE, + DELETE_ROWS, DETACH_PARTITION, DISABLE_RLS, DISABLE_RULE, @@ -691,6 +692,7 @@ pub enum SyntaxKind { DISTINCT_CLAUSE, DO, DOUBLE_TYPE, + DROP, DROP_ACCESS_METHOD, DROP_AGGREGATE, DROP_CAST, @@ -778,6 +780,7 @@ pub enum SyntaxKind { INDEX_EXPR, INDEX_PARAMS, INHERIT, + INHERITS, INITIALLY_DEFERRED_CONSTRAINT_OPTION, INITIALLY_IMMEDIATE_CONSTRAINT_OPTION, INSERT, @@ -857,6 +860,8 @@ pub enum SyntaxKind { OFFSET_CLAUSE, OF_TYPE, ON_CLAUSE, + ON_COMMIT, + ON_COMMIT_ACTION, ON_DELETE_ACTION, ON_UPDATE_ACTION, OP, @@ -877,6 +882,8 @@ pub enum SyntaxKind { PARAM_VARIADIC, PAREN_EXPR, PAREN_SELECT, + PARTITION_BY, + PARTITION_OF, PATH, PATH_SEGMENT, PATH_TYPE, @@ -886,6 +893,7 @@ pub enum SyntaxKind { PREFIX_EXPR, PREPARE, PREPARE_TRANSACTION, + PRESERVE_ROWS, PRIMARY_KEY_CONSTRAINT, READ_COMMITTED, READ_ONLY, @@ -957,11 +965,13 @@ pub enum SyntaxKind { SIMILAR_TO, SOURCE_FILE, STMT, + STORAGE, STRICT_FUNC_OPTION, SUPPORT_FUNC_OPTION, TABLE, + TABLESPACE, TABLE_ARG, - TABLE_ARGS, + TABLE_ARG_LIST, TABLE_CONSTRAINT, TABLE_LIST, TARGET, @@ -980,6 +990,7 @@ pub enum SyntaxKind { UPDATE, USING_CLAUSE, USING_INDEX, + USING_METHOD, VACUUM, VALIDATE_CONSTRAINT, VALUES, @@ -990,8 +1001,13 @@ pub enum SyntaxKind { WINDOW_DEF, WINDOW_FUNC_OPTION, WITHIN_CLAUSE, + WITHOUT_OIDS, WITHOUT_TIMEZONE, WITH_CLAUSE, + WITH_DATA, + WITH_NO_DATA, + WITH_OPTIONS, + WITH_PARAMS, WITH_TABLE, WITH_TIMEZONE, XML_COLUMN_OPTION, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 95a5b78a..02c2c086 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -3397,7 +3397,7 @@ fn opt_with_params(p: &mut Parser<'_>) -> Option { } } p.expect(R_PAREN); - Some(m.complete(p, CONSTRAINT_STORAGE_PARAMS)) + Some(m.complete(p, WITH_PARAMS)) } else { None } @@ -4048,41 +4048,24 @@ fn col_def(p: &mut Parser<'_>, t: ColDefType) -> Option { { return None; } - let m = p.start(); // LIKE source_table [ like_option ... ] - if t == ColDefType::WithData && p.eat(LIKE_KW) { - path_name_ref(p); - while !p.at(EOF) { - if !like_option(p) { - break; - } - } - return Some(m.complete(p, LIKE_CLAUSE)); + if t == ColDefType::WithData && p.at(LIKE_KW) { + return Some(like_clause(p)); } if p.at_ts(TABLE_CONSTRAINT_FIRST) { - m.abandon(p); return Some(table_constraint(p)); } - name_ref(p); + let m = p.start(); + name(p); match t { ColDefType::WithData => { - // TODO: validation to check for missing types if opt_type_name(p) { - // [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] - if p.eat(STORAGE_KW) && (p.at(DEFAULT_KW) || p.at(EXTERNAL_KW) || p.at(IDENT)) { - p.bump_any(); - } - // [ COMPRESSION compression_method ] - if p.eat(COMPRESSION_KW) && (p.at(DEFAULT_KW) || p.at(IDENT)) { - p.bump_any(); - } + opt_storage(p); + opt_compression_method(p); } } ColDefType::ColumnNameOnly => { - // [ WITH OPTIONS ] - if p.eat(WITH_KW) { - p.expect(OPTIONS_KW); - } + opt_with_options(p); } } opt_collate(p); @@ -4095,6 +4078,43 @@ fn col_def(p: &mut Parser<'_>, t: ColDefType) -> Option { Some(m.complete(p, COLUMN)) } +fn opt_compression_method(p: &mut Parser<'_>) -> Option { + let m = p.start(); + // [ COMPRESSION compression_method ] + if p.eat(COMPRESSION_KW) && (p.at(DEFAULT_KW) || p.at(IDENT)) { + p.bump_any(); + Some(m.complete(p, COMPRESSION_METHOD)) + } else { + m.abandon(p); + None + } +} + +fn opt_storage(p: &mut Parser<'_>) -> Option { + let m = p.start(); + // [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] + if p.eat(STORAGE_KW) && (p.at(DEFAULT_KW) || p.at(EXTERNAL_KW) || p.at(IDENT)) { + p.bump_any(); + Some(m.complete(p, STORAGE)) + } else { + m.abandon(p); + None + } +} + +fn like_clause(p: &mut Parser<'_>) -> CompletedMarker { + assert!(p.at(LIKE_KW)); + let m = p.start(); + p.bump(LIKE_KW); + path_name_ref(p); + while !p.at(EOF) { + if !like_option(p) { + break; + } + } + m.complete(p, LIKE_CLAUSE) +} + // [ AS ] alias [ ( column_alias [, ...] ) ] // [ AS ] alias ( column_definition [, ...] ) // AS ( column_definition [, ...] ) @@ -4657,7 +4677,8 @@ fn part_elem(p: &mut Parser<'_>, allow_extra_params: bool) -> bool { true } -fn table_args(p: &mut Parser<'_>, t: ColDefType) -> Option { +fn table_arg_list(p: &mut Parser<'_>, t: ColDefType) -> Option { + assert!(p.at(L_PAREN)); let m = p.start(); match t { ColDefType::WithData => { @@ -4681,7 +4702,7 @@ fn table_args(p: &mut Parser<'_>, t: ColDefType) -> Option { } } p.expect(R_PAREN); - Some(m.complete(p, TABLE_ARGS)) + Some(m.complete(p, TABLE_ARG_LIST)) } // { FOR VALUES partition_bound_spec | DEFAULT } @@ -4777,36 +4798,24 @@ fn create_table(p: &mut Parser<'_>) -> CompletedMarker { assert!(p.at(CREATE_KW)); let m = p.start(); p.expect(CREATE_KW); - // [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] - if !p.eat(UNLOGGED_KW) { - // [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } - let require_temp = p.eat(GLOBAL_KW) || p.eat(LOCAL_KW); - if require_temp { - if !opt_temp(p) { - p.error("expected temp or temporary"); - } - } else { - opt_temp(p); - } - } + opt_temp_or_unlogged(p); p.expect(TABLE_KW); opt_if_not_exists(p); path_name(p); let mut col_def_t = ColDefType::WithData; let mut is_partition = false; // OF type_name - if p.eat(OF_KW) { - simple_type_name(p); + if p.at(OF_KW) { + of_type(p); col_def_t = ColDefType::ColumnNameOnly; // PARTITION OF parent_table - } else if p.eat(PARTITION_KW) { - p.expect(OF_KW); - path_name_ref(p); + } else if p.at(PARTITION_KW) { + partition_of(p); col_def_t = ColDefType::ColumnNameOnly; is_partition = true; } if p.at(L_PAREN) { - table_args(p, col_def_t); + table_arg_list(p, col_def_t); } if is_partition { partition_option(p); @@ -4815,44 +4824,13 @@ fn create_table(p: &mut Parser<'_>) -> CompletedMarker { if col_def_t == ColDefType::WithData { opt_inherits_tables(p); } - // [ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ] - if p.eat(PARTITION_KW) { - p.expect(BY_KW); - // name - if p.at_ts(TYPE_KEYWORDS) || p.at(IDENT) { - p.bump_any(); - } - // ( - // { column_name | ( expression ) } - // [ COLLATE collation ] - // [ opclass ] - // [, ... ] - // ) - partition_items(p, false); - } - // [ USING method ] - if p.eat(USING_KW) { - path_name_ref(p); - } - // [ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ] + opt_partition_by(p); + opt_using_method(p); if opt_with_params(p).is_none() { - if p.eat(WITHOUT_KW) { - p.expect(OIDS_KW); - } - } - // [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] - if p.eat(ON_KW) { - p.expect(COMMIT_KW); - if p.eat(PRESERVE_KW) || p.eat(DELETE_KW) { - p.expect(ROWS_KW); - } else if !p.eat(DROP_KW) { - p.error("expected PRESERVE ROWS, DELETE ROWS, or DROP"); - } - } - // [ TABLESPACE tablespace_name ] - if p.eat(TABLESPACE_KW) { - name_ref(p); + opt_without_oids(p); } + opt_on_commit(p); + opt_tablespace(p); // AS query // [ WITH [ NO ] DATA ] if p.eat(AS_KW) { @@ -4871,15 +4849,151 @@ fn create_table(p: &mut Parser<'_>) -> CompletedMarker { p.error("expected SELECT, TABLE, VALUES, or EXECUTE"); } } - if p.eat(WITH_KW) { - p.eat(NO_KW); - p.expect(DATA_KW); - } + + opt_with_data(p); + return m.complete(p, CREATE_TABLE_AS); } m.complete(p, CREATE_TABLE) } +fn opt_temp_or_unlogged(p: &mut Parser<'_>) { + // [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] + if !p.eat(UNLOGGED_KW) { + // [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } + let require_temp = p.eat(GLOBAL_KW) || p.eat(LOCAL_KW); + if require_temp { + if !opt_temp(p) { + p.error("expected temp or temporary"); + } + } else { + opt_temp(p); + } + } +} + +fn of_type(p: &mut Parser<'_>) { + assert!(p.at(OF_KW)); + let m = p.start(); + p.bump(OF_KW); + simple_type_name(p); + m.complete(p, OF_TYPE); +} + +fn partition_of(p: &mut Parser<'_>) { + assert!(p.at(PARTITION_KW)); + let m = p.start(); + p.bump(PARTITION_KW); + p.expect(OF_KW); + path_name_ref(p); + m.complete(p, PARTITION_OF); +} + +fn opt_with_data(p: &mut Parser<'_>) -> Option { + let m = p.start(); + if p.eat(WITH_KW) { + let kind = if p.eat(NO_KW) { + WITH_NO_DATA + } else { + WITH_DATA + }; + p.expect(DATA_KW); + Some(m.complete(p, kind)) + } else { + m.abandon(p); + None + } +} + +fn opt_tablespace(p: &mut Parser<'_>) -> Option { + let m = p.start(); + // [ TABLESPACE tablespace_name ] + if p.eat(TABLESPACE_KW) { + name_ref(p); + Some(m.complete(p, TABLESPACE)) + } else { + m.abandon(p); + None + } +} + +fn opt_without_oids(p: &mut Parser<'_>) -> Option { + let m = p.start(); + if p.eat(WITHOUT_KW) { + p.expect(OIDS_KW); + Some(m.complete(p, WITHOUT_OIDS)) + } else { + m.abandon(p); + None + } +} + +fn opt_using_method(p: &mut Parser<'_>) -> Option { + let m = p.start(); + // [ USING method ] + if p.eat(USING_KW) { + name_ref(p); + Some(m.complete(p, USING_METHOD)) + } else { + m.abandon(p); + None + } +} + +fn opt_partition_by(p: &mut Parser<'_>) -> Option { + let m = p.start(); + // [ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ] + if p.eat(PARTITION_KW) { + p.expect(BY_KW); + // name + if p.at_ts(TYPE_KEYWORDS) || p.at(IDENT) { + p.bump_any(); + } + // ( + // { column_name | ( expression ) } + // [ COLLATE collation ] + // [ opclass ] + // [, ... ] + // ) + partition_items(p, false); + Some(m.complete(p, PARTITION_BY)) + } else { + m.abandon(p); + None + } +} + +fn on_commit_action(p: &mut Parser<'_>) -> Option { + let m = p.start(); + let kind = if p.eat(PRESERVE_KW) { + p.expect(ROWS_KW); + PRESERVE_ROWS + } else if p.eat(DELETE_KW) { + p.expect(ROWS_KW); + DELETE_ROWS + } else if p.eat(DROP_KW) { + DROP + } else { + p.error("expected PRESERVE ROWS, DELETE ROWS, or DROP"); + m.abandon(p); + return None; + }; + Some(m.complete(p, kind)) +} + +fn opt_on_commit(p: &mut Parser<'_>) -> Option { + let m = p.start(); + // [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] + if p.eat(ON_KW) { + p.expect(COMMIT_KW); + on_commit_action(p); + Some(m.complete(p, ON_COMMIT)) + } else { + m.abandon(p); + None + } +} + // COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] // COMMIT PREPARED transaction_id // @@ -4992,7 +5106,7 @@ fn string_literal(p: &mut Parser<'_>) { fn opt_bool_literal(p: &mut Parser<'_>) -> bool { let m = p.start(); - // TOOD: we might want to check if its 1 or 0 specificially, not just `INT_NUMBER` + // TOOD: add validation to check for `1` or `0` inside the INT_NUMBER // https://www.postgresql.org/docs/current/sql-explain.html if p.eat(TRUE_KW) || p.eat(FALSE_KW) || p.eat(OFF_KW) || p.eat(ON_KW) || p.eat(INT_NUMBER) { m.complete(p, LITERAL); @@ -8385,9 +8499,7 @@ fn create_foreign_table(p: &mut Parser<'_>) -> CompletedMarker { table_constraint(p); } else { name_ref(p); - if p.eat(WITH_KW) { - p.expect(OPTIONS_KW); - } + opt_with_options(p); while !p.at(EOF) && opt_column_constraint(p).is_some() { // pass } @@ -8397,9 +8509,7 @@ fn create_foreign_table(p: &mut Parser<'_>) -> CompletedMarker { table_constraint(p); } else { name_ref(p); - if p.eat(WITH_KW) { - p.expect(OPTIONS_KW); - } + opt_with_options(p); while !p.at(EOF) && opt_column_constraint(p).is_some() { // pass } @@ -8433,6 +8543,17 @@ fn create_foreign_table(p: &mut Parser<'_>) -> CompletedMarker { m.complete(p, CREATE_FOREIGN_TABLE) } +fn opt_with_options(p: &mut Parser<'_>) -> Option { + if p.at(WITH_KW) { + let m = p.start(); + p.bump(WITH_KW); + p.expect(OPTIONS_KW); + Some(m.complete(p, WITH_OPTIONS)) + } else { + None + } +} + // CREATE FOREIGN DATA WRAPPER name // [ HANDLER handler_function | NO HANDLER ] // [ VALIDATOR validator_function | NO VALIDATOR ] diff --git a/crates/squawk_parser/tests/data/ok/create_table.sql b/crates/squawk_parser/tests/data/ok/create_table.sql index cec462f5..b9a10460 100644 --- a/crates/squawk_parser/tests/data/ok/create_table.sql +++ b/crates/squawk_parser/tests/data/ok/create_table.sql @@ -301,6 +301,13 @@ create table t of bar.foo ( create table t partition of foo.bar default; +-- partition with some columns +create table t partition of foo.bar ( + a, + b with options, + c not null +) default; + -- partition with create table t partition of foo.bar @@ -329,3 +336,18 @@ CREATE TABLE sensors_uncompressed ( ts TIMESTAMPTZ NOT NULL, value REAL ); + +-- compression method +create table t ( + a int compression pglz, + b int compression default +); + +-- storage +create table t ( + a int storage plain, + b int storage external, + c int storage extended, + d int storage main, + e int storage default +); diff --git a/crates/squawk_parser/tests/data/ok/create_table_as.sql b/crates/squawk_parser/tests/data/ok/create_table_as.sql index fa6fa581..9d5efa48 100644 --- a/crates/squawk_parser/tests/data/ok/create_table_as.sql +++ b/crates/squawk_parser/tests/data/ok/create_table_as.sql @@ -10,6 +10,30 @@ create table t as create table t as table u; +-- more fields +create local temporary table + t (a, b, c) + using foo + with (x = 1, b) + on commit delete rows + tablespace bar + as select 1 + with data; + +create global temp table + if not exists + u (a) + using foo + without oids + on commit preserve rows + tablespace foo + as select 2 + with no data; + +-- unlogged +create unlogged table u + as select 2; + -- values create temporary table t as values (1); diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap index 540ff797..033b758c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap @@ -2242,7 +2242,7 @@ SOURCE_FILE IDENT "c" R_PAREN ")" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -2342,7 +2342,7 @@ SOURCE_FILE IDENT "b" R_PAREN ")" WHITESPACE "\n " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_ok.snap index fa4a3276..3122da0f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_ok.snap @@ -295,9 +295,10 @@ SOURCE_FILE NAME_REF IDENT "a" WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - OPTIONS_KW "options" + WITH_OPTIONS + WITH_KW "with" + WHITESPACE " " + OPTIONS_KW "options" WHITESPACE " " NOT_NULL_CONSTRAINT NOT_KW "not" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap index 57d02dc9..578b9c10 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap @@ -271,7 +271,7 @@ SOURCE_FILE WHITESPACE " " DISTINCT_KW "distinct" WHITESPACE "\n " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -468,7 +468,7 @@ SOURCE_FILE IDENT "title" R_PAREN ")" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "WITH" WHITESPACE " " L_PAREN "(" @@ -593,7 +593,7 @@ SOURCE_FILE IDENT "title" R_PAREN ")" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "WITH" WHITESPACE " " L_PAREN "(" @@ -636,7 +636,7 @@ SOURCE_FILE IDENT "locations" R_PAREN ")" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "WITH" WHITESPACE " " L_PAREN "(" 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 30dc1f4f..9c7385c8 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 @@ -77,7 +77,7 @@ SOURCE_FILE NAME_REF IDENT "u" WHITESPACE "\n " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_publication_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_publication_ok.snap index 5757fac7..ec9ddfc2 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_publication_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_publication_ok.snap @@ -30,7 +30,7 @@ SOURCE_FILE WHITESPACE " " TABLES_KW "tables" WHITESPACE "\n " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -170,7 +170,7 @@ SOURCE_FILE IDENT "foo" R_PAREN ")" WHITESPACE "\n " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_subscription_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_subscription_ok.snap index ca942ddf..23c0d22e 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_subscription_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_subscription_ok.snap @@ -52,7 +52,7 @@ SOURCE_FILE NAME_REF IDENT "c" WHITESPACE "\n " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap index ae895931..2e8efb9c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap @@ -17,11 +17,13 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - ON_KW "on" - WHITESPACE " " - COMMIT_KW "commit" - WHITESPACE " " - DROP_KW "drop" + ON_COMMIT + ON_KW "on" + WHITESPACE " " + COMMIT_KW "commit" + WHITESPACE " " + DROP + DROP_KW "drop" WHITESPACE " " AS_KW "as" WHITESPACE "\n " @@ -103,6 +105,199 @@ SOURCE_FILE IDENT "u" SEMICOLON ";" WHITESPACE "\n\n" + COMMENT "-- more fields" + WHITESPACE "\n" + CREATE_TABLE_AS + CREATE_KW "create" + WHITESPACE " " + LOCAL_KW "local" + WHITESPACE " " + TEMPORARY_KW "temporary" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " \n " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME + IDENT "c" + R_PAREN ")" + WHITESPACE "\n " + USING_METHOD + USING_KW "using" + WHITESPACE " " + NAME_REF + IDENT "foo" + WHITESPACE "\n " + WITH_PARAMS + WITH_KW "with" + WHITESPACE " " + L_PAREN "(" + PATH + PATH_SEGMENT + NAME_REF + IDENT "x" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "b" + R_PAREN ")" + WHITESPACE "\n " + ON_COMMIT + ON_KW "on" + WHITESPACE " " + COMMIT_KW "commit" + WHITESPACE " " + DELETE_ROWS + DELETE_KW "delete" + WHITESPACE " " + ROWS_KW "rows" + WHITESPACE "\n " + TABLESPACE + TABLESPACE_KW "tablespace" + WHITESPACE " " + NAME_REF + IDENT "bar" + WHITESPACE "\n " + AS_KW "as" + WHITESPACE " " + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + WHITESPACE "\n " + WITH_DATA + WITH_KW "with" + WHITESPACE " " + DATA_KW "data" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE_AS + CREATE_KW "create" + WHITESPACE " " + GLOBAL_KW "global" + WHITESPACE " " + TEMP_KW "temp" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " \n " + IF_NOT_EXISTS + IF_KW "if" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + EXISTS_KW "exists" + WHITESPACE " \n " + PATH + PATH_SEGMENT + NAME + IDENT "u" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "a" + R_PAREN ")" + WHITESPACE "\n " + USING_METHOD + USING_KW "using" + WHITESPACE " " + NAME_REF + IDENT "foo" + WHITESPACE "\n " + WITHOUT_OIDS + WITHOUT_KW "without" + WHITESPACE " " + OIDS_KW "oids" + WHITESPACE "\n " + ON_COMMIT + ON_KW "on" + WHITESPACE " " + COMMIT_KW "commit" + WHITESPACE " " + PRESERVE_ROWS + PRESERVE_KW "preserve" + WHITESPACE " " + ROWS_KW "rows" + WHITESPACE "\n " + TABLESPACE + TABLESPACE_KW "tablespace" + WHITESPACE " " + NAME_REF + IDENT "foo" + WHITESPACE "\n " + AS_KW "as" + WHITESPACE " " + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "2" + WHITESPACE "\n " + WITH_NO_DATA + WITH_KW "with" + WHITESPACE " " + NO_KW "no" + WHITESPACE " " + DATA_KW "data" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- unlogged" + WHITESPACE "\n" + CREATE_TABLE_AS + CREATE_KW "create" + WHITESPACE " " + UNLOGGED_KW "unlogged" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "u" + WHITESPACE "\n " + AS_KW "as" + WHITESPACE " " + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "2" + SEMICOLON ";" + WHITESPACE "\n\n" COMMENT "-- values" WHITESPACE "\n" CREATE_TABLE_AS diff --git a/crates/squawk_parser/tests/snapshots/tests__create_table_err.snap b/crates/squawk_parser/tests/snapshots/tests__create_table_err.snap index 1588c010..3f933fce 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_err.snap @@ -10,11 +10,11 @@ SOURCE_FILE WHITESPACE " " TABLE_KW "table" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "sensor_id" WHITESPACE " " PATH_TYPE @@ -38,10 +38,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" R_PAREN ")" SEMICOLON ";" @@ -58,10 +58,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -86,7 +86,7 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COMMA "," COMMA "," @@ -109,11 +109,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -124,7 +124,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -149,7 +149,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "c" WHITESPACE " " PATH_TYPE @@ -176,7 +176,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "d" WHITESPACE " " PATH_TYPE @@ -203,7 +203,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "e" WHITESPACE " " PATH_TYPE @@ -258,11 +258,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -282,7 +282,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE diff --git a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap index 3c5eb98c..cf03330b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap @@ -17,11 +17,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -32,7 +32,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -61,11 +61,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -76,7 +76,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -100,11 +100,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -124,7 +124,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -148,11 +148,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -194,11 +194,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -283,11 +283,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -313,11 +313,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -343,11 +343,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -371,10 +371,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -423,10 +423,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -436,65 +436,66 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - PARTITION_KW "partition" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - RANGE_KW "range" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - BIN_EXPR - NAME_REF - IDENT "foo" + PARTITION_BY + PARTITION_KW "partition" WHITESPACE " " - COLLATE_KW "collate" + BY_KW "by" WHITESPACE " " - NAME_REF - IDENT "\"fr_FR\"" - WHITESPACE " " - IDENT "text_pattern_ops" - COMMA "," - WHITESPACE " \n " - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE "\n " - CALL_EXPR - NAME_REF - EXTRACT_KW "extract" - ARG_LIST - L_PAREN "(" - MONTH_KW "month" + RANGE_KW "range" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + BIN_EXPR + NAME_REF + IDENT "foo" WHITESPACE " " - FROM_KW "from" + COLLATE_KW "collate" WHITESPACE " " NAME_REF - IDENT "b" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - BIN_EXPR - PAREN_EXPR - L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "a" + IDENT "\"fr_FR\"" + WHITESPACE " " + IDENT "text_pattern_ops" + COMMA "," + WHITESPACE " \n " + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE "\n " + CALL_EXPR + NAME_REF + EXTRACT_KW "extract" + ARG_LIST + L_PAREN "(" + MONTH_KW "month" WHITESPACE " " - CUSTOM_OP - PIPE "|" - PIPE "|" + FROM_KW "from" WHITESPACE " " NAME_REF IDENT "b" - R_PAREN ")" - WHITESPACE " " - COLLATE_KW "collate" - WHITESPACE " " - NAME_REF - IDENT "buzz" - WHITESPACE "\n" - R_PAREN ")" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + BIN_EXPR + PAREN_EXPR + L_PAREN "(" + BIN_EXPR + NAME_REF + IDENT "a" + WHITESPACE " " + CUSTOM_OP + PIPE "|" + PIPE "|" + WHITESPACE " " + NAME_REF + IDENT "b" + R_PAREN ")" + WHITESPACE " " + COLLATE_KW "collate" + WHITESPACE " " + NAME_REF + IDENT "buzz" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -509,10 +510,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -522,16 +523,17 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - PARTITION_KW "partition" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - IDENT "hash" - WHITESPACE " " - L_PAREN "(" - NAME_REF - IDENT "z" - R_PAREN ")" + PARTITION_BY + PARTITION_KW "partition" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + IDENT "hash" + WHITESPACE " " + L_PAREN "(" + NAME_REF + IDENT "z" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -546,10 +548,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -559,20 +561,21 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - PARTITION_KW "partition" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - IDENT "list" - WHITESPACE " " - L_PAREN "(" - NAME_REF - IDENT "z" - COMMA "," - WHITESPACE " " - NAME_REF - IDENT "b" - R_PAREN ")" + PARTITION_BY + PARTITION_KW "partition" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + IDENT "list" + WHITESPACE " " + L_PAREN "(" + NAME_REF + IDENT "z" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "b" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -587,10 +590,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -600,12 +603,11 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - USING_KW "using" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "bar" + USING_METHOD + USING_KW "using" + WHITESPACE " " + NAME_REF + IDENT "bar" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -620,10 +622,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -633,7 +635,7 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -685,10 +687,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -698,9 +700,10 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - WITHOUT_KW "without" - WHITESPACE " " - OIDS_KW "OIDS" + WITHOUT_OIDS + WITHOUT_KW "without" + WHITESPACE " " + OIDS_KW "OIDS" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -715,10 +718,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -728,13 +731,15 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - ON_KW "on" - WHITESPACE " " - COMMIT_KW "commit" - WHITESPACE " " - PRESERVE_KW "preserve" - WHITESPACE " " - ROWS_KW "rows" + ON_COMMIT + ON_KW "on" + WHITESPACE " " + COMMIT_KW "commit" + WHITESPACE " " + PRESERVE_ROWS + PRESERVE_KW "preserve" + WHITESPACE " " + ROWS_KW "rows" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -747,10 +752,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -760,13 +765,15 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - ON_KW "on" - WHITESPACE " " - COMMIT_KW "commit" - WHITESPACE " " - DELETE_KW "delete" - WHITESPACE " " - ROWS_KW "rows" + ON_COMMIT + ON_KW "on" + WHITESPACE " " + COMMIT_KW "commit" + WHITESPACE " " + DELETE_ROWS + DELETE_KW "delete" + WHITESPACE " " + ROWS_KW "rows" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -779,10 +786,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -792,11 +799,13 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - ON_KW "on" - WHITESPACE " " - COMMIT_KW "commit" - WHITESPACE " " - DROP_KW "drop" + ON_COMMIT + ON_KW "on" + WHITESPACE " " + COMMIT_KW "commit" + WHITESPACE " " + DROP + DROP_KW "drop" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -811,10 +820,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -824,10 +833,11 @@ SOURCE_FILE INT_KW "int" R_PAREN ")" WHITESPACE "\n" - TABLESPACE_KW "tablespace" - WHITESPACE " " - NAME_REF - IDENT "bar" + TABLESPACE + TABLESPACE_KW "tablespace" + WHITESPACE " " + NAME_REF + IDENT "bar" SEMICOLON ";" WHITESPACE "\n\n\n" CREATE_TABLE @@ -842,11 +852,11 @@ SOURCE_FILE NAME IDENT "u" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -857,7 +867,7 @@ SOURCE_FILE COMMA "," WHITESPACE " \n " COLUMN - NAME_REF + NAME IDENT "\"like\"" WHITESPACE " " PATH_TYPE @@ -892,11 +902,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -925,11 +935,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -956,11 +966,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -990,11 +1000,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1008,7 +1018,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1028,7 +1038,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "c" WHITESPACE " " PATH_TYPE @@ -1040,7 +1050,7 @@ SOURCE_FILE UNIQUE_CONSTRAINT UNIQUE_KW "unique" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -1100,7 +1110,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "d" WHITESPACE " " PATH_TYPE @@ -1137,11 +1147,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1189,11 +1199,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1241,11 +1251,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1259,7 +1269,7 @@ SOURCE_FILE WHITESPACE " " KEY_KW "key" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -1273,7 +1283,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1302,11 +1312,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1331,7 +1341,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "c" WHITESPACE " " PATH_TYPE @@ -1374,11 +1384,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1406,7 +1416,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1427,7 +1437,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "c" WHITESPACE " " PATH_TYPE @@ -1448,7 +1458,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "d" WHITESPACE " " PATH_TYPE @@ -1482,11 +1492,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1520,11 +1530,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1535,7 +1545,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1583,11 +1593,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1598,7 +1608,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1647,11 +1657,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1662,7 +1672,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1701,11 +1711,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1716,7 +1726,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1747,7 +1757,7 @@ SOURCE_FILE IDENT "b" R_PAREN ")" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -1779,11 +1789,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1794,7 +1804,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1837,11 +1847,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1852,7 +1862,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1904,11 +1914,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -1919,7 +1929,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -1993,11 +2003,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -2008,7 +2018,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -2097,11 +2107,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -2112,7 +2122,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -2158,7 +2168,7 @@ SOURCE_FILE IDENT "b" R_PAREN ")" WHITESPACE "\n " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -2235,11 +2245,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -2250,7 +2260,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -2317,11 +2327,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -2332,7 +2342,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -2403,7 +2413,7 @@ SOURCE_FILE IDENT "b" R_PAREN ")" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" @@ -2601,11 +2611,11 @@ SOURCE_FILE NAME IDENT "sal_emp" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME NAME_KW "name" WHITESPACE " " PATH_TYPE @@ -2616,7 +2626,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "pay_by_quarter" WHITESPACE " " ARRAY_TYPE @@ -2630,7 +2640,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "schedule" WHITESPACE " " ARRAY_TYPE @@ -2659,11 +2669,11 @@ SOURCE_FILE NAME IDENT "tictactoe" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "squares" WHITESPACE " " ARRAY_TYPE @@ -2696,11 +2706,11 @@ SOURCE_FILE NAME IDENT "tictactoe" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "pay_by_quarter" WHITESPACE " " ARRAY_TYPE @@ -2718,7 +2728,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "pay_by_quarter" WHITESPACE " " ARRAY_TYPE @@ -2747,18 +2757,19 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - OF_KW "of" - WHITESPACE " " - PATH_TYPE - PATH + OF_TYPE + OF_KW "of" + WHITESPACE " " + PATH_TYPE PATH - PATH_SEGMENT - NAME_REF - IDENT "bar" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "foo" + PATH + PATH_SEGMENT + NAME_REF + IDENT "bar" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "foo" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -2773,29 +2784,30 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - OF_KW "of" - WHITESPACE " " - PATH_TYPE - PATH + OF_TYPE + OF_KW "of" + WHITESPACE " " + PATH_TYPE PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "bar" + DOT "." PATH_SEGMENT NAME_REF - IDENT "bar" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "foo" + IDENT "foo" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " NOT_NULL_CONSTRAINT @@ -2805,12 +2817,13 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "c" WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - OPTIONS_KW "options" + WITH_OPTIONS + WITH_KW "with" + WHITESPACE " " + OPTIONS_KW "options" WHITESPACE " " NOT_NULL_CONSTRAINT NOT_KW "not" @@ -2849,19 +2862,79 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE "\n" - PARTITION_KW "partition" + PARTITION_OF + PARTITION_KW "partition" + WHITESPACE " " + OF_KW "of" + WHITESPACE " " + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "bar" + WHITESPACE " " + DEFAULT_KW "default" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "-- partition with some columns" + WHITESPACE "\n" + CREATE_KW "create" WHITESPACE " " - OF_KW "of" + TABLE_KW "table" WHITESPACE " " PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + PARTITION_OF + PARTITION_KW "partition" + WHITESPACE " " + OF_KW "of" + WHITESPACE " " PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." PATH_SEGMENT NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "bar" + IDENT "bar" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "a" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "b" + WHITESPACE " " + WITH_OPTIONS + WITH_KW "with" + WHITESPACE " " + OPTIONS_KW "options" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "c" + WHITESPACE " " + NOT_NULL_CONSTRAINT + NOT_KW "not" + WHITESPACE " " + NULL_KW "null" + WHITESPACE "\n" + R_PAREN ")" WHITESPACE " " DEFAULT_KW "default" SEMICOLON ";" @@ -2878,19 +2951,20 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE "\n" - PARTITION_KW "partition" - WHITESPACE " " - OF_KW "of" - WHITESPACE " " - PATH + PARTITION_OF + PARTITION_KW "partition" + WHITESPACE " " + OF_KW "of" + WHITESPACE " " PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." PATH_SEGMENT NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "bar" + IDENT "bar" WHITESPACE " \n" FOR_KW "for" WHITESPACE " " @@ -2922,19 +2996,20 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE "\n" - PARTITION_KW "partition" - WHITESPACE " " - OF_KW "of" - WHITESPACE " " - PATH + PARTITION_OF + PARTITION_KW "partition" + WHITESPACE " " + OF_KW "of" + WHITESPACE " " PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." PATH_SEGMENT NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "bar" + IDENT "bar" WHITESPACE " \n" FOR_KW "for" WHITESPACE " " @@ -2964,19 +3039,20 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE "\n" - PARTITION_KW "partition" - WHITESPACE " " - OF_KW "of" - WHITESPACE " " - PATH + PARTITION_OF + PARTITION_KW "partition" + WHITESPACE " " + OF_KW "of" + WHITESPACE " " PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." PATH_SEGMENT NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "bar" + IDENT "bar" WHITESPACE "\n" FOR_KW "for" WHITESPACE " " @@ -3007,20 +3083,21 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - PARTITION_KW "partition" - WHITESPACE " " - OF_KW "of" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "u" + PARTITION_OF + PARTITION_KW "partition" + WHITESPACE " " + OF_KW "of" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "u" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "c" WHITESPACE " " GENERATED_CONSTRAINT @@ -3076,7 +3153,7 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" R_PAREN ")" SEMICOLON ";" @@ -3093,11 +3170,11 @@ SOURCE_FILE NAME IDENT "sensors_uncompressed" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "sensor_id" WHITESPACE " " PATH_TYPE @@ -3108,7 +3185,7 @@ SOURCE_FILE COMMA "," WHITESPACE " \n " COLUMN - NAME_REF + NAME IDENT "ts" WHITESPACE " " PATH_TYPE @@ -3124,7 +3201,7 @@ SOURCE_FILE COMMA "," WHITESPACE " \n " COLUMN - NAME_REF + NAME VALUE_KW "value" WHITESPACE " " PATH_TYPE @@ -3135,4 +3212,150 @@ SOURCE_FILE WHITESPACE "\n" R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "-- compression method" + WHITESPACE "\n" + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + WHITESPACE " " + COMPRESSION_METHOD + COMPRESSION_KW "compression" + WHITESPACE " " + IDENT "pglz" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + WHITESPACE " " + COMPRESSION_METHOD + COMPRESSION_KW "compression" + WHITESPACE " " + DEFAULT_KW "default" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "-- storage" + WHITESPACE "\n" + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + WHITESPACE " " + STORAGE + STORAGE_KW "storage" + WHITESPACE " " + IDENT "plain" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + WHITESPACE " " + STORAGE + STORAGE_KW "storage" + WHITESPACE " " + EXTERNAL_KW "external" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "c" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + WHITESPACE " " + STORAGE + STORAGE_KW "storage" + WHITESPACE " " + IDENT "extended" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "d" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + WHITESPACE " " + STORAGE + STORAGE_KW "storage" + WHITESPACE " " + IDENT "main" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "e" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + WHITESPACE " " + STORAGE + STORAGE_KW "storage" + WHITESPACE " " + DEFAULT_KW "default" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_table_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_table_pg17_ok.snap index b63ee692..407e562f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_pg17_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_pg17_ok.snap @@ -15,11 +15,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -30,7 +30,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -108,11 +108,11 @@ SOURCE_FILE NAME IDENT "orders" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "id" WHITESPACE " " PATH_TYPE @@ -134,7 +134,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "address_id" WHITESPACE " " PATH_TYPE @@ -150,7 +150,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "address_valid_at" WHITESPACE " " PATH_TYPE @@ -166,7 +166,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME CONTENT_KW "content" WHITESPACE " " PATH_TYPE @@ -237,11 +237,11 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -252,7 +252,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -291,11 +291,11 @@ SOURCE_FILE NAME IDENT "addresses" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "id" WHITESPACE " " PATH_TYPE @@ -317,7 +317,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "valid_range" WHITESPACE " " PATH_TYPE @@ -357,7 +357,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "recipient" WHITESPACE " " PATH_TYPE diff --git a/crates/squawk_parser/tests/snapshots/tests__create_tablespace_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_tablespace_ok.snap index 193b24d3..84885b2c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_tablespace_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_tablespace_ok.snap @@ -38,7 +38,7 @@ SOURCE_FILE LITERAL STRING "''" WHITESPACE "\n " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap index 33a7b9d4..3903a538 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap @@ -436,7 +436,7 @@ SOURCE_FILE IDENT "c" R_PAREN ")" WHITESPACE "\n" - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "with" WHITESPACE " " L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index 6259fd37..429a408d 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -15,11 +15,11 @@ SOURCE_FILE NAME IDENT "sensors" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "sensorid" WHITESPACE " " PATH_TYPE @@ -30,7 +30,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "ts" WHITESPACE " " PATH_TYPE @@ -41,7 +41,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME VALUE_KW "value" WHITESPACE " " PATH_TYPE @@ -1246,19 +1246,20 @@ SOURCE_FILE NAME IDENT "time_taptest_table_default" WHITESPACE " " - PARTITION_KW "PARTITION" - WHITESPACE " " - OF_KW "OF" - WHITESPACE " " - PATH + PARTITION_OF + PARTITION_KW "PARTITION" + WHITESPACE " " + OF_KW "OF" + WHITESPACE " " PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "partman_test" + DOT "." PATH_SEGMENT NAME_REF - IDENT "partman_test" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "time_taptest_table" + IDENT "time_taptest_table" WHITESPACE " " DEFAULT_KW "DEFAULT" SEMICOLON ";" @@ -1355,19 +1356,20 @@ SOURCE_FILE NAME IDENT "time_taptest_table_p20241225" WHITESPACE " " - PARTITION_KW "PARTITION" - WHITESPACE " " - OF_KW "OF" - WHITESPACE " " - PATH + PARTITION_OF + PARTITION_KW "PARTITION" + WHITESPACE " " + OF_KW "OF" + WHITESPACE " " PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "partman_test" + DOT "." PATH_SEGMENT NAME_REF - IDENT "partman_test" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "time_taptest_table" + IDENT "time_taptest_table" WHITESPACE " " FOR_KW "FOR" WHITESPACE " " @@ -1404,7 +1406,7 @@ SOURCE_FILE NAME IDENT "clean_default_temp" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" LIKE_CLAUSE LIKE_KW "LIKE" @@ -1526,19 +1528,20 @@ SOURCE_FILE NAME IDENT "time_taptest_table_p20241225" WHITESPACE " " - PARTITION_KW "PARTITION" - WHITESPACE " " - OF_KW "OF" - WHITESPACE " " - PATH + PARTITION_OF + PARTITION_KW "PARTITION" + WHITESPACE " " + OF_KW "OF" + WHITESPACE " " PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "partman_test" + DOT "." PATH_SEGMENT NAME_REF - IDENT "partman_test" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "time_taptest_table" + IDENT "time_taptest_table" WHITESPACE " " FOR_KW "FOR" WHITESPACE " " @@ -1896,11 +1899,11 @@ SOURCE_FILE NAME IDENT "tng" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "title" WHITESPACE " " PATH_TYPE @@ -1911,7 +1914,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "plot" WHITESPACE " " PATH_TYPE @@ -2207,10 +2210,10 @@ SOURCE_FILE NAME IDENT "events" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "event_id" WHITESPACE " " PATH_TYPE @@ -2221,7 +2224,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " COLUMN - NAME_REF + NAME IDENT "event_time" WHITESPACE " " PATH_TYPE @@ -2232,7 +2235,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " COLUMN - NAME_REF + NAME IDENT "user_id" WHITESPACE " " PATH_TYPE @@ -2243,7 +2246,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " COLUMN - NAME_REF + NAME IDENT "response_time" WHITESPACE " " DOUBLE_TYPE @@ -2263,10 +2266,10 @@ SOURCE_FILE NAME IDENT "view_counts" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME DAY_KW "day" WHITESPACE " " PATH_TYPE @@ -2277,7 +2280,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " COLUMN - NAME_REF + NAME IDENT "user_id" WHITESPACE " " PATH_TYPE @@ -2288,7 +2291,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " COLUMN - NAME_REF + NAME IDENT "count" WHITESPACE " " PATH_TYPE @@ -2551,10 +2554,10 @@ SOURCE_FILE NAME IDENT "events_json" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "id" WHITESPACE " " PATH_TYPE @@ -2576,7 +2579,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " COLUMN - NAME_REF + NAME IDENT "payload" WHITESPACE " " PATH_TYPE @@ -2659,10 +2662,10 @@ SOURCE_FILE NAME IDENT "user_counts" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME HOUR_KW "hour" WHITESPACE " " PATH_TYPE @@ -2673,7 +2676,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " COLUMN - NAME_REF + NAME IDENT "user_count" WHITESPACE " " PATH_TYPE @@ -3737,11 +3740,11 @@ SOURCE_FILE NAME IDENT "events" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_time" WHITESPACE " " PATH_TYPE @@ -3752,7 +3755,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "user_id" WHITESPACE " " PATH_TYPE @@ -3763,7 +3766,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_type" WHITESPACE " " PATH_TYPE @@ -3774,16 +3777,17 @@ SOURCE_FILE WHITESPACE "\n" R_PAREN ")" WHITESPACE " " - PARTITION_KW "PARTITION" - WHITESPACE " " - BY_KW "BY" - WHITESPACE " " - RANGE_KW "RANGE" - WHITESPACE " " - L_PAREN "(" - NAME_REF - IDENT "event_time" - R_PAREN ")" + PARTITION_BY + PARTITION_KW "PARTITION" + WHITESPACE " " + BY_KW "BY" + WHITESPACE " " + RANGE_KW "RANGE" + WHITESPACE " " + L_PAREN "(" + NAME_REF + IDENT "event_time" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -3796,13 +3800,13 @@ SOURCE_FILE NAME IDENT "events" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COMMENT "-- Frequently queried columns" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_time" WHITESPACE " " PATH_TYPE @@ -3813,7 +3817,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "user_id" WHITESPACE " " PATH_TYPE @@ -3824,7 +3828,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_type" WHITESPACE " " PATH_TYPE @@ -3837,7 +3841,7 @@ SOURCE_FILE COMMENT "-- Rarely queried metadata" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "user_agent" WHITESPACE " " PATH_TYPE @@ -3848,7 +3852,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "ip_address" WHITESPACE " " PATH_TYPE @@ -3861,7 +3865,7 @@ SOURCE_FILE COMMENT "-- Large payload rarely used in aggregations" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_data" WHITESPACE " " PATH_TYPE @@ -3883,11 +3887,11 @@ SOURCE_FILE NAME IDENT "events_core" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_id" WHITESPACE " " PATH_TYPE @@ -3903,7 +3907,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_time" WHITESPACE " " PATH_TYPE @@ -3914,7 +3918,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "user_id" WHITESPACE " " PATH_TYPE @@ -3925,7 +3929,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_type" WHITESPACE " " PATH_TYPE @@ -3946,11 +3950,11 @@ SOURCE_FILE NAME IDENT "events_metadata" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_id" WHITESPACE " " PATH_TYPE @@ -3974,7 +3978,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "user_agent" WHITESPACE " " PATH_TYPE @@ -3985,7 +3989,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "ip_address" WHITESPACE " " PATH_TYPE @@ -4007,11 +4011,11 @@ SOURCE_FILE NAME IDENT "events_payload" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_id" WHITESPACE " " PATH_TYPE @@ -4035,7 +4039,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "event_data" WHITESPACE " " PATH_TYPE @@ -4392,11 +4396,11 @@ SOURCE_FILE NAME IDENT "metrics" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE " \n " COLUMN - NAME_REF + NAME DAY_KW "day" WHITESPACE " " PATH_TYPE @@ -4407,7 +4411,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "metric_name" WHITESPACE " " PATH_TYPE @@ -4418,7 +4422,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME VALUE_KW "value" WHITESPACE " " PATH_TYPE @@ -4429,12 +4433,11 @@ SOURCE_FILE WHITESPACE "\n" R_PAREN ")" WHITESPACE " " - USING_KW "USING" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "duckdb" + USING_METHOD + USING_KW "USING" + WHITESPACE " " + NAME_REF + IDENT "duckdb" SEMICOLON ";" WHITESPACE "\n\n" CREATE_EXTENSION @@ -4456,11 +4459,11 @@ SOURCE_FILE NAME IDENT "metrics" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME DAY_KW "day" WHITESPACE " " PATH_TYPE @@ -4471,7 +4474,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "metric_name" WHITESPACE " " PATH_TYPE @@ -4482,7 +4485,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME VALUE_KW "value" WHITESPACE " " PATH_TYPE @@ -4493,12 +4496,11 @@ SOURCE_FILE WHITESPACE "\n" R_PAREN ")" WHITESPACE " " - USING_KW "USING" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "columnstore" + USING_METHOD + USING_KW "USING" + WHITESPACE " " + NAME_REF + IDENT "columnstore" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- Instead of this complex self-join" @@ -5612,7 +5614,7 @@ SOURCE_FILE TIMESTAMP_KW "timestamp" R_PAREN ")" WHITESPACE " " - CONSTRAINT_STORAGE_PARAMS + WITH_PARAMS WITH_KW "WITH" WHITESPACE " " L_PAREN "(" @@ -5945,11 +5947,11 @@ SOURCE_FILE NAME IDENT "solar_panel_metrics" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" WHITESPACE "\n " COLUMN - NAME_REF + NAME TIME_KW "time" WHITESPACE " " PATH_TYPE @@ -5965,7 +5967,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "panel_id" WHITESPACE " " PATH_TYPE @@ -5976,7 +5978,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "voltage" WHITESPACE " " DOUBLE_TYPE @@ -5986,7 +5988,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME CURRENT_KW "current" WHITESPACE " " DOUBLE_TYPE @@ -5996,7 +5998,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "temperature" WHITESPACE " " DOUBLE_TYPE @@ -6006,7 +6008,7 @@ SOURCE_FILE COMMA "," WHITESPACE "\n " COLUMN - NAME_REF + NAME IDENT "irradiance" WHITESPACE " " DOUBLE_TYPE diff --git a/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap b/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap index 35c71f59..2f7f3267 100644 --- a/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap @@ -147,10 +147,10 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "a" WHITESPACE " " PATH_TYPE @@ -161,7 +161,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " COLUMN - NAME_REF + NAME IDENT "b" WHITESPACE " " PATH_TYPE @@ -181,10 +181,10 @@ SOURCE_FILE NAME IDENT "t1" WHITESPACE " " - TABLE_ARGS + TABLE_ARG_LIST L_PAREN "(" COLUMN - NAME_REF + NAME IDENT "z" WHITESPACE " " PATH_TYPE diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index 8aaa0756..6496aeb9 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -1574,6 +1574,10 @@ impl Column { support::child(&self.syntax) } #[inline] + pub fn compression_method(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn index_expr(&self) -> Option { support::child(&self.syntax) } @@ -1582,10 +1586,18 @@ impl Column { support::child(&self.syntax) } #[inline] + pub fn storage(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn ty(&self) -> Option { support::child(&self.syntax) } #[inline] + pub fn with_options(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn period_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::PERIOD_KW) } @@ -1671,6 +1683,25 @@ impl CompoundSelect { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct CompressionMethod { + pub(crate) syntax: SyntaxNode, +} +impl CompressionMethod { + #[inline] + pub fn compression_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::COMPRESSION_KW) + } + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } + #[inline] + pub fn ident_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::IDENT) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ConstraintExclusions { pub(crate) syntax: SyntaxNode, @@ -1727,25 +1758,6 @@ impl ConstraintIndexTablespace { } } -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct ConstraintStorageParams { - pub(crate) syntax: SyntaxNode, -} -impl ConstraintStorageParams { - #[inline] - pub fn l_paren_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::L_PAREN) - } - #[inline] - pub fn r_paren_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::R_PAREN) - } - #[inline] - pub fn with_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::WITH_KW) - } -} - #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ConstraintWhereClause { pub(crate) syntax: SyntaxNode, @@ -2464,11 +2476,47 @@ impl CreateTable { support::child(&self.syntax) } #[inline] + pub fn inherits(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn of_type(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn on_commit(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn partition_by(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn partition_of(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn path(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn table_args(&self) -> Option { + pub fn table_arg_list(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn tablespace(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn using_method(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn with_params(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn without_oids(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -2486,10 +2534,54 @@ pub struct CreateTableAs { pub(crate) syntax: SyntaxNode, } impl CreateTableAs { + #[inline] + pub fn if_not_exists(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn on_commit(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn path(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn stmt(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn tablespace(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn using_method(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn with_data(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn with_no_data(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn with_params(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn as_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::AS_KW) + } #[inline] pub fn create_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::CREATE_KW) } + #[inline] + pub fn table_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TABLE_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -2914,6 +3006,21 @@ impl Delete { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct DeleteRows { + pub(crate) syntax: SyntaxNode, +} +impl DeleteRows { + #[inline] + pub fn delete_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DELETE_KW) + } + #[inline] + pub fn rows_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROWS_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct DetachPartition { pub(crate) syntax: SyntaxNode, @@ -3050,6 +3157,17 @@ impl DoubleType { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Drop { + pub(crate) syntax: SyntaxNode, +} +impl Drop { + #[inline] + pub fn drop_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DROP_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct DropAccessMethod { pub(crate) syntax: SyntaxNode, @@ -4921,6 +5039,29 @@ impl Inherit { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Inherits { + pub(crate) syntax: SyntaxNode, +} +impl Inherits { + #[inline] + pub fn paths(&self) -> AstChildren { + support::children(&self.syntax) + } + #[inline] + pub fn l_paren_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::L_PAREN) + } + #[inline] + pub fn r_paren_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::R_PAREN) + } + #[inline] + pub fn inherits_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::INHERITS_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct InitiallyDeferredConstraintOption { pub(crate) syntax: SyntaxNode, @@ -6307,6 +6448,25 @@ impl OnClause { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct OnCommit { + pub(crate) syntax: SyntaxNode, +} +impl OnCommit { + #[inline] + pub fn on_commit_action(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn commit_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::COMMIT_KW) + } + #[inline] + pub fn on_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ON_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct OnDeleteAction { pub(crate) syntax: SyntaxNode, @@ -6808,6 +6968,40 @@ impl ParenSelect { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct PartitionBy { + pub(crate) syntax: SyntaxNode, +} +impl PartitionBy { + #[inline] + pub fn by_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::BY_KW) + } + #[inline] + pub fn partition_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PARTITION_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct PartitionOf { + pub(crate) syntax: SyntaxNode, +} +impl PartitionOf { + #[inline] + pub fn ty(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn of_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::OF_KW) + } + #[inline] + pub fn partition_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PARTITION_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Path { pub(crate) syntax: SyntaxNode, @@ -6943,6 +7137,21 @@ impl PrepareTransaction { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct PreserveRows { + pub(crate) syntax: SyntaxNode, +} +impl PreserveRows { + #[inline] + pub fn preserve_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PRESERVE_KW) + } + #[inline] + pub fn rows_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROWS_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct PrimaryKeyConstraint { pub(crate) syntax: SyntaxNode, @@ -8214,6 +8423,29 @@ impl SourceFile { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Storage { + pub(crate) syntax: SyntaxNode, +} +impl Storage { + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } + #[inline] + pub fn external_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::EXTERNAL_KW) + } + #[inline] + pub fn ident_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::IDENT) + } + #[inline] + pub fn storage_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::STORAGE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct StrictFuncOption { pub(crate) syntax: SyntaxNode, @@ -8268,10 +8500,10 @@ impl Table { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct TableArgs { +pub struct TableArgList { pub(crate) syntax: SyntaxNode, } -impl TableArgs { +impl TableArgList { #[inline] pub fn args(&self) -> AstChildren { support::children(&self.syntax) @@ -8297,6 +8529,21 @@ impl TableList { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Tablespace { + pub(crate) syntax: SyntaxNode, +} +impl Tablespace { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn tablespace_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TABLESPACE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Target { pub(crate) syntax: SyntaxNode, @@ -8595,6 +8842,21 @@ impl UsingIndex { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct UsingMethod { + pub(crate) syntax: SyntaxNode, +} +impl UsingMethod { + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn using_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::USING_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Vacuum { pub(crate) syntax: SyntaxNode, @@ -8746,10 +9008,78 @@ impl WithClause { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct WithTable { +pub struct WithData { pub(crate) syntax: SyntaxNode, } -impl WithTable { +impl WithData { + #[inline] + pub fn data_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DATA_KW) + } + #[inline] + pub fn with_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::WITH_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct WithNoData { + pub(crate) syntax: SyntaxNode, +} +impl WithNoData { + #[inline] + pub fn data_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DATA_KW) + } + #[inline] + pub fn no_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NO_KW) + } + #[inline] + pub fn with_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::WITH_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct WithOptions { + pub(crate) syntax: SyntaxNode, +} +impl WithOptions { + #[inline] + pub fn options_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::OPTIONS_KW) + } + #[inline] + pub fn with_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::WITH_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct WithParams { + pub(crate) syntax: SyntaxNode, +} +impl WithParams { + #[inline] + pub fn l_paren_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::L_PAREN) + } + #[inline] + pub fn r_paren_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::R_PAREN) + } + #[inline] + pub fn with_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::WITH_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct WithTable { + pub(crate) syntax: SyntaxNode, +} +impl WithTable { #[inline] pub fn with_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::WITH_KW) @@ -8802,6 +9132,21 @@ impl WithinClause { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct WithoutOids { + pub(crate) syntax: SyntaxNode, +} +impl WithoutOids { + #[inline] + pub fn oids_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::OIDS_KW) + } + #[inline] + pub fn without_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::WITHOUT_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct WithoutTimezone { pub(crate) syntax: SyntaxNode, @@ -9050,6 +9395,13 @@ pub enum MatchType { MatchSimple(MatchSimple), } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum OnCommitAction { + DeleteRows(DeleteRows), + Drop(Drop), + PreserveRows(PreserveRows), +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum ParamMode { ParamIn(ParamIn), @@ -10743,10 +11095,10 @@ impl AstNode for CompoundSelect { &self.syntax } } -impl AstNode for ConstraintExclusions { +impl AstNode for CompressionMethod { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::CONSTRAINT_EXCLUSIONS + kind == SyntaxKind::COMPRESSION_METHOD } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -10761,10 +11113,10 @@ impl AstNode for ConstraintExclusions { &self.syntax } } -impl AstNode for ConstraintIncludeClause { +impl AstNode for ConstraintExclusions { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::CONSTRAINT_INCLUDE_CLAUSE + kind == SyntaxKind::CONSTRAINT_EXCLUSIONS } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -10779,10 +11131,10 @@ impl AstNode for ConstraintIncludeClause { &self.syntax } } -impl AstNode for ConstraintIndexMethod { +impl AstNode for ConstraintIncludeClause { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::CONSTRAINT_INDEX_METHOD + kind == SyntaxKind::CONSTRAINT_INCLUDE_CLAUSE } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -10797,10 +11149,10 @@ impl AstNode for ConstraintIndexMethod { &self.syntax } } -impl AstNode for ConstraintIndexTablespace { +impl AstNode for ConstraintIndexMethod { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::CONSTRAINT_INDEX_TABLESPACE + kind == SyntaxKind::CONSTRAINT_INDEX_METHOD } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -10815,10 +11167,10 @@ impl AstNode for ConstraintIndexTablespace { &self.syntax } } -impl AstNode for ConstraintStorageParams { +impl AstNode for ConstraintIndexTablespace { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::CONSTRAINT_STORAGE_PARAMS + kind == SyntaxKind::CONSTRAINT_INDEX_TABLESPACE } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -11769,6 +12121,24 @@ impl AstNode for Delete { &self.syntax } } +impl AstNode for DeleteRows { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::DELETE_ROWS + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for DetachPartition { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -11913,6 +12283,24 @@ impl AstNode for DoubleType { &self.syntax } } +impl AstNode for Drop { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::DROP + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for DropAccessMethod { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -13443,6 +13831,24 @@ impl AstNode for Inherit { &self.syntax } } +impl AstNode for Inherits { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::INHERITS + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for InitiallyDeferredConstraintOption { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -14829,6 +15235,24 @@ impl AstNode for OnClause { &self.syntax } } +impl AstNode for OnCommit { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ON_COMMIT + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for OnDeleteAction { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -15171,6 +15595,42 @@ impl AstNode for ParenSelect { &self.syntax } } +impl AstNode for PartitionBy { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::PARTITION_BY + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} +impl AstNode for PartitionOf { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::PARTITION_OF + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for Path { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -15333,6 +15793,24 @@ impl AstNode for PrepareTransaction { &self.syntax } } +impl AstNode for PreserveRows { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::PRESERVE_ROWS + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for PrimaryKeyConstraint { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -16575,6 +17053,24 @@ impl AstNode for SourceFile { &self.syntax } } +impl AstNode for Storage { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::STORAGE + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for StrictFuncOption { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -16629,10 +17125,10 @@ impl AstNode for Table { &self.syntax } } -impl AstNode for TableArgs { +impl AstNode for TableArgList { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::TABLE_ARGS + kind == SyntaxKind::TABLE_ARG_LIST } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -16665,6 +17161,24 @@ impl AstNode for TableList { &self.syntax } } +impl AstNode for Tablespace { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::TABLESPACE + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for Target { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -16917,6 +17431,24 @@ impl AstNode for UsingIndex { &self.syntax } } +impl AstNode for UsingMethod { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::USING_METHOD + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for Vacuum { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -17097,6 +17629,78 @@ impl AstNode for WithClause { &self.syntax } } +impl AstNode for WithData { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::WITH_DATA + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} +impl AstNode for WithNoData { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::WITH_NO_DATA + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} +impl AstNode for WithOptions { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::WITH_OPTIONS + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} +impl AstNode for WithParams { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::WITH_PARAMS + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for WithTable { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -17151,6 +17755,24 @@ impl AstNode for WithinClause { &self.syntax } } +impl AstNode for WithoutOids { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::WITHOUT_OIDS + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for WithoutTimezone { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -18524,6 +19146,53 @@ impl From for MatchType { MatchType::MatchSimple(node) } } +impl AstNode for OnCommitAction { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + matches!( + kind, + SyntaxKind::DELETE_ROWS | SyntaxKind::DROP | SyntaxKind::PRESERVE_ROWS + ) + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + let res = match syntax.kind() { + SyntaxKind::DELETE_ROWS => OnCommitAction::DeleteRows(DeleteRows { syntax }), + SyntaxKind::DROP => OnCommitAction::Drop(Drop { syntax }), + SyntaxKind::PRESERVE_ROWS => OnCommitAction::PreserveRows(PreserveRows { syntax }), + _ => { + return None; + } + }; + Some(res) + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + match self { + OnCommitAction::DeleteRows(it) => &it.syntax, + OnCommitAction::Drop(it) => &it.syntax, + OnCommitAction::PreserveRows(it) => &it.syntax, + } + } +} +impl From for OnCommitAction { + #[inline] + fn from(node: DeleteRows) -> OnCommitAction { + OnCommitAction::DeleteRows(node) + } +} +impl From for OnCommitAction { + #[inline] + fn from(node: Drop) -> OnCommitAction { + OnCommitAction::Drop(node) + } +} +impl From for OnCommitAction { + #[inline] + fn from(node: PreserveRows) -> OnCommitAction { + OnCommitAction::PreserveRows(node) + } +} impl AstNode for ParamMode { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 6b76850b..b0b65396 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -290,9 +290,18 @@ CheckConstraint = UsingIndex = 'using' 'index' NameRef +WithOptions = + 'with' 'options' + +Storage = + 'storage' ('default' | 'external' | '#ident') + +CompressionMethod = + 'compression' ('#ident' | 'default') + Column = 'period'? - (Name | Name Type Collate? | IndexExpr) + (Name WithOptions? | Name Type Storage? CompressionMethod? Collate? | IndexExpr) UniqueConstraint = ('constraint' NameRef) @@ -536,7 +545,7 @@ TableArg = | LikeClause | TableConstraint -TableArgs = +TableArgList = '(' args:((TableArg (',' TableArg)*)?) ')' WhenClause = @@ -557,7 +566,7 @@ ColumnList = ConstraintIncludeClause = 'include' -ConstraintStorageParams = +WithParams = 'with' '(' ')' ConstraintIndexTablespace = @@ -682,8 +691,43 @@ DropDatabase = IfNotExists = 'if' 'not' 'exists' +PartitionOf = + 'partition' 'of' Type + +PreserveRows = + 'preserve' 'rows' + +DeleteRows = + 'delete' 'rows' + +Drop = + 'drop' + +OnCommitAction = + PreserveRows +| DeleteRows +| Drop + +OnCommit = + 'on' 'commit' OnCommitAction + +Inherits = + 'inherits' '(' (Path (',' Path)*) ')' + +Tablespace = + 'tablespace' NameRef + +WithoutOids = + 'without' 'oids' + +UsingMethod = + 'using' NameRef + +PartitionBy = + 'partition' 'by' + CreateTable = - 'create' 'table' IfNotExists? Path TableArgs + 'create' 'table' IfNotExists? Path PartitionOf? OfType? TableArgList Inherits? PartitionBy? UsingMethod? (WithParams | WithoutOids)? OnCommit? Tablespace? CreateIndex = 'create' 'unique'? 'index' 'concurrently'? (IfNotExists? Name)? 'on' RelationName @@ -835,8 +879,14 @@ Declare = Execute = 'execute' +WithData = + 'with' 'data' + +WithNoData = + 'with' 'no' 'data' + CreateTableAs = - 'create' + 'create' 'table' IfNotExists? Path UsingMethod? WithParams? OnCommit? Tablespace? 'as' Stmt (WithData | WithNoData)? CreateMaterializedView = 'create' diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_table_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_table_validation.snap new file mode 100644 index 00000000..cadebe6b --- /dev/null +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__create_table_validation.snap @@ -0,0 +1,40 @@ +--- +source: crates/squawk_syntax/src/test.rs +input_file: crates/squawk_syntax/test_data/validation/create_table.sql +--- +SOURCE_FILE@0..75 + CREATE_TABLE@0..73 + CREATE_KW@0..6 "create" + WHITESPACE@6..7 " " + TABLE_KW@7..12 "table" + WHITESPACE@12..13 " " + PATH@13..14 + PATH_SEGMENT@13..14 + NAME@13..14 + IDENT@13..14 "t" + WHITESPACE@14..15 " " + TABLE_ARG_LIST@15..73 + L_PAREN@15..16 "(" + WHITESPACE@16..19 "\n " + COLUMN@19..24 + NAME@19..20 + IDENT@19..20 "x" + WHITESPACE@20..21 " " + PATH_TYPE@21..24 + PATH@21..24 + PATH_SEGMENT@21..24 + NAME_REF@21..24 + INT_KW@21..24 "int" + COMMA@24..25 "," + WHITESPACE@25..28 "\n " + COLUMN@28..39 + NAME@28..39 + IDENT@28..39 "description" + WHITESPACE@39..42 "\n " + COMMENT@42..71 "-- ^^^^ miss ..." + WHITESPACE@71..72 "\n" + R_PAREN@72..73 ")" + SEMICOLON@73..74 ";" + WHITESPACE@74..75 "\n" + +ERROR@39 "Missing column type" diff --git a/crates/squawk_syntax/src/validation.rs b/crates/squawk_syntax/src/validation.rs index 343cd786..5708e51d 100644 --- a/crates/squawk_syntax/src/validation.rs +++ b/crates/squawk_syntax/src/validation.rs @@ -14,6 +14,7 @@ pub(crate) fn validate(root: &SyntaxNode, errors: &mut Vec) { match node { ast::AlterAggregate(it) => validate_aggregate_params(it.aggregate().and_then(|x| x.param_list()), errors), ast::CreateAggregate(it) => validate_aggregate_params(it.param_list(), errors), + ast::CreateTable(it) => validate_create_table(it, errors), ast::PrefixExpr(it) => validate_prefix_expr(it, errors), ast::ArrayExpr(it) => validate_array_expr(it, errors), ast::DropAggregate(it) => validate_drop_aggregate(it, errors), @@ -25,6 +26,33 @@ pub(crate) fn validate(root: &SyntaxNode, errors: &mut Vec) { } } +fn validate_create_table(it: ast::CreateTable, acc: &mut Vec) { + let Some(arg_list) = it.table_arg_list() else { + return; + }; + + let type_required = it.partition_of().is_none() && it.of_type().is_none(); + + for arg in arg_list.args() { + match arg { + ast::TableArg::Column(column) => { + let Some(col_name) = column.name() else { + continue; + }; + if type_required && column.ty().is_none() { + let end = col_name.syntax().text_range().end(); + acc.push(SyntaxError::new( + "Missing column type", + TextRange::new(end, end), + )); + } + } + ast::TableArg::LikeClause(_) => (), + ast::TableArg::TableConstraint(_) => (), + } + } +} + enum LookingFor { OpenString, CloseString(TextSize, bool), diff --git a/crates/squawk_syntax/test_data/validation/create_table.sql b/crates/squawk_syntax/test_data/validation/create_table.sql new file mode 100644 index 00000000..e6b5a30b --- /dev/null +++ b/crates/squawk_syntax/test_data/validation/create_table.sql @@ -0,0 +1,5 @@ +create table t ( + x int, + description + -- ^^^^ missing type +);