diff --git a/crates/squawk_ide/src/expand_selection.rs b/crates/squawk_ide/src/expand_selection.rs index 49415b91..4a57089d 100644 --- a/crates/squawk_ide/src/expand_selection.rs +++ b/crates/squawk_ide/src/expand_selection.rs @@ -34,13 +34,14 @@ use squawk_syntax::{ }; const DELIMITED_LIST_KINDS: &[SyntaxKind] = &[ + SyntaxKind::ALTER_OPTION_LIST, SyntaxKind::ARG_LIST, SyntaxKind::ATTRIBUTE_LIST, SyntaxKind::COLUMN_LIST, SyntaxKind::CONSTRAINT_EXCLUSION_LIST, SyntaxKind::GROUP_BY_LIST, SyntaxKind::JSON_TABLE_COLUMN_LIST, - SyntaxKind::OPTIONS_LIST, + SyntaxKind::OPTION_ITEM_LIST, SyntaxKind::PARAM_LIST, SyntaxKind::PARTITION_ITEM_LIST, SyntaxKind::ROW_LIST, @@ -546,6 +547,7 @@ $0 fn list_variants() { let delimited_ws_list_kinds = &[ SyntaxKind::FUNC_OPTION_LIST, + SyntaxKind::ROLE_OPTION_LIST, SyntaxKind::SEQUENCE_OPTION_LIST, SyntaxKind::XML_COLUMN_OPTION_LIST, SyntaxKind::WHEN_CLAUSE_LIST, diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index 61e77653..012141a4 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -567,6 +567,8 @@ pub enum SyntaxKind { ALTER_OPERATOR, ALTER_OPERATOR_CLASS, ALTER_OPERATOR_FAMILY, + ALTER_OPTION, + ALTER_OPTION_LIST, ALTER_POLICY, ALTER_PROCEDURE, ALTER_PUBLICATION, @@ -889,7 +891,8 @@ pub enum SyntaxKind { ON_UPDATE_ACTION, OP, OPERATOR_CALL, - OPTIONS_LIST, + OPTION_ITEM, + OPTION_ITEM_LIST, ORDER_BY_CLAUSE, OR_REPLACE, OVER_CLAUSE, @@ -950,6 +953,8 @@ pub enum SyntaxKind { RET_TYPE, REVOKE, ROLE, + ROLE_OPTION, + ROLE_OPTION_LIST, ROLLBACK, ROW, ROWS_FUNC_OPTION, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index bfd4bb87..56a29a5f 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -5730,7 +5730,7 @@ fn alter_server(p: &mut Parser<'_>) -> CompletedMarker { string_literal(p); found_option = true; } - found_option |= opt_options_list(p); + found_option |= opt_alter_option_list(p); if !found_option { p.error("expected ALTER SERVER option"); } @@ -5945,13 +5945,7 @@ fn alter_role(p: &mut Parser<'_>) -> CompletedMarker { } } _ => { - p.eat(WITH_KW); - if !opt_role_option(p) { - p.error("expected option"); - } - while !p.at(EOF) && p.at_ts(ROLE_OPTION_FIRST) { - opt_role_option(p); - } + opt_role_option_list(p); } } m.complete(p, ALTER_ROLE) @@ -6337,12 +6331,9 @@ fn alter_materialized_view(p: &mut Parser<'_>) -> CompletedMarker { fn opt_alter_table_action_list(p: &mut Parser<'_>) { while !p.at(EOF) { - let m = p.start(); - let Some(kind) = opt_alter_table_action(p) else { - m.abandon(p); + if opt_alter_table_action(p).is_none() { break; }; - m.complete(p, kind); if !p.eat(COMMA) { if p.at_ts(ALTER_TABLE_ACTION_FIRST) { p.error("missing comma"); @@ -7835,11 +7826,8 @@ fn alter_user(p: &mut Parser<'_>) -> CompletedMarker { role(p); } // be careful of the case where we're at the IN of IN DATABASE - if p.eat(WITH_KW) || (p.at_ts(ROLE_OPTION_FIRST) && !p.nth_at(1, DATABASE_KW)) { - opt_role_option(p); - while !p.at(EOF) && p.at_ts(ROLE_OPTION_FIRST) { - opt_role_option(p); - } + if p.at(WITH_KW) || (p.at_ts(ROLE_OPTION_FIRST) && !p.nth_at(1, DATABASE_KW)) { + opt_role_option_list(p); return m.complete(p, ALTER_USER); } // RENAME TO new_name @@ -7880,13 +7868,20 @@ fn alter_user_mapping(p: &mut Parser<'_>) -> CompletedMarker { role(p); p.expect(SERVER_KW); name_ref(p); - if !opt_options_list(p) { + if !opt_alter_option_list(p) { p.error("expected options"); } m.complete(p, ALTER_USER_MAPPING) } -fn alter_option(p: &mut Parser<'_>) { +const ALTER_OPTION_FIRST: TokenSet = + TokenSet::new(&[DROP_KW, ADD_KW, SET_KW]).union(COL_LABEL_FIRST); + +fn opt_alter_option(p: &mut Parser<'_>) -> Option { + if !p.at_ts(ALTER_OPTION_FIRST) { + return None; + } + let m = p.start(); let arg_required = match p.current() { DROP_KW => { p.bump(DROP_KW); @@ -7898,13 +7893,11 @@ fn alter_option(p: &mut Parser<'_>) { } _ => true, }; - if arg_required { - let _ = p.eat(ADD_KW) || p.eat(SET_KW); - } col_label(p); if arg_required { string_literal(p); } + Some(m.complete(p, ALTER_OPTION)) } // ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression @@ -7983,18 +7976,29 @@ fn analyze(p: &mut Parser<'_>) -> CompletedMarker { let m = p.start(); p.bump_any(); if !p.eat(VERBOSE_KW) { - if p.eat(L_PAREN) { - cluster_option(p); - while !p.at(EOF) && p.eat(COMMA) { - cluster_option(p); - } - p.expect(R_PAREN); - } + opt_option_list(p); } opt_relation_list(p); m.complete(p, ANALYZE) } +fn opt_option_list(p: &mut Parser<'_>) { + if !p.at(L_PAREN) { + return; + } + let m = p.start(); + delimited( + p, + L_PAREN, + R_PAREN, + COMMA, + || "unexpected comma".to_string(), + OPTION_FIRST, + opt_option, + ); + m.complete(p, OPTION_ITEM_LIST); +} + // COMMENT ON // { // ACCESS METHOD object_name | @@ -8176,12 +8180,8 @@ fn cluster(p: &mut Parser<'_>) -> CompletedMarker { p.bump(CLUSTER_KW); if p.eat(VERBOSE_KW) { // pass - } else if p.eat(L_PAREN) { - cluster_option(p); - while !p.at(EOF) && p.eat(COMMA) { - cluster_option(p); - } - p.expect(R_PAREN); + } else { + opt_option_list(p); } let has_name = opt_path_name_ref(p).is_some(); if has_name && p.eat(ON_KW) { @@ -8193,14 +8193,19 @@ fn cluster(p: &mut Parser<'_>) -> CompletedMarker { m.complete(p, CLUSTER) } -fn cluster_option(p: &mut Parser<'_>) { - // option name - if p.at_ts(NON_RESERVED_WORD) || p.at(ANALYSE_KW) || p.at(ANALYZE_KW) || p.at(FORMAT_KW) { - p.bump_any(); - } else { - p.error("expected cluster option"); +const OPTION_FIRST: TokenSet = + TokenSet::new(&[ANALYSE_KW, ANALYZE_KW, FORMAT_KW]).union(NON_RESERVED_WORD); + +fn opt_option(p: &mut Parser<'_>) -> bool { + if !p.at_ts(OPTION_FIRST) { + return false; } + let m = p.start(); + // option name + p.bump_any(); opt_option_value(p); + m.complete(p, OPTION_ITEM); + true } // CREATE ACCESS METHOD name @@ -8582,7 +8587,7 @@ fn create_foreign_table(p: &mut Parser<'_>) -> CompletedMarker { } else { name(p); type_name(p); - opt_options_list(p); + opt_alter_option_list(p); opt_collate(p); opt_column_constraint_list(p); } @@ -8595,7 +8600,7 @@ fn create_foreign_table(p: &mut Parser<'_>) -> CompletedMarker { } p.expect(SERVER_KW); name_ref(p); - opt_options_list(p); + opt_alter_option_list(p); m.complete(p, CREATE_FOREIGN_TABLE) } @@ -8627,14 +8632,14 @@ fn create_foreign_data_wrapper(p: &mut Parser<'_>) -> CompletedMarker { break; } } - opt_options_list(p); + opt_alter_option_list(p); m.complete(p, CREATE_FOREIGN_DATA_WRAPPER) } fn opt_fdw_option(p: &mut Parser<'_>) -> bool { match p.current() { OPTIONS_KW => { - if !opt_options_list(p) { + if !opt_alter_option_list(p) { p.error("expected options"); } true @@ -9144,7 +9149,7 @@ fn create_server(p: &mut Parser<'_>) -> CompletedMarker { p.expect(DATA_KW); p.expect(WRAPPER_KW); name_ref(p); - opt_options_list(p); + opt_alter_option_list(p); m.complete(p, CREATE_SERVER) } @@ -9341,7 +9346,7 @@ fn create_user_mapping(p: &mut Parser<'_>) -> CompletedMarker { p.eat(SERVER_KW); // server_name name_ref(p); - opt_options_list(p); + opt_alter_option_list(p); m.complete(p, CREATE_USER_MAPPING) } @@ -9364,6 +9369,7 @@ fn opt_role_option(p: &mut Parser<'_>) -> bool { if !p.at_ts(ROLE_OPTION_FIRST) { return false; } + let m = p.start(); match p.current() { // SUPERUSER // NOSUPERUSER @@ -9424,10 +9430,12 @@ fn opt_role_option(p: &mut Parser<'_>) -> bool { } } _ => { + m.abandon(p); p.err_and_bump("expected role option"); return false; } } + m.complete(p, ROLE_OPTION); true } @@ -9461,11 +9469,13 @@ fn create_user(p: &mut Parser<'_>) -> CompletedMarker { fn opt_role_option_list(p: &mut Parser<'_>) { if p.at_ts(ROLE_OPTION_FIRST) { + let m = p.start(); p.eat(WITH_KW); opt_role_option(p); while !p.at(EOF) && p.at_ts(ROLE_OPTION_FIRST) { opt_role_option(p); } + m.complete(p, ROLE_OPTION_LIST); } } @@ -10088,18 +10098,29 @@ fn explain_option(p: &mut Parser<'_>) { } // [ OPTIONS ( option 'value' [, ... ] ) ] -fn opt_options_list(p: &mut Parser<'_>) -> bool { - if p.eat(OPTIONS_KW) { - p.expect(L_PAREN); - alter_option(p); - while !p.at(EOF) && p.eat(COMMA) { - alter_option(p); - } - p.expect(R_PAREN); - true - } else { - false +fn opt_alter_option_list(p: &mut Parser<'_>) -> bool { + if !p.at(OPTIONS_KW) { + return false; } + alter_option_list(p); + true +} + +// [ OPTIONS ( option 'value' [, ... ] ) ] +fn alter_option_list(p: &mut Parser<'_>) -> CompletedMarker { + assert!(p.at(OPTIONS_KW)); + let m = p.start(); + p.expect(OPTIONS_KW); + delimited( + p, + L_PAREN, + R_PAREN, + COMMA, + || "expected alter option".to_string(), + EXPR_FIRST, + |p| opt_alter_option(p).is_some(), + ); + m.complete(p, ALTER_OPTION_LIST) } // IMPORT FOREIGN SCHEMA remote_schema @@ -10134,7 +10155,7 @@ fn import_foreign_schema(p: &mut Parser<'_>) -> CompletedMarker { // INTO local_schema p.expect(INTO_KW); name_ref(p); - opt_options_list(p); + opt_alter_option_list(p); m.complete(p, IMPORT_FOREIGN_SCHEMA) } @@ -13357,20 +13378,22 @@ const ALTER_TABLE_ACTION_FIRST: TokenSet = TokenSet::new(&[ OPTIONS_KW, ]); -fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { +fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { if !p.at_ts(ALTER_TABLE_ACTION_FIRST) { return None; } - let kind = match p.current() { + let cm = match p.current() { // VALIDATE CONSTRAINT constraint_name VALIDATE_KW => { + let m = p.start(); p.bump(VALIDATE_KW); p.expect(CONSTRAINT_KW); name_ref(p); - VALIDATE_CONSTRAINT + m.complete(p, VALIDATE_CONSTRAINT) } // REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING } REPLICA_KW => { + let m = p.start(); p.bump(REPLICA_KW); p.expect(IDENTITY_KW); if !p.eat(DEFAULT_KW) && !p.eat(FULL_KW) && !p.eat(NOTHING_KW) { @@ -13378,49 +13401,55 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { p.expect(INDEX_KW); name_ref(p); } - REPLICA_IDENTITY + m.complete(p, REPLICA_IDENTITY) } // OF type_name OF_KW => { + let m = p.start(); p.bump(OF_KW); simple_type_name(p); - OF_TYPE + m.complete(p, OF_TYPE) } // NOT OF NOT_KW if p.nth_at(1, OF_KW) => { + let m = p.start(); p.bump(NOT_KW); p.bump(OF_KW); - NOT_OF + m.complete(p, NOT_OF) } // FORCE ROW LEVEL SECURITY FORCE_KW => { + let m = p.start(); p.bump(FORCE_KW); p.expect(ROW_KW); p.expect(LEVEL_KW); p.expect(SECURITY_KW); - FORCE_RLS + m.complete(p, FORCE_RLS) } // NO FORCE ROW LEVEL SECURITY NO_KW if p.nth_at(1, FORCE_KW) => { + let m = p.start(); p.bump(NO_KW); p.bump(FORCE_KW); p.expect(ROW_KW); p.expect(LEVEL_KW); p.expect(SECURITY_KW); - NO_FORCE_RLS + m.complete(p, NO_FORCE_RLS) } // INHERIT parent_table INHERIT_KW => { + let m = p.start(); p.bump(INHERIT_KW); path_name_ref(p); - INHERIT + m.complete(p, INHERIT) } // NO INHERIT parent_table NO_KW if p.nth_at(1, INHERIT_KW) => { + let m = p.start(); p.bump(NO_KW); p.bump(INHERIT_KW); path_name_ref(p); - NO_INHERIT + m.complete(p, NO_INHERIT) } // ENABLE TRIGGER [ trigger_name | ALL | USER ] // ENABLE REPLICA TRIGGER trigger_name @@ -13430,8 +13459,9 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { // ENABLE RULE rewrite_rule_name // ENABLE ROW LEVEL SECURITY ENABLE_KW => { + let m = p.start(); p.bump(ENABLE_KW); - match p.current() { + let kind = match p.current() { TRIGGER_KW => { p.bump(TRIGGER_KW); if !p.eat(ALL_KW) && !p.eat(USER_KW) { @@ -13477,14 +13507,16 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { // TODO: just picking something for now ENABLE_RLS } - } + }; + m.complete(p, kind) } // DISABLE TRIGGER [ trigger_name | ALL | USER ] // DISABLE RULE rewrite_rule_name // DISABLE ROW LEVEL SECURITY DISABLE_KW => { + let m = p.start(); p.bump(DISABLE_KW); - match p.current() { + let kind = match p.current() { TRIGGER_KW => { p.bump(TRIGGER_KW); if !p.eat(ALL_KW) && !p.eat(USER_KW) { @@ -13508,23 +13540,27 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { // TODO: just picking something for now DISABLE_RULE } - } + }; + m.complete(p, kind) } // CLUSTER ON index_name CLUSTER_KW => { + let m = p.start(); p.bump(CLUSTER_KW); p.bump(ON_KW); name_ref(p); - CLUSTER_ON + m.complete(p, CLUSTER_ON) } // OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } OWNER_KW => { + let m = p.start(); p.bump(OWNER_KW); p.bump(TO_KW); role(p); - OWNER_TO + m.complete(p, OWNER_TO) } DETACH_KW => { + let m = p.start(); p.bump(DETACH_KW); p.expect(PARTITION_KW); // partition_name @@ -13533,11 +13569,12 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { if !p.eat(CONCURRENTLY_KW) { p.eat(FINALIZE_KW); } - DETACH_PARTITION + m.complete(p, DETACH_PARTITION) } // DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] // DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] DROP_KW => { + let m = p.start(); p.bump(DROP_KW); // CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] let kind = if p.eat(CONSTRAINT_KW) { @@ -13552,7 +13589,7 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { DROP_COLUMN }; opt_cascade_or_restrict(p); - kind + m.complete(p, kind) } // ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] // ADD table_constraint [ NOT VALID ] @@ -13576,8 +13613,9 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { // { UNIQUE | PRIMARY KEY } USING INDEX index_name // [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] ADD_KW => { + let m = p.start(); p.bump(ADD_KW); - if p.at_ts(TABLE_CONSTRAINT_FIRST) { + let kind = if p.at_ts(TABLE_CONSTRAINT_FIRST) { // at table_constraint or table_constraint_using_index table_constraint(p); ADD_CONSTRAINT @@ -13589,21 +13627,23 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { // column_name name_ref(p); type_name(p); - opt_options_list(p); + opt_alter_option_list(p); opt_collate(p); opt_column_constraint_list(p); ADD_COLUMN - } + }; + m.complete(p, kind) } // ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT } ATTACH_KW => { + let m = p.start(); p.bump(ATTACH_KW); p.expect(PARTITION_KW); // name path_name_ref(p); // { FOR VALUES partition_bound_spec | DEFAULT } partition_option(p); - ATTACH_PARTITION + m.complete(p, ATTACH_PARTITION) } // SET SCHEMA new_schema // SET TABLESPACE new_tablespace [ NOWAIT ] @@ -13613,9 +13653,10 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { // SET { LOGGED | UNLOGGED } // SET ( storage_parameter [= value] [, ... ] ) SET_KW => { + let m = p.start(); p.expect(SET_KW); // SET SCHEMA new_schema - if p.eat(SCHEMA_KW) { + let kind = if p.eat(SCHEMA_KW) { // name name_ref(p); SET_SCHEMA @@ -13652,20 +13693,23 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { } else { attribute_list(p); SET_STORAGE_PARAMS - } + }; + m.complete(p, kind) } RESET_KW => { + let m = p.start(); p.bump(RESET_KW); attribute_list(p); - RESET_STORAGE_PARAMS + m.complete(p, RESET_STORAGE_PARAMS) } // RENAME CONSTRAINT constraint_name TO new_constraint_name // RENAME [ COLUMN ] column_name TO new_column_name // RENAME TO new_name RENAME_KW => { + let m = p.start(); p.expect(RENAME_KW); // TO new_name - if p.eat(TO_KW) { + let kind = if p.eat(TO_KW) { // name name_ref(p); RENAME_TABLE @@ -13688,7 +13732,8 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { // name name_ref(p); RENAME_COLUMN - } + }; + m.complete(p, kind) } // ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] // ALTER [ COLUMN ] column_name SET DEFAULT expression @@ -13706,9 +13751,10 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { // ALTER [ COLUMN ] column_name SET COMPRESSION compression_method // ALTER CONSTRAINT constraint_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] ALTER_KW => { + let m = p.start(); p.bump(ALTER_KW); // ALTER CONSTRAINT constraint_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] - if p.eat(CONSTRAINT_KW) { + let kind = if p.eat(CONSTRAINT_KW) { name_ref(p); opt_constraint_option_list(p); ALTER_CONSTRAINT @@ -13727,17 +13773,13 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { m.abandon(p); } ALTER_COLUMN - } - } - OPTIONS_KW => { - if !opt_options_list(p) { - p.error("expected options list"); - } - OPTIONS_LIST + }; + m.complete(p, kind) } + OPTIONS_KW => alter_option_list(p), _ => return None, }; - Some(kind) + Some(cm) } // /* Column label --- allowed labels in "AS" clauses. @@ -13954,7 +13996,7 @@ fn alter_column_option(p: &mut Parser<'_>) -> Option { } // OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ]) OPTIONS_KW => { - if !opt_options_list(p) { + if !opt_alter_option_list(p) { p.error("expected options"); } SET_OPTIONS_LIST diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_foreign_data_wrapper_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_foreign_data_wrapper_ok.snap index 4d9c32df..a3e26ed9 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_foreign_data_wrapper_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_foreign_data_wrapper_ok.snap @@ -99,32 +99,36 @@ SOURCE_FILE NAME_REF IDENT "w" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - ADD_KW "add" - WHITESPACE " " - NAME - IDENT "o" - WHITESPACE " " - LITERAL - STRING "'v'" - COMMA "," - WHITESPACE " " - SET_KW "set" - WHITESPACE " " - NAME - IDENT "o" - WHITESPACE " " - LITERAL - STRING "'v'" - COMMA "," - WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - NAME - IDENT "o" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + ADD_KW "add" + WHITESPACE " " + NAME + IDENT "o" + WHITESPACE " " + LITERAL + STRING "'v'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + SET_KW "set" + WHITESPACE " " + NAME + IDENT "o" + WHITESPACE " " + LITERAL + STRING "'v'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + DROP_KW "drop" + WHITESPACE " " + NAME + IDENT "o" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- multiple" @@ -173,32 +177,36 @@ SOURCE_FILE WHITESPACE " " VALIDATOR_KW "validator" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - ADD_KW "add" - WHITESPACE " " - NAME - IDENT "o" - WHITESPACE " " - LITERAL - STRING "'v'" - COMMA "," - WHITESPACE " " - SET_KW "set" - WHITESPACE " " - NAME - IDENT "o" - WHITESPACE " " - LITERAL - STRING "''" - COMMA "," - WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - NAME - IDENT "d" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + ADD_KW "add" + WHITESPACE " " + NAME + IDENT "o" + WHITESPACE " " + LITERAL + STRING "'v'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + SET_KW "set" + WHITESPACE " " + NAME + IDENT "o" + WHITESPACE " " + LITERAL + STRING "''" + COMMA "," + WHITESPACE " " + ALTER_OPTION + DROP_KW "drop" + WHITESPACE " " + NAME + IDENT "d" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- owner" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_foreign_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_foreign_table_ok.snap index f5e64aaf..c3489a23 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_foreign_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_foreign_table_ok.snap @@ -935,38 +935,43 @@ SOURCE_FILE IDENT "c" WHITESPACE " " SET_OPTIONS_LIST - OPTIONS_KW "options" - L_PAREN "(" - NAME - IDENT "b" - WHITESPACE " " - LITERAL - STRING "''" - COMMA "," - WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - NAME - IDENT "c" - WHITESPACE " " - LITERAL - STRING "'c'" - COMMA "," - WHITESPACE " " - SET_KW "set" - WHITESPACE " " - NAME - IDENT "x" - WHITESPACE " " - LITERAL - STRING "''" - COMMA "," - WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - NAME - IDENT "x" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "b" + WHITESPACE " " + LITERAL + STRING "''" + COMMA "," + WHITESPACE " " + ALTER_OPTION + ADD_KW "add" + WHITESPACE " " + NAME + IDENT "c" + WHITESPACE " " + LITERAL + STRING "'c'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + SET_KW "set" + WHITESPACE " " + NAME + IDENT "x" + WHITESPACE " " + LITERAL + STRING "''" + COMMA "," + WHITESPACE " " + ALTER_OPTION + DROP_KW "drop" + WHITESPACE " " + NAME + IDENT "x" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" ALTER_FOREIGN_TABLE @@ -988,16 +993,18 @@ SOURCE_FILE IDENT "c" WHITESPACE " " SET_OPTIONS_LIST - OPTIONS_KW "options" - L_PAREN "(" - SET_KW "set" - WHITESPACE " " - NAME - IDENT "x" - WHITESPACE " " - LITERAL - STRING "''" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + L_PAREN "(" + ALTER_OPTION + SET_KW "set" + WHITESPACE " " + NAME + IDENT "x" + WHITESPACE " " + LITERAL + STRING "''" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- action_add_table_constraint" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_role_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_role_ok.snap index f9dd635f..076075db 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_role_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_role_ok.snap @@ -12,9 +12,11 @@ SOURCE_FILE WHITESPACE " " IDENT "r" WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - IDENT "superuser" + ROLE_OPTION_LIST + WITH_KW "with" + WHITESPACE " " + ROLE_OPTION + IDENT "superuser" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- all_options" @@ -26,67 +28,88 @@ SOURCE_FILE WHITESPACE " " IDENT "r" WHITESPACE "\n " - WITH_KW "with" - WHITESPACE " " - IDENT "superuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "createdb" - WHITESPACE "\n " - IDENT "nocreatedb" - WHITESPACE "\n " - IDENT "createrole" - WHITESPACE "\n " - IDENT "nocreaterole" - WHITESPACE "\n " - INHERIT_KW "inherit" - WHITESPACE "\n " - IDENT "noinherit" - WHITESPACE "\n " - IDENT "login" - WHITESPACE "\n " - IDENT "nologin" - WHITESPACE "\n " - IDENT "replication" - WHITESPACE "\n " - IDENT "noreplication" - WHITESPACE "\n " - IDENT "bypassrls" - WHITESPACE "\n " - IDENT "nobypassrls" - WHITESPACE "\n " - CONNECTION_KW "connection" - WHITESPACE " " - LIMIT_KW "limit" - WHITESPACE " " - LITERAL - INT_NUMBER "100" - WHITESPACE "\n " - ENCRYPTED_KW "encrypted" - WHITESPACE " " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'foo'" - WHITESPACE "\n " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'bar'" - WHITESPACE " " - PASSWORD_KW "password" - WHITESPACE " " - NULL_KW "null" - WHITESPACE "\n " - VALID_KW "valid" - WHITESPACE " " - UNTIL_KW "until" - WHITESPACE " " - LITERAL - STRING "'2042-02-22'" + ROLE_OPTION_LIST + WITH_KW "with" + WHITESPACE " " + ROLE_OPTION + IDENT "superuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createdb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreatedb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createrole" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreaterole" + WHITESPACE "\n " + ROLE_OPTION + INHERIT_KW "inherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noinherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "login" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nologin" + WHITESPACE "\n " + ROLE_OPTION + IDENT "replication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noreplication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "bypassrls" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nobypassrls" + WHITESPACE "\n " + ROLE_OPTION + CONNECTION_KW "connection" + WHITESPACE " " + LIMIT_KW "limit" + WHITESPACE " " + LITERAL + INT_NUMBER "100" + WHITESPACE "\n " + ROLE_OPTION + ENCRYPTED_KW "encrypted" + WHITESPACE " " + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'foo'" + WHITESPACE "\n " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'bar'" + WHITESPACE " " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + NULL_KW "null" + WHITESPACE "\n " + ROLE_OPTION + VALID_KW "valid" + WHITESPACE " " + UNTIL_KW "until" + WHITESPACE " " + LITERAL + STRING "'2042-02-22'" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- rename" @@ -257,9 +280,11 @@ SOURCE_FILE WHITESPACE " " CURRENT_USER_KW "current_user" WHITESPACE " " - WITH_KW "with" - WHITESPACE " " - IDENT "nologin" + ROLE_OPTION_LIST + WITH_KW "with" + WHITESPACE " " + ROLE_OPTION + IDENT "nologin" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- for_all_roles" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_server_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_server_ok.snap index 814cecd5..b56cfc9b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_server_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_server_ok.snap @@ -34,23 +34,26 @@ SOURCE_FILE LITERAL STRING "'v1'" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - ADD_KW "add" - WHITESPACE " " - NAME - IDENT "o" - WHITESPACE " " - LITERAL - STRING "'val'" - COMMA "," - WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - NAME - IDENT "p" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + ADD_KW "add" + WHITESPACE " " + NAME + IDENT "o" + WHITESPACE " " + LITERAL + STRING "'val'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + DROP_KW "drop" + WHITESPACE " " + NAME + IDENT "p" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- owner" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_user_mapping_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_user_mapping_ok.snap index a8090046..86babab0 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_user_mapping_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_user_mapping_ok.snap @@ -21,31 +21,35 @@ SOURCE_FILE NAME_REF IDENT "s" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - ADD_KW "add" - WHITESPACE " " - NAME - IDENT "a" - WHITESPACE " " - LITERAL - STRING "'v'" - COMMA "," - WHITESPACE " " - SET_KW "set" - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - LITERAL - STRING "'w'" - COMMA "," - WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - NAME - IDENT "c" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + ADD_KW "add" + WHITESPACE " " + NAME + IDENT "a" + WHITESPACE " " + LITERAL + STRING "'v'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + SET_KW "set" + WHITESPACE " " + NAME + IDENT "b" + WHITESPACE " " + LITERAL + STRING "'w'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + DROP_KW "drop" + WHITESPACE " " + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_user_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_user_ok.snap index d875bfa3..340a8352 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_user_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_user_ok.snap @@ -12,7 +12,9 @@ SOURCE_FILE WHITESPACE " " IDENT "u" WHITESPACE " " - IDENT "superuser" + ROLE_OPTION_LIST + ROLE_OPTION + IDENT "superuser" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full" @@ -24,65 +26,85 @@ SOURCE_FILE WHITESPACE " " IDENT "u" WHITESPACE " " - WITH_KW "with" - WHITESPACE " \n " - IDENT "superuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "createdb" - WHITESPACE "\n " - IDENT "nocreatedb" - WHITESPACE "\n " - IDENT "createrole" - WHITESPACE "\n " - IDENT "nocreaterole" - WHITESPACE "\n " - INHERIT_KW "inherit" - WHITESPACE "\n " - IDENT "noinherit" - WHITESPACE "\n " - IDENT "login" - WHITESPACE "\n " - IDENT "nologin" - WHITESPACE "\n " - IDENT "replication" - WHITESPACE "\n " - IDENT "noreplication" - WHITESPACE "\n " - IDENT "bypassrls" - WHITESPACE "\n " - IDENT "nobypassrls" - WHITESPACE "\n " - CONNECTION_KW "connection" - WHITESPACE " " - LIMIT_KW "limit" - WHITESPACE " " - LITERAL - INT_NUMBER "10" - WHITESPACE "\n " - ENCRYPTED_KW "encrypted" - WHITESPACE " " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "''" - WHITESPACE "\n " - PASSWORD_KW "password" - WHITESPACE " " - NULL_KW "null" - WHITESPACE "\n " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'foo'" - WHITESPACE "\n " - VALID_KW "valid" - WHITESPACE " " - UNTIL_KW "until" - WHITESPACE " " - LITERAL - STRING "'2025-01-01'" + ROLE_OPTION_LIST + WITH_KW "with" + WHITESPACE " \n " + ROLE_OPTION + IDENT "superuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createdb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreatedb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createrole" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreaterole" + WHITESPACE "\n " + ROLE_OPTION + INHERIT_KW "inherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noinherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "login" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nologin" + WHITESPACE "\n " + ROLE_OPTION + IDENT "replication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noreplication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "bypassrls" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nobypassrls" + WHITESPACE "\n " + ROLE_OPTION + CONNECTION_KW "connection" + WHITESPACE " " + LIMIT_KW "limit" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + WHITESPACE "\n " + ROLE_OPTION + ENCRYPTED_KW "encrypted" + WHITESPACE " " + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "''" + WHITESPACE "\n " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + NULL_KW "null" + WHITESPACE "\n " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'foo'" + WHITESPACE "\n " + ROLE_OPTION + VALID_KW "valid" + WHITESPACE " " + UNTIL_KW "until" + WHITESPACE " " + LITERAL + STRING "'2025-01-01'" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- rename_user" diff --git a/crates/squawk_parser/tests/snapshots/tests__analyze_ok.snap b/crates/squawk_parser/tests/snapshots/tests__analyze_ok.snap index 471ef9d0..580abe87 100644 --- a/crates/squawk_parser/tests/snapshots/tests__analyze_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__analyze_ok.snap @@ -72,21 +72,25 @@ SOURCE_FILE ANALYZE ANALYZE_KW "analyze" WHITESPACE " " - L_PAREN "(" - VERBOSE_KW "verbose" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE " " - IDENT "skip_locked" - COMMA "," - WHITESPACE " " - IDENT "buffer_usage_limit" - WHITESPACE " " - LITERAL - INT_NUMBER "10" - R_PAREN ")" + OPTION_ITEM_LIST + L_PAREN "(" + OPTION_ITEM + VERBOSE_KW "verbose" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE " " + OPTION_ITEM + IDENT "skip_locked" + COMMA "," + WHITESPACE " " + OPTION_ITEM + IDENT "buffer_usage_limit" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + R_PAREN ")" WHITESPACE " " RELATION_NAME PATH diff --git a/crates/squawk_parser/tests/snapshots/tests__cluster_ok.snap b/crates/squawk_parser/tests/snapshots/tests__cluster_ok.snap index 65728bc7..198253cc 100644 --- a/crates/squawk_parser/tests/snapshots/tests__cluster_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__cluster_ok.snap @@ -14,12 +14,14 @@ SOURCE_FILE CLUSTER CLUSTER_KW "cluster" WHITESPACE " " - L_PAREN "(" - VERBOSE_KW "verbose" - WHITESPACE " " - LITERAL - FALSE_KW "false" - R_PAREN ")" + OPTION_ITEM_LIST + L_PAREN "(" + OPTION_ITEM + VERBOSE_KW "verbose" + WHITESPACE " " + LITERAL + FALSE_KW "false" + R_PAREN ")" WHITESPACE " " PATH PATH @@ -42,12 +44,14 @@ SOURCE_FILE CLUSTER CLUSTER_KW "cluster" WHITESPACE " " - L_PAREN "(" - VERBOSE_KW "verbose" - WHITESPACE " " - LITERAL - FALSE_KW "false" - R_PAREN ")" + OPTION_ITEM_LIST + L_PAREN "(" + OPTION_ITEM + VERBOSE_KW "verbose" + WHITESPACE " " + LITERAL + FALSE_KW "false" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- pre_14" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_foreign_data_wrapper_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_foreign_data_wrapper_ok.snap index 7bfe24c4..b1c8b369 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_foreign_data_wrapper_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_foreign_data_wrapper_ok.snap @@ -64,21 +64,24 @@ SOURCE_FILE WHITESPACE " " VALIDATOR_KW "validator" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - WHITESPACE " " - LITERAL - STRING "'foo'" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - LITERAL - STRING "'bar'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "a" + WHITESPACE " " + LITERAL + STRING "'foo'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + NAME + IDENT "b" + WHITESPACE " " + LITERAL + STRING "'bar'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" 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 32dd90e8..f72ae076 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 @@ -71,22 +71,25 @@ SOURCE_FILE NAME_REF BIGINT_KW "bigint" WHITESPACE " \n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - WHITESPACE " " - LITERAL - STRING "'b'" - COMMA "," - WHITESPACE " " - NAME - IDENT "c" - WHITESPACE " " - LITERAL - STRING "'d'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "a" + WHITESPACE " " + LITERAL + STRING "'b'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + NAME + IDENT "c" + WHITESPACE " " + LITERAL + STRING "'d'" + R_PAREN ")" WHITESPACE " \n " COLLATE COLLATE_KW "collate" @@ -207,22 +210,25 @@ SOURCE_FILE NAME_REF IDENT "s" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - WHITESPACE " " - LITERAL - STRING "'b'" - COMMA "," - WHITESPACE " " - NAME - IDENT "c" - WHITESPACE " " - LITERAL - STRING "'d'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "a" + WHITESPACE " " + LITERAL + STRING "'b'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + NAME + IDENT "c" + WHITESPACE " " + LITERAL + STRING "'d'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- partitioned_simple" @@ -358,22 +364,25 @@ SOURCE_FILE NAME_REF IDENT "s" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - WHITESPACE " " - LITERAL - STRING "'b'" - COMMA "," - WHITESPACE " " - NAME - IDENT "c" - WHITESPACE " " - LITERAL - STRING "'d'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "a" + WHITESPACE " " + LITERAL + STRING "'b'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + NAME + IDENT "c" + WHITESPACE " " + LITERAL + STRING "'d'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- partitioned_bound_spec_in" @@ -612,16 +621,18 @@ SOURCE_FILE NAME_REF IDENT "cal_server" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - OBJECT_KW "object" - WHITESPACE " " - LITERAL - STRING "'event-types'" - WHITESPACE "\n " - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + ALTER_OPTION + NAME + OBJECT_KW "object" + WHITESPACE " " + LITERAL + STRING "'event-types'" + WHITESPACE "\n " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_group_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_group_ok.snap index 028da18b..4a4f0348 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_group_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_group_ok.snap @@ -24,106 +24,132 @@ SOURCE_FILE NAME IDENT "g" WHITESPACE "\n " - WITH_KW "with" - WHITESPACE " " - IDENT "superuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "createdb" - WHITESPACE "\n " - IDENT "nocreatedb" - WHITESPACE "\n " - IDENT "createrole" - WHITESPACE "\n " - IDENT "nocreaterole" - WHITESPACE "\n " - INHERIT_KW "inherit" - WHITESPACE "\n " - IDENT "noinherit" - WHITESPACE "\n " - IDENT "login" - WHITESPACE "\n " - IDENT "nologin" - WHITESPACE "\n " - IDENT "replication" - WHITESPACE "\n " - IDENT "noreplication" - WHITESPACE "\n " - IDENT "bypassrls" - WHITESPACE "\n " - IDENT "nobypassrls" - WHITESPACE "\n " - CONNECTION_KW "connection" - WHITESPACE " " - LIMIT_KW "limit" - WHITESPACE " " - LITERAL - INT_NUMBER "100" - WHITESPACE "\n " - ENCRYPTED_KW "encrypted" - WHITESPACE " " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'foo'" - WHITESPACE "\n " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'bar'" - WHITESPACE "\n " - PASSWORD_KW "password" - WHITESPACE " " - NULL_KW "null" - WHITESPACE "\n " - VALID_KW "valid" - WHITESPACE " " - UNTIL_KW "until" - WHITESPACE " " - LITERAL - STRING "'2042-02-22'" - WHITESPACE "\n " - IN_KW "in" - WHITESPACE " " - ROLE_KW "role" - WHITESPACE " " - IDENT "foo" - COMMA "," - WHITESPACE " " - IDENT "bar" - COMMA "," - WHITESPACE " " - IDENT "buzz" - WHITESPACE "\n " - IN_KW "in" - WHITESPACE " " - GROUP_KW "group" - WHITESPACE " " - IDENT "foo" - WHITESPACE "\n " - ROLE_KW "role" - WHITESPACE " " - IDENT "r" - COMMA "," - WHITESPACE " " - CURRENT_USER_KW "current_user" - WHITESPACE "\n " - ADMIN_KW "admin" - WHITESPACE " " - IDENT "foo" - COMMA "," - WHITESPACE " " - IDENT "bar" - COMMA "," - WHITESPACE " " - IDENT "buzz" - WHITESPACE "\n " - SYSID_KW "sysid" - WHITESPACE " " - LITERAL - INT_NUMBER "100" + ROLE_OPTION_LIST + WITH_KW "with" + WHITESPACE " " + ROLE_OPTION + IDENT "superuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createdb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreatedb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createrole" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreaterole" + WHITESPACE "\n " + ROLE_OPTION + INHERIT_KW "inherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noinherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "login" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nologin" + WHITESPACE "\n " + ROLE_OPTION + IDENT "replication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noreplication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "bypassrls" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nobypassrls" + WHITESPACE "\n " + ROLE_OPTION + CONNECTION_KW "connection" + WHITESPACE " " + LIMIT_KW "limit" + WHITESPACE " " + LITERAL + INT_NUMBER "100" + WHITESPACE "\n " + ROLE_OPTION + ENCRYPTED_KW "encrypted" + WHITESPACE " " + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'foo'" + WHITESPACE "\n " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'bar'" + WHITESPACE "\n " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + NULL_KW "null" + WHITESPACE "\n " + ROLE_OPTION + VALID_KW "valid" + WHITESPACE " " + UNTIL_KW "until" + WHITESPACE " " + LITERAL + STRING "'2042-02-22'" + WHITESPACE "\n " + ROLE_OPTION + IN_KW "in" + WHITESPACE " " + ROLE_KW "role" + WHITESPACE " " + IDENT "foo" + COMMA "," + WHITESPACE " " + IDENT "bar" + COMMA "," + WHITESPACE " " + IDENT "buzz" + WHITESPACE "\n " + ROLE_OPTION + IN_KW "in" + WHITESPACE " " + GROUP_KW "group" + WHITESPACE " " + IDENT "foo" + WHITESPACE "\n " + ROLE_OPTION + ROLE_KW "role" + WHITESPACE " " + IDENT "r" + COMMA "," + WHITESPACE " " + CURRENT_USER_KW "current_user" + WHITESPACE "\n " + ROLE_OPTION + ADMIN_KW "admin" + WHITESPACE " " + IDENT "foo" + COMMA "," + WHITESPACE " " + IDENT "bar" + COMMA "," + WHITESPACE " " + IDENT "buzz" + WHITESPACE "\n " + ROLE_OPTION + SYSID_KW "sysid" + WHITESPACE " " + LITERAL + INT_NUMBER "100" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_role_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_role_ok.snap index cc2ec82b..854fbe7f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_role_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_role_ok.snap @@ -24,93 +24,118 @@ SOURCE_FILE NAME IDENT "u" WHITESPACE "\n " - WITH_KW "with" - WHITESPACE " " - IDENT "superuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "createdb" - WHITESPACE "\n " - IDENT "nocreatedb" - WHITESPACE "\n " - IDENT "createrole" - WHITESPACE "\n " - IDENT "nocreaterole" - WHITESPACE "\n " - INHERIT_KW "inherit" - WHITESPACE "\n " - IDENT "noinherit" - WHITESPACE "\n " - IDENT "login" - WHITESPACE "\n " - IDENT "nologin" - WHITESPACE "\n " - IDENT "replication" - WHITESPACE "\n " - IDENT "noreplication" - WHITESPACE "\n " - IDENT "bypassrls" - WHITESPACE "\n " - IDENT "nobypassrls" - WHITESPACE "\n " - CONNECTION_KW "connection" - WHITESPACE " " - LIMIT_KW "limit" - WHITESPACE " " - LITERAL - INT_NUMBER "100" - WHITESPACE "\n " - ENCRYPTED_KW "encrypted" - WHITESPACE " " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'foo'" - WHITESPACE "\n " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'bar'" - WHITESPACE " " - PASSWORD_KW "password" - WHITESPACE " " - NULL_KW "null" - WHITESPACE "\n " - VALID_KW "valid" - WHITESPACE " " - UNTIL_KW "until" - WHITESPACE " " - LITERAL - STRING "'2042-02-22'" - WHITESPACE "\n " - IN_KW "in" - WHITESPACE " " - ROLE_KW "role" - WHITESPACE " " - IDENT "foo" - COMMA "," - WHITESPACE " " - IDENT "bar" - COMMA "," - WHITESPACE " " - IDENT "buzz" - WHITESPACE "\n " - IN_KW "in" - WHITESPACE " " - GROUP_KW "group" - WHITESPACE " " - IDENT "foo" - WHITESPACE "\n " - ADMIN_KW "admin" - WHITESPACE " " - IDENT "foo" - WHITESPACE "\n " - SYSID_KW "sysid" - WHITESPACE " " - LITERAL - INT_NUMBER "100" + ROLE_OPTION_LIST + WITH_KW "with" + WHITESPACE " " + ROLE_OPTION + IDENT "superuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createdb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreatedb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createrole" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreaterole" + WHITESPACE "\n " + ROLE_OPTION + INHERIT_KW "inherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noinherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "login" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nologin" + WHITESPACE "\n " + ROLE_OPTION + IDENT "replication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noreplication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "bypassrls" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nobypassrls" + WHITESPACE "\n " + ROLE_OPTION + CONNECTION_KW "connection" + WHITESPACE " " + LIMIT_KW "limit" + WHITESPACE " " + LITERAL + INT_NUMBER "100" + WHITESPACE "\n " + ROLE_OPTION + ENCRYPTED_KW "encrypted" + WHITESPACE " " + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'foo'" + WHITESPACE "\n " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'bar'" + WHITESPACE " " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + NULL_KW "null" + WHITESPACE "\n " + ROLE_OPTION + VALID_KW "valid" + WHITESPACE " " + UNTIL_KW "until" + WHITESPACE " " + LITERAL + STRING "'2042-02-22'" + WHITESPACE "\n " + ROLE_OPTION + IN_KW "in" + WHITESPACE " " + ROLE_KW "role" + WHITESPACE " " + IDENT "foo" + COMMA "," + WHITESPACE " " + IDENT "bar" + COMMA "," + WHITESPACE " " + IDENT "buzz" + WHITESPACE "\n " + ROLE_OPTION + IN_KW "in" + WHITESPACE " " + GROUP_KW "group" + WHITESPACE " " + IDENT "foo" + WHITESPACE "\n " + ROLE_OPTION + ADMIN_KW "admin" + WHITESPACE " " + IDENT "foo" + WHITESPACE "\n " + ROLE_OPTION + SYSID_KW "sysid" + WHITESPACE " " + LITERAL + INT_NUMBER "100" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_server_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_server_ok.snap index e144fcd3..9bd6bc87 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_server_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_server_ok.snap @@ -59,22 +59,25 @@ SOURCE_FILE NAME_REF IDENT "f" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - WHITESPACE " " - LITERAL - STRING "'foo'" - COMMA "," - WHITESPACE " " - NAME - IDENT "bar" - WHITESPACE " " - LITERAL - STRING "'b'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "a" + WHITESPACE " " + LITERAL + STRING "'foo'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + NAME + IDENT "bar" + WHITESPACE " " + LITERAL + STRING "'b'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- docs_1" @@ -96,28 +99,32 @@ SOURCE_FILE NAME_REF IDENT "postgres_fdw" WHITESPACE " " - OPTIONS_KW "OPTIONS" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "host" - WHITESPACE " " - LITERAL - STRING "'foo'" - COMMA "," - WHITESPACE " " - NAME - IDENT "dbname" - WHITESPACE " " - LITERAL - STRING "'foodb'" - COMMA "," - WHITESPACE " " - NAME - IDENT "port" - WHITESPACE " " - LITERAL - STRING "'5432'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "OPTIONS" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "host" + WHITESPACE " " + LITERAL + STRING "'foo'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + NAME + IDENT "dbname" + WHITESPACE " " + LITERAL + STRING "'foodb'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + NAME + IDENT "port" + WHITESPACE " " + LITERAL + STRING "'5432'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_user_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_user_ok.snap index 810af43d..f1f6c755 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_user_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_user_ok.snap @@ -24,101 +24,128 @@ SOURCE_FILE NAME IDENT "u" WHITESPACE "\n " - WITH_KW "with" - WHITESPACE " " - IDENT "superuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "nosuperuser" - WHITESPACE "\n " - IDENT "createdb" - WHITESPACE "\n " - IDENT "nocreatedb" - WHITESPACE "\n " - IDENT "createrole" - WHITESPACE "\n " - IDENT "nocreaterole" - WHITESPACE "\n " - INHERIT_KW "inherit" - WHITESPACE "\n " - IDENT "noinherit" - WHITESPACE "\n " - IDENT "login" - WHITESPACE "\n " - IDENT "nologin" - WHITESPACE "\n " - IDENT "replication" - WHITESPACE "\n " - IDENT "noreplication" - WHITESPACE "\n " - IDENT "bypassrls" - WHITESPACE "\n " - IDENT "nobypassrls" - WHITESPACE "\n " - CONNECTION_KW "connection" - WHITESPACE " " - LIMIT_KW "limit" - WHITESPACE " " - LITERAL - INT_NUMBER "100" - WHITESPACE "\n " - ENCRYPTED_KW "encrypted" - WHITESPACE " " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'foo'" - WHITESPACE "\n " - PASSWORD_KW "password" - WHITESPACE " " - LITERAL - STRING "'bar'" - WHITESPACE "\n " - PASSWORD_KW "password" - WHITESPACE " " - NULL_KW "null" - WHITESPACE "\n " - VALID_KW "valid" - WHITESPACE " " - UNTIL_KW "until" - WHITESPACE " " - LITERAL - STRING "'2042-02-22'" - WHITESPACE "\n " - IN_KW "in" - WHITESPACE " " - ROLE_KW "role" - WHITESPACE " " - IDENT "foo" - COMMA "," - WHITESPACE " " - IDENT "bar" - COMMA "," - WHITESPACE " " - IDENT "buzz" - WHITESPACE "\n " - IN_KW "in" - WHITESPACE " " - GROUP_KW "group" - WHITESPACE " " - IDENT "foo" - WHITESPACE "\n " - ROLE_KW "role" - WHITESPACE " " - IDENT "foo" - WHITESPACE "\n " - ADMIN_KW "admin" - WHITESPACE " " - IDENT "foo" - WHITESPACE "\n " - USER_KW "user" - WHITESPACE " " - IDENT "foo" - WHITESPACE "\n " - SYSID_KW "sysid" - WHITESPACE " " - LITERAL - INT_NUMBER "100" + ROLE_OPTION_LIST + WITH_KW "with" + WHITESPACE " " + ROLE_OPTION + IDENT "superuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nosuperuser" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createdb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreatedb" + WHITESPACE "\n " + ROLE_OPTION + IDENT "createrole" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nocreaterole" + WHITESPACE "\n " + ROLE_OPTION + INHERIT_KW "inherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noinherit" + WHITESPACE "\n " + ROLE_OPTION + IDENT "login" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nologin" + WHITESPACE "\n " + ROLE_OPTION + IDENT "replication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "noreplication" + WHITESPACE "\n " + ROLE_OPTION + IDENT "bypassrls" + WHITESPACE "\n " + ROLE_OPTION + IDENT "nobypassrls" + WHITESPACE "\n " + ROLE_OPTION + CONNECTION_KW "connection" + WHITESPACE " " + LIMIT_KW "limit" + WHITESPACE " " + LITERAL + INT_NUMBER "100" + WHITESPACE "\n " + ROLE_OPTION + ENCRYPTED_KW "encrypted" + WHITESPACE " " + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'foo'" + WHITESPACE "\n " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + LITERAL + STRING "'bar'" + WHITESPACE "\n " + ROLE_OPTION + PASSWORD_KW "password" + WHITESPACE " " + NULL_KW "null" + WHITESPACE "\n " + ROLE_OPTION + VALID_KW "valid" + WHITESPACE " " + UNTIL_KW "until" + WHITESPACE " " + LITERAL + STRING "'2042-02-22'" + WHITESPACE "\n " + ROLE_OPTION + IN_KW "in" + WHITESPACE " " + ROLE_KW "role" + WHITESPACE " " + IDENT "foo" + COMMA "," + WHITESPACE " " + IDENT "bar" + COMMA "," + WHITESPACE " " + IDENT "buzz" + WHITESPACE "\n " + ROLE_OPTION + IN_KW "in" + WHITESPACE " " + GROUP_KW "group" + WHITESPACE " " + IDENT "foo" + WHITESPACE "\n " + ROLE_OPTION + ROLE_KW "role" + WHITESPACE " " + IDENT "foo" + WHITESPACE "\n " + ROLE_OPTION + ADMIN_KW "admin" + WHITESPACE " " + IDENT "foo" + WHITESPACE "\n " + ROLE_OPTION + USER_KW "user" + WHITESPACE " " + IDENT "foo" + WHITESPACE "\n " + ROLE_OPTION + SYSID_KW "sysid" + WHITESPACE " " + LITERAL + INT_NUMBER "100" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__import_foreign_schema_ok.snap b/crates/squawk_parser/tests/snapshots/tests__import_foreign_schema_ok.snap index 943648e9..b9b102c2 100644 --- a/crates/squawk_parser/tests/snapshots/tests__import_foreign_schema_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__import_foreign_schema_ok.snap @@ -88,15 +88,17 @@ SOURCE_FILE NAME_REF IDENT "c" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "foo" - WHITESPACE " " - LITERAL - STRING "'bar'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "foo" + WHITESPACE " " + LITERAL + STRING "'bar'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- options_multi" @@ -123,22 +125,25 @@ SOURCE_FILE NAME_REF IDENT "c" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "foo" - WHITESPACE " " - LITERAL - STRING "'bar'" - COMMA "," - WHITESPACE " " - NAME - IDENT "a" - WHITESPACE " " - LITERAL - STRING "'b'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "foo" + WHITESPACE " " + LITERAL + STRING "'bar'" + COMMA "," + WHITESPACE " " + ALTER_OPTION + NAME + IDENT "a" + WHITESPACE " " + LITERAL + STRING "'b'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_1" diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index 2a5d6fe2..7bf25587 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -3191,45 +3191,51 @@ SOURCE_FILE NAME_REF IDENT "wasm_wrapper" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "fdw_package_url" - WHITESPACE " " - LITERAL - STRING "'https://github.com/supabase/wrappers/releases/download/wasm_cal_fdw_v0.1.0/cal_fdw.wasm'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "fdw_package_name" - WHITESPACE " " - LITERAL - STRING "'supabase:cal-fdw'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "fdw_package_version" - WHITESPACE " " - LITERAL - STRING "'0.1.0'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "fdw_package_checksum" - WHITESPACE " " - LITERAL - STRING "'4afe4fac8c51f2caa1de8483b3817d2cec3a14cd8a65a3942c8b4ff6c430f08a'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "api_key" - WHITESPACE " " - LITERAL - STRING "''" - WHITESPACE "\n " - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + ALTER_OPTION + NAME + IDENT "fdw_package_url" + WHITESPACE " " + LITERAL + STRING "'https://github.com/supabase/wrappers/releases/download/wasm_cal_fdw_v0.1.0/cal_fdw.wasm'" + COMMA "," + WHITESPACE "\n " + ALTER_OPTION + NAME + IDENT "fdw_package_name" + WHITESPACE " " + LITERAL + STRING "'supabase:cal-fdw'" + COMMA "," + WHITESPACE "\n " + ALTER_OPTION + NAME + IDENT "fdw_package_version" + WHITESPACE " " + LITERAL + STRING "'0.1.0'" + COMMA "," + WHITESPACE "\n " + ALTER_OPTION + NAME + IDENT "fdw_package_checksum" + WHITESPACE " " + LITERAL + STRING "'4afe4fac8c51f2caa1de8483b3817d2cec3a14cd8a65a3942c8b4ff6c430f08a'" + COMMA "," + WHITESPACE "\n " + ALTER_OPTION + NAME + IDENT "api_key" + WHITESPACE " " + LITERAL + STRING "''" + WHITESPACE "\n " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_SCHEMA @@ -3283,17 +3289,19 @@ SOURCE_FILE NAME_REF IDENT "cal_server" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - OBJECT_KW "object" - WHITESPACE " " - LITERAL - STRING "'event-types'" - WHITESPACE "\n " - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + ALTER_OPTION + NAME + OBJECT_KW "object" + WHITESPACE " " + LITERAL + STRING "'event-types'" + WHITESPACE "\n " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_FOREIGN_TABLE @@ -3331,24 +3339,27 @@ SOURCE_FILE NAME_REF IDENT "cal_server" WHITESPACE "\n " - OPTIONS_KW "options" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - OBJECT_KW "object" - WHITESPACE " " - LITERAL - STRING "'bookings'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "rowid_column" - WHITESPACE " " - LITERAL - STRING "'attrs'" - WHITESPACE "\n " - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "options" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + ALTER_OPTION + NAME + OBJECT_KW "object" + WHITESPACE " " + LITERAL + STRING "'bookings'" + COMMA "," + WHITESPACE "\n " + ALTER_OPTION + NAME + IDENT "rowid_column" + WHITESPACE " " + LITERAL + STRING "'attrs'" + WHITESPACE "\n " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- extract event types" @@ -4368,14 +4379,16 @@ SOURCE_FILE NAME_REF IDENT "cstore_server" WHITESPACE "\n" - OPTIONS_KW "OPTIONS" - L_PAREN "(" - NAME - COMPRESSION_KW "compression" - WHITESPACE " " - LITERAL - STRING "'pglz'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "OPTIONS" + L_PAREN "(" + ALTER_OPTION + NAME + COMPRESSION_KW "compression" + WHITESPACE " " + LITERAL + STRING "'pglz'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_EXTENSION @@ -4437,15 +4450,17 @@ SOURCE_FILE NAME_REF IDENT "parquet_server" WHITESPACE "\n" - OPTIONS_KW "OPTIONS" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "files" - WHITESPACE " " - LITERAL - STRING "'s3://bucket/metrics/*.parquet'" - R_PAREN ")" + ALTER_OPTION_LIST + OPTIONS_KW "OPTIONS" + WHITESPACE " " + L_PAREN "(" + ALTER_OPTION + NAME + IDENT "files" + WHITESPACE " " + LITERAL + STRING "'s3://bucket/metrics/*.parquet'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_EXTENSION diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index 45997d21..3ad774e2 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -550,6 +550,44 @@ impl AlterOperatorFamily { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AlterOption { + pub(crate) syntax: SyntaxNode, +} +impl AlterOption { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn add_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ADD_KW) + } + #[inline] + pub fn drop_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DROP_KW) + } + #[inline] + pub fn set_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SET_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AlterOptionList { + pub(crate) syntax: SyntaxNode, +} +impl AlterOptionList { + #[inline] + pub fn alter_options(&self) -> AstChildren { + support::children(&self.syntax) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct AlterPolicy { pub(crate) syntax: SyntaxNode, @@ -711,6 +749,10 @@ pub struct AlterServer { pub(crate) syntax: SyntaxNode, } impl AlterServer { + #[inline] + pub fn alter_option_list(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn name_ref(&self) -> Option { support::child(&self.syntax) @@ -1048,6 +1090,10 @@ pub struct Analyze { pub(crate) syntax: SyntaxNode, } impl Analyze { + #[inline] + pub fn option_item_list(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn analyze_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ANALYZE_KW) @@ -2213,6 +2259,10 @@ impl CreateGroup { support::child(&self.syntax) } #[inline] + pub fn role_option_list(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn create_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::CREATE_KW) } @@ -7556,10 +7606,29 @@ impl OperatorCall { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct OptionsList { +pub struct OptionItem { + pub(crate) syntax: SyntaxNode, +} +impl OptionItem { + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn default_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DEFAULT_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct OptionItemList { pub(crate) syntax: SyntaxNode, } -impl OptionsList { +impl OptionItemList { + #[inline] + pub fn option_items(&self) -> AstChildren { + support::children(&self.syntax) + } #[inline] pub fn l_paren_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::L_PAREN) @@ -7568,10 +7637,6 @@ impl OptionsList { pub fn r_paren_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::R_PAREN) } - #[inline] - pub fn option_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::OPTION_KW) - } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -8698,6 +8763,32 @@ impl Role { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RoleOption { + pub(crate) syntax: SyntaxNode, +} +impl RoleOption { + #[inline] + pub fn inherit_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::INHERIT_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RoleOptionList { + pub(crate) syntax: SyntaxNode, +} +impl RoleOptionList { + #[inline] + pub fn role_options(&self) -> AstChildren { + support::children(&self.syntax) + } + #[inline] + pub fn with_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::WITH_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Rollback { pub(crate) syntax: SyntaxNode, @@ -10699,7 +10790,7 @@ pub enum AlterTableAction { NoInherit(NoInherit), NotOf(NotOf), OfType(OfType), - OptionsList(OptionsList), + OptionItemList(OptionItemList), OwnerTo(OwnerTo), RenameColumn(RenameColumn), RenameConstraint(RenameConstraint), @@ -11567,6 +11658,42 @@ impl AstNode for AlterOperatorFamily { &self.syntax } } +impl AstNode for AlterOption { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ALTER_OPTION + } + #[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 AlterOptionList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ALTER_OPTION_LIST + } + #[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 AlterPolicy { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -17363,10 +17490,28 @@ impl AstNode for OperatorCall { &self.syntax } } -impl AstNode for OptionsList { +impl AstNode for OptionItem { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::OPTIONS_LIST + kind == SyntaxKind::OPTION_ITEM + } + #[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 OptionItemList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::OPTION_ITEM_LIST } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -18461,6 +18606,42 @@ impl AstNode for Role { &self.syntax } } +impl AstNode for RoleOption { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ROLE_OPTION + } + #[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 RoleOptionList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ROLE_OPTION_LIST + } + #[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 Rollback { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -20670,7 +20851,7 @@ impl AstNode for AlterTableAction { | SyntaxKind::NO_INHERIT | SyntaxKind::NOT_OF | SyntaxKind::OF_TYPE - | SyntaxKind::OPTIONS_LIST + | SyntaxKind::OPTION_ITEM_LIST | SyntaxKind::OWNER_TO | SyntaxKind::RENAME_COLUMN | SyntaxKind::RENAME_CONSTRAINT @@ -20734,7 +20915,9 @@ impl AstNode for AlterTableAction { SyntaxKind::NO_INHERIT => AlterTableAction::NoInherit(NoInherit { syntax }), SyntaxKind::NOT_OF => AlterTableAction::NotOf(NotOf { syntax }), SyntaxKind::OF_TYPE => AlterTableAction::OfType(OfType { syntax }), - SyntaxKind::OPTIONS_LIST => AlterTableAction::OptionsList(OptionsList { syntax }), + SyntaxKind::OPTION_ITEM_LIST => { + AlterTableAction::OptionItemList(OptionItemList { syntax }) + } SyntaxKind::OWNER_TO => AlterTableAction::OwnerTo(OwnerTo { syntax }), SyntaxKind::RENAME_COLUMN => AlterTableAction::RenameColumn(RenameColumn { syntax }), SyntaxKind::RENAME_CONSTRAINT => { @@ -20800,7 +20983,7 @@ impl AstNode for AlterTableAction { AlterTableAction::NoInherit(it) => &it.syntax, AlterTableAction::NotOf(it) => &it.syntax, AlterTableAction::OfType(it) => &it.syntax, - AlterTableAction::OptionsList(it) => &it.syntax, + AlterTableAction::OptionItemList(it) => &it.syntax, AlterTableAction::OwnerTo(it) => &it.syntax, AlterTableAction::RenameColumn(it) => &it.syntax, AlterTableAction::RenameConstraint(it) => &it.syntax, @@ -20969,10 +21152,10 @@ impl From for AlterTableAction { AlterTableAction::OfType(node) } } -impl From for AlterTableAction { +impl From for AlterTableAction { #[inline] - fn from(node: OptionsList) -> AlterTableAction { - AlterTableAction::OptionsList(node) + fn from(node: OptionItemList) -> AlterTableAction { + AlterTableAction::OptionItemList(node) } } impl From for AlterTableAction { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 25b764b1..f466e6c9 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -505,11 +505,13 @@ AlterTableAction = | RenameColumn | AlterConstraint | AlterColumn -| OptionsList +| OptionItemList -OptionsList = - 'option' '(' ')' +OptionItemList = + '(' (OptionItem (',' OptionItem)*) ')' +OptionItem = + ('default' | Expr) RelationName = 'only' ( '(' Path ')' | Path ) @@ -1283,7 +1285,15 @@ AlterStatistics = 'alter' 'statistics' NameRef AlterServer = - 'alter' 'server' NameRef + 'alter' 'server' NameRef AlterOptionList + +AlterOptionList = + AlterOption (',' AlterOption)* + +AlterOption = + 'add' NameRef Literal +| 'set' NameRef Literal +| 'drop' NameRef AlterSequence = 'alter' 'sequence' NameRef @@ -1400,7 +1410,7 @@ AlterView = 'alter' 'view' NameRef Analyze = - 'analyze' 'verbose'? + 'analyze' 'verbose'? OptionItemList // suffix it with `On` to avoid conflicting with comment nodes CommentOn = @@ -1437,7 +1447,13 @@ CreateForeignTable = 'create' 'foreign' 'table' IfNotExists? CreateGroup = - 'create' 'group' NameRef + 'create' 'group' NameRef RoleOptionList + +RoleOptionList = + 'with'? RoleOption* + +RoleOption = + 'inherit' CreateLanguage = 'create' 'language' NameRef