From 65fa5e4320fea06ce27005895bd01fcfd2e20429 Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Sat, 21 Jun 2025 19:06:43 -0400 Subject: [PATCH] parser: combine storage param list and attribute lists --- PLAN.md | 24 + .../src/generated/syntax_kind.rs | 3 + crates/squawk_parser/src/grammar.rs | 388 +--- .../tests__alter_foreign_table_ok.snap | 87 +- .../snapshots/tests__alter_index_ok.snap | 70 +- .../tests__alter_materialized_view_ok.snap | 88 +- .../snapshots/tests__alter_operator_ok.snap | 190 +- .../tests__alter_publication_ok.snap | 35 +- .../tests__alter_subscription_ok.snap | 166 +- .../snapshots/tests__alter_table_ok.snap | 279 +-- .../snapshots/tests__alter_tablespace_ok.snap | 106 +- ...ests__alter_text_search_dictionary_ok.snap | 33 +- .../tests/snapshots/tests__alter_type_ok.snap | 59 +- .../tests/snapshots/tests__alter_view_ok.snap | 95 +- .../snapshots/tests__create_aggregate_ok.snap | 1925 +++++++++-------- .../snapshots/tests__create_collation_ok.snap | 144 +- .../snapshots/tests__create_index_ok.snap | 400 ++-- .../tests__create_materialized_view_ok.snap | 57 +- .../snapshots/tests__create_operator_ok.snap | 286 +-- .../tests__create_publication_ok.snap | 70 +- .../tests__create_subscription_ok.snap | 252 +-- .../snapshots/tests__create_table_as_ok.snap | 29 +- .../snapshots/tests__create_table_ok.snap | 342 ++- .../tests__create_tablespace_ok.snap | 81 +- .../tests__create_text_search_config_ok.snap | 60 +- .../tests__create_text_search_dict_ok.snap | 110 +- .../tests__create_text_search_parser_ok.snap | 235 +- ...tests__create_text_search_template_ok.snap | 85 +- .../snapshots/tests__create_type_ok.snap | 547 ++--- .../snapshots/tests__create_view_ok.snap | 35 +- .../tests/snapshots/tests__misc_ok.snap | 163 +- .../squawk_syntax/src/ast/generated/nodes.rs | 107 + crates/squawk_syntax/src/postgresql.ungram | 13 +- ...st__alter_aggregate_params_validation.snap | 55 +- 34 files changed, 3382 insertions(+), 3237 deletions(-) diff --git a/PLAN.md b/PLAN.md index ab0c3961..e4e7785f 100644 --- a/PLAN.md +++ b/PLAN.md @@ -889,6 +889,30 @@ select foo, "a" from t; select foo, 'a' from t; ``` +### Quick Fix: in array + +```sql +select 1 in [1,2,3]; +-- or +select 1 in array[1,2,3]; + +-- become + +select 1 = any(array[1,2,3]); +``` + +### Quick Fix: in array to in tuple + +```sql +select 1 in [1,2,3]; +-- or +select 1 in array[1,2,3]; + +-- become + +select 1 in (1,2,3); +``` + ### Quick Fix: subquery to CTE ### Quick Fix: CTE to subquery diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index 227a4a4a..d83a6c4e 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -600,6 +600,8 @@ pub enum SyntaxKind { ARRAY_TYPE, AS_FUNC_OPTION, ATTACH_PARTITION, + ATTRIBUTE_LIST, + ATTRIBUTE_OPTION, AT_TIME_ZONE, BEGIN, BEGIN_FUNC_OPTION, @@ -883,6 +885,7 @@ pub enum SyntaxKind { PAREN_EXPR, PAREN_SELECT, PARTITION_BY, + PARTITION_ITEM, PARTITION_OF, PATH, PATH_SEGMENT, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index efe10b28..04085626 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -3274,18 +3274,6 @@ fn opt_sequence_options(p: &mut Parser<'_>) -> bool { } } -// storage_parameter [= value] -fn storage_parameter(p: &mut Parser<'_>) -> bool { - // storage_parameter - path_name_ref(p); - // [= value] - if p.eat(EQ) && !def_arg(p) { - p.error("expected a value for storage parameter"); - return false; - } - true -} - enum ColumnDefKind { Name, Ref, @@ -3386,16 +3374,7 @@ fn opt_with_params(p: &mut Parser<'_>) -> Option { if p.at(WITH_KW) && p.nth_at(1, L_PAREN) { let m = p.start(); p.bump(WITH_KW); - p.expect(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !storage_parameter(p) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); Some(m.complete(p, WITH_PARAMS)) } else { None @@ -4652,7 +4631,8 @@ fn drop_table(p: &mut Parser<'_>) -> CompletedMarker { // | ColId opt_collate opt_qualified_name // | func_expr_windowless opt_collate opt_qualified_name // | '(' a_expr ')' opt_collate opt_qualified_name -fn part_elem(p: &mut Parser<'_>, allow_extra_params: bool) -> bool { +fn partition_item(p: &mut Parser<'_>, allow_extra_params: bool) { + let m = p.start(); // TODO: this can be more strict if expr(p).is_none() { p.error("expected expr") @@ -4662,17 +4642,8 @@ fn part_elem(p: &mut Parser<'_>, allow_extra_params: bool) -> bool { opt_ident(p); if allow_extra_params { // [ ( opclass_parameter = value [, ... ] ) ] - if p.eat(L_PAREN) { - // TODO: - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Required) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + if p.at(L_PAREN) { + attribute_list(p); } // [ ASC | DESC ] let _ = p.eat(ASC_KW) || p.eat(DESC_KW); @@ -4681,7 +4652,7 @@ fn part_elem(p: &mut Parser<'_>, allow_extra_params: bool) -> bool { let _ = p.eat(FIRST_KW) || p.expect(LAST_KW); } } - true + m.complete(p, PARTITION_ITEM); } fn table_arg_list(p: &mut Parser<'_>, t: ColDefType) -> Option { @@ -5788,16 +5759,8 @@ fn alter_publication(p: &mut Parser<'_>) -> CompletedMarker { } SET_KW => { p.bump(SET_KW); - if p.eat(L_PAREN) { - while !p.at(EOF) && !p.at(R_PAREN) { - if !storage_parameter(p) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + if p.at(L_PAREN) { + attribute_list(p); } else { publication_object(p); while !p.at(EOF) && p.eat(COMMA) { @@ -6053,16 +6016,7 @@ fn alter_operator(p: &mut Parser<'_>) -> CompletedMarker { if p.eat(SCHEMA_KW) { name_ref(p); } else { - p.expect(L_PAREN); - if !attribute_option(p, AttributeValue::Either) { - p.error("expected option"); - } - while !p.at(EOF) && p.eat(COMMA) { - if !attribute_option(p, AttributeValue::Either) { - p.error("expected option"); - } - } - p.expect(R_PAREN); + attribute_list(p); } } _ => { @@ -6263,12 +6217,7 @@ fn alter_index(p: &mut Parser<'_>) -> CompletedMarker { p.bump(TABLESPACE_KW); path_name_ref(p); } else { - p.expect(L_PAREN); - storage_parameter(p); - while !p.at(EOF) && p.eat(COMMA) { - storage_parameter(p); - } - p.expect(R_PAREN); + attribute_list(p); } } ATTACH_KW => { @@ -6285,12 +6234,7 @@ fn alter_index(p: &mut Parser<'_>) -> CompletedMarker { } RESET_KW => { p.bump(RESET_KW); - p.expect(L_PAREN); - storage_parameter(p); - while !p.at(EOF) && p.eat(COMMA) { - storage_parameter(p); - } - p.expect(R_PAREN); + attribute_list(p); } ALTER_KW => { p.bump(ALTER_KW); @@ -6299,16 +6243,8 @@ fn alter_index(p: &mut Parser<'_>) -> CompletedMarker { p.error("expected numeric literal or name"); } p.expect(SET_KW); - if p.eat(L_PAREN) { - while !p.at(EOF) && !p.at(R_PAREN) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + if p.at(L_PAREN) { + attribute_list(p); } else { p.expect(STATISTICS_KW); if opt_numeric_literal(p).is_none() { @@ -7237,16 +7173,7 @@ fn alter_subscription(p: &mut Parser<'_>) -> CompletedMarker { } SET_KW if p.nth_at(1, L_PAREN) => { p.bump(SET_KW); - p.expect(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); } SET_KW | ADD_KW => { p.bump_any(); @@ -7276,16 +7203,7 @@ fn alter_subscription(p: &mut Parser<'_>) -> CompletedMarker { } SKIP_KW => { p.bump(SKIP_KW); - p.expect(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); } OWNER_KW => { p.bump(OWNER_KW); @@ -7308,16 +7226,7 @@ fn alter_subscription(p: &mut Parser<'_>) -> CompletedMarker { fn opt_with_options_list(p: &mut Parser<'_>) { if p.eat(WITH_KW) { - p.expect(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); } } @@ -7358,16 +7267,7 @@ fn alter_tablespace(p: &mut Parser<'_>) -> CompletedMarker { p.expect(TO_KW); role(p); } else if p.eat(SET_KW) || p.eat(RESET_KW) { - p.expect(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !storage_parameter(p) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); } else { p.error("expected RENAME, OWNER, SET, or RESET after tablespace name"); } @@ -7417,16 +7317,8 @@ fn alter_text_search_dict(p: &mut Parser<'_>) -> CompletedMarker { p.bump(SEARCH_KW); p.bump(DICTIONARY_KW); path_name_ref(p); - if p.eat(L_PAREN) { - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + if p.at(L_PAREN) { + attribute_list(p); } else if p.eat(RENAME_KW) { p.expect(TO_KW); name(p); @@ -7661,16 +7553,7 @@ fn alter_type(p: &mut Parser<'_>) -> CompletedMarker { if p.eat(SCHEMA_KW) { name_ref(p); } else { - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); } } RENAME_KW => { @@ -7869,30 +7752,12 @@ fn alter_view(p: &mut Parser<'_>) -> CompletedMarker { if p.eat(SCHEMA_KW) { name_ref(p); } else { - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); } } RESET_KW => { p.bump(RESET_KW); - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); } _ => p.error("expected ALTER, OWNER, RENAME, or SET"), } @@ -8221,16 +8086,7 @@ fn create_aggregate(p: &mut Parser<'_>) -> CompletedMarker { if !at_old_syntax { aggregate_arg_list(p); } - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); m.complete(p, CREATE_AGGREGATE) } @@ -8290,16 +8146,7 @@ fn create_collation(p: &mut Parser<'_>) -> CompletedMarker { if p.eat(FROM_KW) { path_name_ref(p); } else { - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Required) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); } m.complete(p, CREATE_COLLATION) } @@ -8679,9 +8526,7 @@ fn create_materialized_view(p: &mut Parser<'_>) -> CompletedMarker { name_ref(p); } opt_with_params(p); - if p.eat(TABLESPACE_KW) { - name_ref(p); - } + opt_tablespace(p); p.expect(AS_KW); // A SELECT, TABLE, or VALUES command. let statement = stmt( @@ -8722,16 +8567,7 @@ fn create_operator(p: &mut Parser<'_>) -> CompletedMarker { p.bump(CREATE_KW); p.bump(OPERATOR_KW); operator(p); - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); m.complete(p, CREATE_OPERATOR) } @@ -9222,16 +9058,7 @@ fn create_text_search_parser(p: &mut Parser<'_>) -> CompletedMarker { p.bump(SEARCH_KW); p.bump(PARSER_KW); path_name(p); - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Required) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); m.complete(p, CREATE_TEXT_SEARCH_PARSER) } @@ -9247,16 +9074,7 @@ fn create_text_search_dict(p: &mut Parser<'_>) -> CompletedMarker { p.bump(SEARCH_KW); p.bump(DICTIONARY_KW); path_name(p); - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Required) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); m.complete(p, CREATE_TEXT_SEARCH_PARSER) } @@ -9272,16 +9090,7 @@ fn create_text_search_config(p: &mut Parser<'_>) -> CompletedMarker { p.bump(SEARCH_KW); p.bump(CONFIGURATION_KW); path_name(p); - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Required) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); m.complete(p, CREATE_TEXT_SEARCH_PARSER) } @@ -9297,17 +9106,7 @@ fn create_text_search_template(p: &mut Parser<'_>) -> CompletedMarker { p.bump(SEARCH_KW); p.bump(TEMPLATE_KW); path_name(p); - p.expect(L_PAREN); - // definition in postgres grammar - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Required) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); m.complete(p, CREATE_TEXT_SEARCH_PARSER) } @@ -12538,9 +12337,7 @@ fn create_index(p: &mut Parser<'_>) -> CompletedMarker { // [ NULLS { FIRST | LAST } ] // [, ...] // ) - let param_list = p.start(); - partition_items(p, true); - param_list.complete(p, INDEX_PARAMS); + index_params(p); // [ INCLUDE ( column_name [, ...] ) ] opt_include_columns(p); // [ NULLS [ NOT ] DISTINCT ] @@ -12548,17 +12345,18 @@ fn create_index(p: &mut Parser<'_>) -> CompletedMarker { p.eat(NOT_KW); p.expect(DISTINCT_KW); } - // [ WITH ( storage_parameter [= value] [, ... ] ) ] opt_with_params(p); - // [ TABLESPACE tablespace_name ] - if p.eat(TABLESPACE_KW) { - name_ref(p); - } - // [ WHERE predicate ] + opt_tablespace(p); opt_where_clause(p); m.complete(p, CREATE_INDEX) } +fn index_params(p: &mut Parser<'_>) { + let m = p.start(); + partition_items(p, true); + m.complete(p, INDEX_PARAMS); +} + // ( // { column_name | ( expression ) } // [ COLLATE collation ] @@ -12578,9 +12376,7 @@ fn create_index(p: &mut Parser<'_>) -> CompletedMarker { fn partition_items(p: &mut Parser<'_>, allow_extra_params: bool) { p.expect(L_PAREN); while !p.at(EOF) && !p.at(R_PAREN) { - if !part_elem(p, allow_extra_params) { - break; - } + partition_item(p, allow_extra_params); if !p.eat(COMMA) { break; } @@ -13106,16 +12902,7 @@ fn create_type(p: &mut Parser<'_>) -> CompletedMarker { p.expect(R_PAREN); // AS RANGE } else if p.eat(RANGE_KW) { - p.expect(L_PAREN); - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Required) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); // AS } else { p.expect(L_PAREN); @@ -13131,16 +12918,8 @@ fn create_type(p: &mut Parser<'_>) -> CompletedMarker { } p.expect(R_PAREN); } - } else if p.eat(L_PAREN) { - while !p.at(EOF) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + } else if p.at(L_PAREN) { + attribute_list(p); } m.complete(p, CREATE_TYPE) } @@ -13738,31 +13517,13 @@ fn opt_alter_table_action(p: &mut Parser<'_>) -> Option { SET_UNLOGGED // SET ( storage_parameter [= value] [, ... ] ) } else { - p.expect(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !storage_parameter(p) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); SET_STORAGE_PARAMS } } RESET_KW => { p.bump(RESET_KW); - p.expect(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !storage_parameter(p) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); RESET_STORAGE_PARAMS } // RENAME CONSTRAINT constraint_name TO new_constraint_name @@ -13874,12 +13635,6 @@ fn col_label(p: &mut Parser<'_>) { } } -enum AttributeValue { - Either, - Required, - Disallowed, -} - // reloption_list: // | reloption_elem // | reloption_list ',' reloption_elem @@ -13888,25 +13643,19 @@ enum AttributeValue { // | ColLabel // | ColLabel '.' ColLabel '=' def_arg // | ColLabel '.' ColLabel -fn attribute_option(p: &mut Parser<'_>, option: AttributeValue) -> bool { +fn attribute_option(p: &mut Parser<'_>) -> bool { + let m = p.start(); if !opt_col_label(p) { + m.abandon(p); return false; } if p.eat(DOT) && !opt_col_label(p) { p.error("expected column label") } - match option { - AttributeValue::Required => { - p.expect(EQ); - def_arg(p); - } - AttributeValue::Disallowed => {} - AttributeValue::Either => { - if p.eat(EQ) { - def_arg(p); - } - } + if p.eat(EQ) { + def_arg(p); } + m.complete(p, ATTRIBUTE_OPTION); true } @@ -14041,16 +13790,7 @@ fn alter_column_option(p: &mut Parser<'_>) -> Option { // RESET ( attribute_option [, ... ] ) RESET_KW => { p.bump(RESET_KW); - p.expect(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !attribute_option(p, AttributeValue::Disallowed) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); RESET_OPTIONS } // TYPE data_type [ COLLATE collation ] [ USING expression ] @@ -14122,16 +13862,7 @@ fn alter_column_option(p: &mut Parser<'_>) -> Option { // SET ( attribute_option = value [, ... ] ) SET_KW if p.nth_at(1, L_PAREN) => { p.bump(SET_KW); - p.bump(L_PAREN); - while !p.at(EOF) && !p.at(R_PAREN) { - if !attribute_option(p, AttributeValue::Either) { - break; - } - if !p.eat(COMMA) { - break; - } - } - p.expect(R_PAREN); + attribute_list(p); SET_OPTIONS } // SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } @@ -14172,6 +13903,21 @@ fn alter_column_option(p: &mut Parser<'_>) -> Option { Some(kind) } +fn attribute_list(p: &mut Parser<'_>) { + let m = p.start(); + p.expect(L_PAREN); + while !p.at(EOF) && !p.at(R_PAREN) { + if !attribute_option(p) { + break; + } + if !p.eat(COMMA) { + break; + } + } + p.expect(R_PAREN); + m.complete(p, ATTRIBUTE_LIST); +} + fn opt_collate(p: &mut Parser<'_>) -> Option { let m = p.start(); if p.eat(COLLATE_KW) { 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 cb41f620..f5e64aaf 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 @@ -654,19 +654,22 @@ SOURCE_FILE SET_OPTIONS SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" ALTER_FOREIGN_TABLE @@ -690,19 +693,22 @@ SOURCE_FILE SET_OPTIONS SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- action_reset" @@ -730,14 +736,17 @@ SOURCE_FILE RESET_OPTIONS RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" ALTER_FOREIGN_TABLE @@ -761,10 +770,12 @@ SOURCE_FILE RESET_OPTIONS RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- action_set_storage" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_index_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_index_ok.snap index 13f85713..88442ab1 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_index_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_index_ok.snap @@ -121,12 +121,12 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "a" - R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" ALTER_INDEX @@ -151,24 +151,23 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "a" - EQ "=" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + EQ "=" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "b" - EQ "=" - LITERAL - STRING "'v'" - R_PAREN ")" + EQ "=" + LITERAL + STRING "'v'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- reset_params" @@ -185,12 +184,12 @@ SOURCE_FILE WHITESPACE " " RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "a" - R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" ALTER_INDEX @@ -215,18 +214,17 @@ SOURCE_FILE WHITESPACE " " RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "a" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "b" - R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- attach" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_materialized_view_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_materialized_view_ok.snap index 9fa95166..98f4bff9 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_materialized_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_materialized_view_ok.snap @@ -380,15 +380,17 @@ SOURCE_FILE SET_OPTIONS SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "n_distinct" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FLOAT_NUMBER "1.0" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "n_distinct" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FLOAT_NUMBER "1.0" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" ALTER_MATERIALIZED_VIEW @@ -411,24 +413,27 @@ SOURCE_FILE SET_OPTIONS SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- action_alter_col_reset" @@ -453,10 +458,12 @@ SOURCE_FILE RESET_OPTIONS RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "n_distinct" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "n_distinct" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" ALTER_MATERIALIZED_VIEW @@ -481,14 +488,17 @@ SOURCE_FILE RESET_OPTIONS RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "n_distinct" - COMMA "," - WHITESPACE " " - NAME - IDENT "n_distinct_inherited" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "n_distinct" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "n_distinct_inherited" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- action_alter_col_storage" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_operator_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_operator_ok.snap index b14e944a..547731c8 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_operator_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_operator_ok.snap @@ -96,80 +96,87 @@ SOURCE_FILE WHITESPACE " \n " SET_KW "set" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - RESTRICT_KW "restrict" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "r" - COMMA "," - WHITESPACE "\n " - NAME - JOIN_KW "join" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "j" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "commutator" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "c" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "negator" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "n" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "hashes" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "enabled" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "merges" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "enabled" - WHITESPACE "\n " - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + RESTRICT_KW "restrict" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "r" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + JOIN_KW "join" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "j" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "commutator" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "c" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "negator" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "n" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "hashes" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "enabled" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "merges" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "enabled" + WHITESPACE "\n " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- none_options" @@ -198,21 +205,24 @@ SOURCE_FILE WHITESPACE " \n " SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - RESTRICT_KW "restrict" - WHITESPACE " " - EQ "=" - WHITESPACE " " - NONE_KW "none" - COMMA "," - WHITESPACE " " - NAME - JOIN_KW "join" - WHITESPACE " " - EQ "=" - WHITESPACE " " - NONE_KW "none" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + RESTRICT_KW "restrict" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NONE_KW "none" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + JOIN_KW "join" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NONE_KW "none" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_publication_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_publication_ok.snap index f4c16f5a..08ffbd05 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_publication_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_publication_ok.snap @@ -234,26 +234,25 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "param1" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "param2" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - VALUE_KW "value" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + VALUE_KW "value" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- drop_table" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_subscription_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_subscription_ok.snap index 6c1b5967..af1d7435 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_subscription_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_subscription_ok.snap @@ -62,19 +62,22 @@ SOURCE_FILE WHITESPACE " " WITH_KW "with" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- add_publication" @@ -120,19 +123,22 @@ SOURCE_FILE WHITESPACE " " WITH_KW "with" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- drop_publication" @@ -178,19 +184,22 @@ SOURCE_FILE WHITESPACE " " WITH_KW "with" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- refresh" @@ -209,15 +218,17 @@ SOURCE_FILE WHITESPACE " " WITH_KW "with" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "copy_data" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "copy_data" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- enable" @@ -258,24 +269,27 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "slot_name" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'new_slot'" - COMMA "," - WHITESPACE " " - NAME - IDENT "synchronous_commit" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'off'" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "slot_name" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'new_slot'" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "synchronous_commit" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'off'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- skip" @@ -290,15 +304,17 @@ SOURCE_FILE WHITESPACE " " SKIP_KW "skip" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "lsn" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'0/12345678'" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "lsn" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'0/12345678'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- owner" 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 033b758c..733b3005 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap @@ -753,32 +753,35 @@ SOURCE_FILE SET_OPTIONS SET_KW "set" WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " - NAME - IDENT "buzz" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "b" - WHITESPACE " " - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "foo" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "buzz" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "b" + WHITESPACE " " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" ALTER_TABLE @@ -800,20 +803,24 @@ SOURCE_FILE RESET_OPTIONS RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - NAME - IDENT "foo" - COMMA "," - WHITESPACE " " - NAME - IDENT "buzz" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "foo" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "buzz" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" ALTER_TABLE @@ -835,23 +842,27 @@ SOURCE_FILE RESET_OPTIONS RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - NAME - IDENT "p" - DOT "." - NAME - IDENT "foo" - COMMA "," - WHITESPACE " " - NAME - IDENT "buzz" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "p" + DOT "." + NAME + IDENT "foo" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "buzz" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" ALTER_TABLE @@ -873,51 +884,56 @@ SOURCE_FILE SET_OPTIONS SET_KW "set" WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "a" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "b" - COMMA "," - WHITESPACE " " - NAME - IDENT "z" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'foo'" - COMMA "," - WHITESPACE " " - NAME - IDENT "w" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "10" - COMMA "," - WHITESPACE " " - NAME - JSON_KW "json" - WHITESPACE " " - EQ "=" - WHITESPACE " " - CONSTRAINT_KW "constraint" - WHITESPACE " " - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "a" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "b" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "z" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'foo'" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "w" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + JSON_KW "json" + WHITESPACE " " + EQ "=" + WHITESPACE " " + CONSTRAINT_KW "constraint" + WHITESPACE " " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" ALTER_TABLE @@ -2245,28 +2261,27 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" ALTER_TABLE @@ -2345,17 +2360,17 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE " \n " CONSTRAINT_INDEX_TABLESPACE USING_KW "using" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_tablespace_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_tablespace_ok.snap index 584ac859..9d115c4c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_tablespace_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_tablespace_ok.snap @@ -73,20 +73,20 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "o" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "v" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "v" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- set_multiple_options" @@ -103,34 +103,33 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "o1" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "v1" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "v1" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "o2" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "v2" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "v2" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- reset_option" @@ -147,12 +146,12 @@ SOURCE_FILE WHITESPACE " " RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "o" - R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- reset_multiple_options" @@ -169,17 +168,16 @@ SOURCE_FILE WHITESPACE " " RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "o1" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "o2" - R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_text_search_dictionary_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_text_search_dictionary_ok.snap index 6f9c8233..dc8670a8 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_text_search_dictionary_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_text_search_dictionary_ok.snap @@ -24,21 +24,24 @@ SOURCE_FILE NAME_REF IDENT "d" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "b" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- rename" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap index 01f12567..0f169be8 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap @@ -297,15 +297,17 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "p" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'v'" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "p" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'v'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" ALTER_TYPE @@ -320,24 +322,27 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "p" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'v'" - COMMA "," - WHITESPACE " " - NAME - IDENT "q" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'w'" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "p" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'v'" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "q" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'w'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- add_attribute" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_view_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_view_ok.snap index bda359a2..d768c394 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_view_ok.snap @@ -268,37 +268,42 @@ SOURCE_FILE WHITESPACE " " SET_KW "set" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'x'" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "100" - COMMA "," - WHITESPACE " " - NAME - IDENT "c" - COMMA "," - WHITESPACE " " - NAME - IDENT "d" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'x'" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "100" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "c" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "d" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- reset_options" @@ -315,17 +320,21 @@ SOURCE_FILE WHITESPACE " " RESET_KW "reset" WHITESPACE " " - L_PAREN "(" - NAME - IDENT "a" - COMMA "," - WHITESPACE " " - NAME - IDENT "b" - COMMA "," - WHITESPACE " " - NAME - IDENT "c" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "a" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "c" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_aggregate_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_aggregate_ok.snap index 6987257d..4334607d 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_aggregate_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_aggregate_ok.snap @@ -15,44 +15,48 @@ SOURCE_FILE NAME IDENT "a" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "basetype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "f" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "u" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "basetype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "f" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "u" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full_old_syntax" @@ -77,281 +81,302 @@ SOURCE_FILE NAME IDENT "my_aggregate" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "basetype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "input_type" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "state_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "state_type" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "sspace" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1024" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "final_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc_extra" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc_modify" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "read_only" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "combinefunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "combine_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "serialfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "serial_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "deserialfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "deserial_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "initcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'0'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "msfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "moving_state_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "minvfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "moving_inverse_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mstype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "moving_state_type" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "msspace" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "2048" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mfinalfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "moving_final_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mfinalfunc_extra" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mfinalfunc_modify" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "shareable" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "minitcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'{\"initial\":\"value\"}'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "sortop" - WHITESPACE " " - EQ "=" - WHITESPACE " " - L_ANGLE "<" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "basetype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "input_type" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "state_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "state_type" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sspace" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1024" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "final_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc_extra" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc_modify" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "read_only" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "combinefunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "combine_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "serialfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "serial_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "deserialfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "deserial_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "initcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'0'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "msfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "moving_state_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "minvfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "moving_inverse_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mstype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "moving_state_type" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "msspace" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "2048" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mfinalfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "moving_final_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mfinalfunc_extra" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mfinalfunc_modify" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "shareable" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "minitcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'{\"initial\":\"value\"}'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sortop" + WHITESPACE " " + EQ "=" + WHITESPACE " " + L_ANGLE "<" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- simple" @@ -375,32 +400,35 @@ SOURCE_FILE IDENT "t" R_PAREN ")" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "f" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "f" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full" @@ -418,254 +446,275 @@ SOURCE_FILE PATH PATH_SEGMENT NAME - IDENT "a" - PARAM_LIST - L_PAREN "(" - PARAM - PARAM_IN - IN_KW "in" + IDENT "a" + PARAM_LIST + L_PAREN "(" + PARAM + PARAM_IN + IN_KW "in" + WHITESPACE " " + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "p" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + PARAM + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE " " + PARAM + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + SMALLINT_KW "smallint" + R_PAREN ")" + WHITESPACE " " + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "f" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sspace" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1024" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "ff" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc_extra" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc_modify" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "read_only" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "combinefunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "cf" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "serialfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "sf" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "deserialfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "df" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "initcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'0'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "msfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "msf" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "minvfunc" WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "mif" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION NAME - IDENT "a" + IDENT "mstype" + WHITESPACE " " + EQ "=" WHITESPACE " " PATH_TYPE PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "p" - DOT "." PATH_SEGMENT NAME_REF - IDENT "bar" + IDENT "mt" COMMA "," - WHITESPACE " " - PARAM + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "msspace" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "2048" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mfinalfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " PATH_TYPE PATH PATH_SEGMENT NAME_REF - TEXT_KW "text" + IDENT "mff" COMMA "," - WHITESPACE " " - PARAM + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mfinalfunc_extra" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mfinalfunc_modify" + WHITESPACE " " + EQ "=" + WHITESPACE " " PATH_TYPE PATH PATH_SEGMENT NAME_REF - SMALLINT_KW "smallint" + IDENT "shareable" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "minitcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'{\"initial\":\"value\"}'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sortop" + WHITESPACE " " + EQ "=" + WHITESPACE " " + L_ANGLE "<" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + PARALLEL_KW "parallel" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "safe" + WHITESPACE "\n" R_PAREN ")" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "f" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "sspace" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1024" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "ff" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc_extra" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc_modify" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "read_only" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "combinefunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "cf" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "serialfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "sf" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "deserialfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "df" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "initcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'0'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "msfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "msf" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "minvfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "mif" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mstype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "mt" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "msspace" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "2048" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mfinalfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "mff" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mfinalfunc_extra" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mfinalfunc_modify" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "shareable" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "minitcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'{\"initial\":\"value\"}'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "sortop" - WHITESPACE " " - EQ "=" - WHITESPACE " " - L_ANGLE "<" - COMMA "," - WHITESPACE "\n " - NAME - PARALLEL_KW "parallel" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "safe" - WHITESPACE "\n" - R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- ordered_aggregate" @@ -738,94 +787,104 @@ SOURCE_FILE WHITESPACE "\n" R_PAREN ")" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "percentile_disc_transition" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "internal" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "sspace" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1024" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "percentile_disc_final" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc_extra" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc_modify" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "read_only" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "initcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'0.5'" - COMMA "," - WHITESPACE "\n " - NAME - PARALLEL_KW "parallel" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "safe" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "hypothetical" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "percentile_disc_transition" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "internal" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sspace" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1024" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "percentile_disc_final" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc_extra" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc_modify" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "read_only" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "initcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'0.5'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + PARALLEL_KW "parallel" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "safe" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "hypothetical" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_1" @@ -849,42 +908,46 @@ SOURCE_FILE NAME_REF IDENT "anycompatible" R_PAREN ")" - WHITESPACE "\n" - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "array_append" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "anycompatiblearray" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "initcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'{}'" - WHITESPACE "\n" - R_PAREN ")" + WHITESPACE "\n" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "array_append" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "anycompatiblearray" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "initcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'{}'" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_2" @@ -909,48 +972,53 @@ SOURCE_FILE IDENT "anynonarray" R_PAREN ")" WHITESPACE "\n" - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "array_agg_transfn" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "internal" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "array_agg_finalfn" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc_extra" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "array_agg_transfn" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "internal" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "array_agg_finalfn" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc_extra" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_3" @@ -986,48 +1054,53 @@ SOURCE_FILE IDENT "anyelement" R_PAREN ")" WHITESPACE "\n" - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "ordered_set_transition" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "internal" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "percentile_disc_final" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "finalfunc_extra" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "ordered_set_transition" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "internal" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "percentile_disc_final" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "finalfunc_extra" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_4" @@ -1052,86 +1125,94 @@ SOURCE_FILE IDENT "complex" R_PAREN ")" WHITESPACE "\n" - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "complex_add" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "complex" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "initcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'(0,0)'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "msfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "complex_add" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "minvfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "complex_sub" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mstype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "complex" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "minitcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'(0,0)'" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "complex_add" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "complex" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "initcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'(0,0)'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "msfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "complex_add" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "minvfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "complex_sub" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mstype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "complex" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "minitcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'(0,0)'" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_5" @@ -1156,67 +1237,73 @@ SOURCE_FILE IDENT "float8" R_PAREN ")" WHITESPACE "\n" - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "float8" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "float8pl" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "mstype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "float8" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "msfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "float8pl" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "minvfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "float8mi" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "float8" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "float8pl" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "mstype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "float8" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "msfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "float8pl" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "minvfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "float8mi" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_collation_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_collation_ok.snap index 64d35f85..1c2c4eb2 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_collation_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_collation_ok.snap @@ -84,73 +84,81 @@ SOURCE_FILE NAME IDENT "c" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "locale" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'foo'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "lc_collate" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "lc_ctype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "provider" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'foo'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "deterministic" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "rules" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "r" - COMMA "," - WHITESPACE "\n " - NAME - VERSION_KW "version" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'100'" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "locale" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'foo'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "lc_collate" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "lc_ctype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "provider" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'foo'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "deterministic" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "rules" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "r" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + VERSION_KW "version" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'100'" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" 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 578b9c10..cf4f992c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap @@ -22,8 +22,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "c" + PARTITION_ITEM + NAME_REF + IDENT "c" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -65,8 +66,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "c" + PARTITION_ITEM + NAME_REF + IDENT "c" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -87,20 +89,21 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "c" + PARTITION_ITEM + BIN_EXPR + NAME_REF + IDENT "c" + WHITESPACE " " + COLLATE_KW "collate" + WHITESPACE " " + NAME_REF + IDENT "\"fr_FR\"" WHITESPACE " " - COLLATE_KW "collate" + ASC_KW "asc" WHITESPACE " " - NAME_REF - IDENT "\"fr_FR\"" - WHITESPACE " " - ASC_KW "asc" - WHITESPACE " " - NULLS_KW "nulls" - WHITESPACE " " - LAST_KW "last" + NULLS_KW "nulls" + WHITESPACE " " + LAST_KW "last" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -119,14 +122,15 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "c" - WHITESPACE " " - DESC_KW "desc" - WHITESPACE " " - NULLS_KW "nulls" - WHITESPACE " " - FIRST_KW "first" + PARTITION_ITEM + NAME_REF + IDENT "c" + WHITESPACE " " + DESC_KW "desc" + WHITESPACE " " + NULLS_KW "nulls" + WHITESPACE " " + FIRST_KW "first" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -148,42 +152,49 @@ SOURCE_FILE INDEX_PARAMS L_PAREN "(" WHITESPACE "\n " - NAME_REF - IDENT "a" - WHITESPACE " " - IDENT "text_pattern_ops" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "strength" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PRIMARY_KW "primary" - COMMA "," - WHITESPACE " " - NAME - IDENT "variant" - WHITESPACE " " - EQ "=" - WHITESPACE " " - DEFAULT_KW "default" - R_PAREN ")" + PARTITION_ITEM + NAME_REF + IDENT "a" + WHITESPACE " " + IDENT "text_pattern_ops" + WHITESPACE " " + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "strength" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PRIMARY_KW "primary" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME + IDENT "variant" + WHITESPACE " " + EQ "=" + WHITESPACE " " + DEFAULT_KW "default" + R_PAREN ")" COMMA "," WHITESPACE "\n " - NAME_REF - IDENT "b" - WHITESPACE " " - IDENT "text_pattern_ops" - WHITESPACE " " - L_PAREN "(" - NAME - IDENT "strength" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PRIMARY_KW "primary" - R_PAREN ")" + PARTITION_ITEM + NAME_REF + IDENT "b" + WHITESPACE " " + IDENT "text_pattern_ops" + WHITESPACE " " + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME + IDENT "strength" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PRIMARY_KW "primary" + R_PAREN ")" WHITESPACE "\n" R_PAREN ")" SEMICOLON ";" @@ -205,27 +216,29 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - PAREN_EXPR - L_PAREN "(" - BIN_EXPR - CALL_EXPR - NAME_REF - IDENT "f" - ARG_LIST - L_PAREN "(" + PARTITION_ITEM + PAREN_EXPR + L_PAREN "(" + BIN_EXPR + CALL_EXPR NAME_REF - IDENT "c" - R_PAREN ")" - WHITESPACE " " - PLUS "+" - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" + IDENT "f" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "c" + R_PAREN ")" + WHITESPACE " " + PLUS "+" + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" COMMA "," WHITESPACE " " - NAME_REF - IDENT "b" + PARTITION_ITEM + NAME_REF + IDENT "b" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -246,8 +259,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "c" + PARTITION_ITEM + NAME_REF + IDENT "c" R_PAREN ")" WHITESPACE "\n " CONSTRAINT_INCLUDE_CLAUSE @@ -274,31 +288,31 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "buzz" - R_PAREN ")" + R_PAREN ")" WHITESPACE "\n " - TABLESPACE_KW "tablespace" - WHITESPACE " " - NAME_REF - IDENT "space" + TABLESPACE + TABLESPACE_KW "tablespace" + WHITESPACE " " + NAME_REF + IDENT "space" WHITESPACE "\n " WHERE_CLAUSE WHERE_KW "where" @@ -328,8 +342,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "c" + PARTITION_ITEM + NAME_REF + IDENT "c" R_PAREN ")" WHITESPACE "\n " NULLS_KW "nulls" @@ -374,8 +389,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "c" + PARTITION_ITEM + NAME_REF + IDENT "c" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -401,8 +417,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "title" + PARTITION_ITEM + NAME_REF + IDENT "title" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -426,8 +443,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "title" + PARTITION_ITEM + NAME_REF + IDENT "title" R_PAREN ")" WHITESPACE " " CONSTRAINT_INCLUDE_CLAUSE @@ -464,24 +482,25 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "title" + PARTITION_ITEM + NAME_REF + IDENT "title" R_PAREN ")" WHITESPACE " " WITH_PARAMS WITH_KW "WITH" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "deduplicate_items" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - OFF_KW "off" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + OFF_KW "off" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_INDEX @@ -499,17 +518,18 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - PAREN_EXPR - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "lower" - ARG_LIST - L_PAREN "(" + PARTITION_ITEM + PAREN_EXPR + L_PAREN "(" + CALL_EXPR NAME_REF - IDENT "title" - R_PAREN ")" - R_PAREN ")" + IDENT "lower" + ARG_LIST + L_PAREN "(" + NAME_REF + IDENT "title" + R_PAREN ")" + R_PAREN ")" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -531,14 +551,15 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "title" - WHITESPACE " " - COLLATE_KW "COLLATE" - WHITESPACE " " - NAME_REF - IDENT "\"de_DE\"" + PARTITION_ITEM + BIN_EXPR + NAME_REF + IDENT "title" + WHITESPACE " " + COLLATE_KW "COLLATE" + WHITESPACE " " + NAME_REF + IDENT "\"de_DE\"" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -560,12 +581,13 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "title" - WHITESPACE " " - NULLS_KW "NULLS" - WHITESPACE " " - FIRST_KW "FIRST" + PARTITION_ITEM + NAME_REF + IDENT "title" + WHITESPACE " " + NULLS_KW "NULLS" + WHITESPACE " " + FIRST_KW "FIRST" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -589,24 +611,25 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "title" + PARTITION_ITEM + NAME_REF + IDENT "title" R_PAREN ")" WHITESPACE " " WITH_PARAMS WITH_KW "WITH" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "fillfactor" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "70" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "70" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_INDEX @@ -632,24 +655,25 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "locations" + PARTITION_ITEM + NAME_REF + IDENT "locations" R_PAREN ")" WHITESPACE " " WITH_PARAMS WITH_KW "WITH" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "fastupdate" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - OFF_KW "off" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + OFF_KW "off" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_INDEX @@ -670,14 +694,16 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "code" + PARTITION_ITEM + NAME_REF + IDENT "code" R_PAREN ")" WHITESPACE " " - TABLESPACE_KW "TABLESPACE" - WHITESPACE " " - NAME_REF - IDENT "indexspace" + TABLESPACE + TABLESPACE_KW "TABLESPACE" + WHITESPACE " " + NAME_REF + IDENT "indexspace" SEMICOLON ";" WHITESPACE "\n\n" CREATE_INDEX @@ -703,17 +729,18 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "box" - ARG_LIST - L_PAREN "(" - NAME_REF - LOCATION_KW "location" - COMMA "," + PARTITION_ITEM + CALL_EXPR NAME_REF - LOCATION_KW "location" - R_PAREN ")" + IDENT "box" + ARG_LIST + L_PAREN "(" + NAME_REF + LOCATION_KW "location" + COMMA "," + NAME_REF + LOCATION_KW "location" + R_PAREN ")" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -737,8 +764,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "quantity" + PARTITION_ITEM + NAME_REF + IDENT "quantity" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" 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 9c7385c8..9e6aa699 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 @@ -80,39 +80,38 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "10" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "bar" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "buzz" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + R_PAREN ")" WHITESPACE "\n " - TABLESPACE_KW "tablespace" - WHITESPACE " " - NAME_REF - IDENT "t" + TABLESPACE + TABLESPACE_KW "tablespace" + WHITESPACE " " + NAME_REF + IDENT "t" WHITESPACE "\n " AS_KW "as" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__create_operator_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_operator_ok.snap index 383c4fd0..81da6723 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_operator_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_operator_ok.snap @@ -12,20 +12,22 @@ SOURCE_FILE WHITESPACE " " R_ANGLE ">" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - FUNCTION_KW "function" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "f" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + FUNCTION_KW "function" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "f" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- procedure" @@ -38,20 +40,22 @@ SOURCE_FILE CUSTOM_OP POUND "#" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - PROCEDURE_KW "procedure" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "p" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + PROCEDURE_KW "procedure" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "p" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full" @@ -79,116 +83,126 @@ SOURCE_FILE MINUS "-" POUND "#" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - FUNCTION_KW "function" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + FUNCTION_KW "function" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE PATH + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "bar" + DOT "." PATH_SEGMENT NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "bar" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "f" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "leftarg" - WHITESPACE " " - EQ "=" - WHITESPACE " " - CHAR_TYPE - VARCHAR_KW "varchar" - L_PAREN "(" - ARG_LIST - ARG - LITERAL - INT_NUMBER "100" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "rightarg" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - BIGINT_KW "bigint" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "commutator" - WHITESPACE " " - EQ "=" - WHITESPACE " " - CUSTOM_OP - AMP "&" - AMP "&" - AMP "&" - AMP "&" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "negator" - WHITESPACE " " - EQ "=" - WHITESPACE " " - CUSTOM_OP - L_ANGLE "<" - MINUS "-" - R_ANGLE ">" - COMMA "," - WHITESPACE "\n " - NAME - RESTRICT_KW "restrict" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "r" - COMMA "," - WHITESPACE "\n " - NAME - JOIN_KW "join" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "j" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "hashes" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "merges" - WHITESPACE "\n" - R_PAREN ")" + IDENT "f" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "leftarg" + WHITESPACE " " + EQ "=" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "varchar" + L_PAREN "(" + ARG_LIST + ARG + LITERAL + INT_NUMBER "100" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "rightarg" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "commutator" + WHITESPACE " " + EQ "=" + WHITESPACE " " + CUSTOM_OP + AMP "&" + AMP "&" + AMP "&" + AMP "&" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "negator" + WHITESPACE " " + EQ "=" + WHITESPACE " " + CUSTOM_OP + L_ANGLE "<" + MINUS "-" + R_ANGLE ">" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + RESTRICT_KW "restrict" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "r" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + JOIN_KW "join" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "j" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "hashes" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "merges" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" 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 ec9ddfc2..d3a38a9c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_publication_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_publication_ok.snap @@ -33,26 +33,25 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "bar" - R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- table" @@ -173,26 +172,25 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "bar" - R_PAREN ")" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- table_in_schema" 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 23c0d22e..a70de09b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_subscription_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_subscription_ok.snap @@ -55,150 +55,138 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "connect" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "create_slot" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "enabled" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "slot_name" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'bar'" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'bar'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME BINARY_KW "binary" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "copy_data" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "synchronous_commit" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - OFF_KW "off" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + OFF_KW "off" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "two_phase" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "disable_on_error" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "password_required" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "run_as_owner" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "origin" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'foo'" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'foo'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "failover" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - WHITESPACE "\n " - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + WHITESPACE "\n " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" 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 2e8efb9c..9e2b9cef 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 @@ -147,23 +147,22 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "b" - R_PAREN ")" + R_PAREN ")" WHITESPACE "\n " ON_COMMIT ON_KW "on" 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 cf03330b..a2d9b400 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap @@ -445,55 +445,59 @@ SOURCE_FILE WHITESPACE " " L_PAREN "(" WHITESPACE "\n " - BIN_EXPR - NAME_REF - IDENT "foo" - WHITESPACE " " - COLLATE_KW "collate" + PARTITION_ITEM + BIN_EXPR + NAME_REF + IDENT "foo" + WHITESPACE " " + COLLATE_KW "collate" + WHITESPACE " " + NAME_REF + IDENT "\"fr_FR\"" WHITESPACE " " - NAME_REF - IDENT "\"fr_FR\"" - WHITESPACE " " - IDENT "text_pattern_ops" + IDENT "text_pattern_ops" COMMA "," WHITESPACE " \n " - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE "\n " - CALL_EXPR + PARTITION_ITEM NAME_REF - EXTRACT_KW "extract" - ARG_LIST - L_PAREN "(" - MONTH_KW "month" - WHITESPACE " " - FROM_KW "from" - WHITESPACE " " - NAME_REF - IDENT "b" - R_PAREN ")" + IDENT "bar" COMMA "," WHITESPACE "\n " - BIN_EXPR - PAREN_EXPR - L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "a" + PARTITION_ITEM + 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" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + PARTITION_ITEM + 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 ";" @@ -531,8 +535,9 @@ SOURCE_FILE IDENT "hash" WHITESPACE " " L_PAREN "(" - NAME_REF - IDENT "z" + PARTITION_ITEM + NAME_REF + IDENT "z" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -569,12 +574,14 @@ SOURCE_FILE IDENT "list" WHITESPACE " " L_PAREN "(" - NAME_REF - IDENT "z" + PARTITION_ITEM + NAME_REF + IDENT "z" COMMA "," WHITESPACE " " - NAME_REF - IDENT "b" + PARTITION_ITEM + NAME_REF + IDENT "b" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -638,41 +645,37 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "foo" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE "\n " - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "buzz" - DOT "." - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "buzz" + DOT "." + NAME IDENT "bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - WHITESPACE "\n" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -1053,60 +1056,56 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "fillfactor" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "toast_tuple_target" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "100" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "100" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "parallel_workers" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "5" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "5" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "autovacuum_enabled" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "autovacuum_vacuum_cost_delay" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FLOAT_NUMBER "10.1" - WHITESPACE "\n " - COMMENT "-- others omitted" - WHITESPACE "\n " - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FLOAT_NUMBER "10.1" + WHITESPACE "\n " + COMMENT "-- others omitted" + WHITESPACE "\n " + R_PAREN ")" COMMA "," WHITESPACE "\n " COLUMN @@ -1272,14 +1271,14 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "autovacuum_enabled" - WHITESPACE " " - R_PAREN ")" + WHITESPACE " " + R_PAREN ")" COMMA "," WHITESPACE "\n " COLUMN @@ -1760,19 +1759,19 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - WHITESPACE " " - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + WHITESPACE " " + R_PAREN ")" WHITESPACE "\n" R_PAREN ")" SEMICOLON ";" @@ -2171,23 +2170,22 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "10" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "z" - R_PAREN ")" + R_PAREN ")" WHITESPACE "\n " CONSTRAINT_INDEX_TABLESPACE USING_KW "using" @@ -2416,19 +2414,19 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - WHITESPACE " " - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + WHITESPACE " " + R_PAREN ")" COMMA "," WHITESPACE "\n " PRIMARY_KEY_CONSTRAINT 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 84885b2c..aafd2086 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_tablespace_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_tablespace_ok.snap @@ -41,51 +41,48 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "seq_page_cost" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "10" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "random_page_cost" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "effective_io_concurrency" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "0" - COMMA "," - WHITESPACE "\n " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "0" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME IDENT "maintenance_io_concurrency" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "4" - WHITESPACE "\n " - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "4" + WHITESPACE "\n " + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_text_search_config_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_text_search_config_ok.snap index 6b3ddd24..420bee3f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_text_search_config_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_text_search_config_ok.snap @@ -19,20 +19,22 @@ SOURCE_FILE NAME NAME_KW "name" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - PARSER_KW "parser" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "parser_name" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + PARSER_KW "parser" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "parser_name" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full" @@ -56,19 +58,21 @@ SOURCE_FILE NAME NAME_KW "name" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "config" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "source_config" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "config" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "source_config" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_text_search_dict_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_text_search_dict_ok.snap index cb9a9ea6..138d061f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_text_search_dict_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_text_search_dict_ok.snap @@ -19,20 +19,22 @@ SOURCE_FILE NAME NAME_KW "name" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - TEMPLATE_KW "template" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + TEMPLATE_KW "template" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full" @@ -56,43 +58,47 @@ SOURCE_FILE NAME NAME_KW "name" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - TEMPLATE_KW "template" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "b" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + TEMPLATE_KW "template" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "foo" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "b" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_text_search_parser_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_text_search_parser_ok.snap index 0df4b1ae..bf279f3d 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_text_search_parser_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_text_search_parser_ok.snap @@ -19,56 +19,61 @@ SOURCE_FILE NAME NAME_KW "name" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - START_KW "start" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "start_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "gettoken" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "gettoken_function" - COMMA "," - WHITESPACE "\n " - NAME - END_KW "end" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "end_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "lextypes" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "lextypes_function" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + START_KW "start" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "start_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "gettoken" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "gettoken_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + END_KW "end" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "end_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "lextypes" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "lextypes_function" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full" @@ -92,67 +97,73 @@ SOURCE_FILE NAME NAME_KW "name" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - START_KW "start" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "start_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "gettoken" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "gettoken_function" - COMMA "," - WHITESPACE "\n " - NAME - END_KW "end" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "end_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "lextypes" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "lextypes_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "headline" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "headline_function" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + START_KW "start" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "start_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "gettoken" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "gettoken_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + END_KW "end" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "end_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "lextypes" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "lextypes_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "headline" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "headline_function" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_text_search_template_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_text_search_template_ok.snap index bb17d7a7..d5899e07 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_text_search_template_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_text_search_template_ok.snap @@ -19,20 +19,22 @@ SOURCE_FILE NAME NAME_KW "name" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "lexize" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "f" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "lexize" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "f" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- full" @@ -56,31 +58,34 @@ SOURCE_FILE NAME NAME_KW "name" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "INIT" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "init_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "lexize" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "lexize_function" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "INIT" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "init_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "lexize" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "lexize_function" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_type_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_type_ok.snap index ec1878b0..4fd93d8a 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_type_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_type_ok.snap @@ -193,20 +193,22 @@ SOURCE_FILE WHITESPACE " " RANGE_KW "range" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "subtype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - BIGINT_KW "bigint" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "subtype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + BIGINT_KW "bigint" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n\n" COMMENT "-- schema" @@ -276,42 +278,45 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - INPUT_KW "input" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + INPUT_KW "input" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE PATH + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "bar" + DOT "." PATH_SEGMENT NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "bar" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "func_name" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "output" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "func_name" - WHITESPACE "\n" - R_PAREN ")" + IDENT "func_name" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "output" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "func_name" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TYPE @@ -324,222 +329,242 @@ SOURCE_FILE NAME IDENT "t" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - INPUT_KW "input" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + INPUT_KW "input" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE PATH + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "bar" + DOT "." PATH_SEGMENT NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "bar" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "func_name" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "output" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "func_name" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "receive" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "receive_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "send" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "send_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "typmod_in" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "type_modifier_input_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "typmod_out" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "type_modifier_output_function" - COMMA "," - WHITESPACE "\n " - NAME - ANALYZE_KW "analyze" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "analyze_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "subscript" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "subscript_function" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "internallength" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "variable" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "passedbyvalue" - COMMA "," - WHITESPACE "\n " - COMMENT "-- The allowed values equate to alignment on 1, 2, 4, or 8 byte boundaries." - WHITESPACE "\n " - NAME - IDENT "alignment" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE "\n " - NAME - STORAGE_KW "storage" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "plain" - COMMA "," - WHITESPACE "\n " - NAME - LIKE_KW "like" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "like_type" - COMMA "," - WHITESPACE "\n " - COMMENT "-- see: https://www.postgresql.org/docs/17/catalog-pg-type.html#CATALOG-TYPCATEGORY-TABLE" - WHITESPACE "\n " - NAME - IDENT "category" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'U'" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "preferred" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - NAME - DEFAULT_KW "default" - WHITESPACE " " - EQ "=" - WHITESPACE " " - NULL_KW "null" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "element" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "float4" - COMMA "," - WHITESPACE "\n " - NAME - DELIMITER_KW "delimiter" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "','" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "collatable" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - TRUE_KW "true" - WHITESPACE "\n" - R_PAREN ")" + IDENT "func_name" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "output" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "func_name" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "receive" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "receive_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "send" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "send_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "typmod_in" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "type_modifier_input_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "typmod_out" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "type_modifier_output_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + ANALYZE_KW "analyze" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "analyze_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "subscript" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "subscript_function" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "internallength" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "variable" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "passedbyvalue" + COMMA "," + WHITESPACE "\n " + COMMENT "-- The allowed values equate to alignment on 1, 2, 4, or 8 byte boundaries." + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "alignment" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + STORAGE_KW "storage" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "plain" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + LIKE_KW "like" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "like_type" + COMMA "," + WHITESPACE "\n " + COMMENT "-- see: https://www.postgresql.org/docs/17/catalog-pg-type.html#CATALOG-TYPCATEGORY-TABLE" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "category" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'U'" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "preferred" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + DEFAULT_KW "default" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NULL_KW "null" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "element" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "float4" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + DELIMITER_KW "delimiter" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "','" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "collatable" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + TRUE_KW "true" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n" 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 3903a538..fcca813a 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap @@ -439,26 +439,25 @@ SOURCE_FILE WITH_PARAMS WITH_KW "with" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE " " + ATTRIBUTE_OPTION + NAME IDENT "buzz" - R_PAREN ")" + R_PAREN ")" WHITESPACE "\n" AS_KW "as" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index 429a408d..ec0e55f1 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -891,44 +891,48 @@ SOURCE_FILE WHITESPACE " " R_PAREN ")" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - NAME - IDENT "sfunc" - WHITESPACE " " - EQ "=" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "sum_per_hour" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "stype" - WHITESPACE " " - EQ "=" - WHITESPACE " " - ARRAY_TYPE - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "int8" - L_BRACK "[" - R_BRACK "]" - COMMA "," - WHITESPACE "\n " - NAME - IDENT "initcond" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - STRING "'[0:23]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}'" - WHITESPACE "\n" - R_PAREN ")" + ATTRIBUTE_LIST + L_PAREN "(" + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "sfunc" + WHITESPACE " " + EQ "=" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "sum_per_hour" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "stype" + WHITESPACE " " + EQ "=" + WHITESPACE " " + ARRAY_TYPE + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "int8" + L_BRACK "[" + R_BRACK "]" + COMMA "," + WHITESPACE "\n " + ATTRIBUTE_OPTION + NAME + IDENT "initcond" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + STRING "'[0:23]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}'" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -2342,8 +2346,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "event_id" + PARTITION_ITEM + NAME_REF + IDENT "event_id" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -2610,8 +2615,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "id" + PARTITION_ITEM + NAME_REF + IDENT "id" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -2722,8 +2728,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "event_time" + PARTITION_ITEM + NAME_REF + IDENT "event_time" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -3725,8 +3732,9 @@ SOURCE_FILE IDENT "hourly_stats" INDEX_PARAMS L_PAREN "(" - NAME_REF - HOUR_KW "hour" + PARTITION_ITEM + NAME_REF + HOUR_KW "hour" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -3785,8 +3793,9 @@ SOURCE_FILE RANGE_KW "RANGE" WHITESPACE " " L_PAREN "(" - NAME_REF - IDENT "event_time" + PARTITION_ITEM + NAME_REF + IDENT "event_time" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -5572,18 +5581,19 @@ SOURCE_FILE INDEX_PARAMS L_PAREN "(" WHITESPACE "\n " - CALL_EXPR - NAME_REF - IDENT "date_trunc" - ARG_LIST - L_PAREN "(" - LITERAL - STRING "'month'" - COMMA "," - WHITESPACE " " + PARTITION_ITEM + CALL_EXPR NAME_REF - TIMESTAMP_KW "timestamp" - R_PAREN ")" + IDENT "date_trunc" + ARG_LIST + L_PAREN "(" + LITERAL + STRING "'month'" + COMMA "," + WHITESPACE " " + NAME_REF + TIMESTAMP_KW "timestamp" + R_PAREN ")" WHITESPACE "\n" R_PAREN ")" SEMICOLON ";" @@ -5610,24 +5620,25 @@ SOURCE_FILE IDENT "brin" INDEX_PARAMS L_PAREN "(" - NAME_REF - TIMESTAMP_KW "timestamp" + PARTITION_ITEM + NAME_REF + TIMESTAMP_KW "timestamp" R_PAREN ")" WHITESPACE " " WITH_PARAMS WITH_KW "WITH" WHITESPACE " " - L_PAREN "(" - PATH - PATH_SEGMENT - NAME_REF + ATTRIBUTE_LIST + L_PAREN "(" + ATTRIBUTE_OPTION + NAME IDENT "pages_per_range" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "128" - R_PAREN ")" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "128" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -5865,8 +5876,9 @@ SOURCE_FILE WHITESPACE " " INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "sku" + PARTITION_ITEM + NAME_REF + IDENT "sku" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -5902,8 +5914,9 @@ SOURCE_FILE IDENT "recent_product_sales" INDEX_PARAMS L_PAREN "(" - NAME_REF - IDENT "sku" + PARTITION_ITEM + NAME_REF + IDENT "sku" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index 6496aeb9..e8136348 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -1231,6 +1231,36 @@ impl AttachPartition { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AttributeList { + pub(crate) syntax: SyntaxNode, +} +impl AttributeList { + #[inline] + pub fn attribute_options(&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) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AttributeOption { + pub(crate) syntax: SyntaxNode, +} +impl AttributeOption { + #[inline] + pub fn eq_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::EQ) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Begin { pub(crate) syntax: SyntaxNode, @@ -2608,6 +2638,10 @@ pub struct CreateTextSearchConfiguration { pub(crate) syntax: SyntaxNode, } impl CreateTextSearchConfiguration { + #[inline] + pub fn attribute_list(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn name_ref(&self) -> Option { support::child(&self.syntax) @@ -5018,6 +5052,10 @@ pub struct IndexParams { pub(crate) syntax: SyntaxNode, } impl IndexParams { + #[inline] + pub fn partition_items(&self) -> AstChildren { + support::children(&self.syntax) + } #[inline] pub fn l_paren_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::L_PAREN) @@ -6983,6 +7021,21 @@ impl PartitionBy { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct PartitionItem { + pub(crate) syntax: SyntaxNode, +} +impl PartitionItem { + #[inline] + pub fn collate(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct PartitionOf { pub(crate) syntax: SyntaxNode, @@ -10663,6 +10716,42 @@ impl AstNode for AttachPartition { &self.syntax } } +impl AstNode for AttributeList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ATTRIBUTE_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 AttributeOption { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ATTRIBUTE_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 Begin { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -15613,6 +15702,24 @@ impl AstNode for PartitionBy { &self.syntax } } +impl AstNode for PartitionItem { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::PARTITION_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 PartitionOf { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index b0b65396..b0690450 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -956,6 +956,12 @@ WithTimezone = WithoutTimezone = 'without' 'time' 'zone' +AttributeOption = + '='? + +AttributeList = + '(' ( AttributeOption (',' AttributeOption)* ) ')' + FilterClause = 'filter' '(' 'where' Expr ')' @@ -1251,7 +1257,7 @@ CreateTextSearchDictionary = 'create' 'text' 'search' 'dictionary' NameRef CreateTextSearchConfiguration = - 'create' 'text' 'search' 'configuration' NameRef + 'create' 'text' 'search' 'configuration' NameRef AttributeList CreateTextSearchTemplate = 'create' 'text' 'search' 'template' NameRef @@ -1475,8 +1481,11 @@ CreateSchema = DropTrigger = 'drop' 'trigger' IfExists? NameRef 'on' +PartitionItem = + Expr Collate? + IndexParams = - '(' ')' + '(' (PartitionItem (',' PartitionItem)*) ')' CreateType = 'create' 'type' Type diff --git a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__alter_aggregate_params_validation.snap b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__alter_aggregate_params_validation.snap index 5d9fbf36..b56cd253 100644 --- a/crates/squawk_syntax/src/snapshots/squawk_syntax__test__alter_aggregate_params_validation.snap +++ b/crates/squawk_syntax/src/snapshots/squawk_syntax__test__alter_aggregate_params_validation.snap @@ -38,32 +38,35 @@ SOURCE_FILE@0..101 IDENT@68..69 "y" R_PAREN@69..70 ")" WHITESPACE@70..71 " " - L_PAREN@71..72 "(" - WHITESPACE@72..75 "\n " - NAME@75..80 - IDENT@75..80 "sfunc" - WHITESPACE@80..81 " " - EQ@81..82 "=" - WHITESPACE@82..83 " " - PATH_TYPE@83..84 - PATH@83..84 - PATH_SEGMENT@83..84 - NAME_REF@83..84 - IDENT@83..84 "f" - COMMA@84..85 "," - WHITESPACE@85..88 "\n " - NAME@88..93 - IDENT@88..93 "stype" - WHITESPACE@93..94 " " - EQ@94..95 "=" - WHITESPACE@95..96 " " - PATH_TYPE@96..97 - PATH@96..97 - PATH_SEGMENT@96..97 - NAME_REF@96..97 - IDENT@96..97 "t" - WHITESPACE@97..98 "\n" - R_PAREN@98..99 ")" + ATTRIBUTE_LIST@71..99 + L_PAREN@71..72 "(" + WHITESPACE@72..75 "\n " + ATTRIBUTE_OPTION@75..84 + NAME@75..80 + IDENT@75..80 "sfunc" + WHITESPACE@80..81 " " + EQ@81..82 "=" + WHITESPACE@82..83 " " + PATH_TYPE@83..84 + PATH@83..84 + PATH_SEGMENT@83..84 + NAME_REF@83..84 + IDENT@83..84 "f" + COMMA@84..85 "," + WHITESPACE@85..88 "\n " + ATTRIBUTE_OPTION@88..97 + NAME@88..93 + IDENT@88..93 "stype" + WHITESPACE@93..94 " " + EQ@94..95 "=" + WHITESPACE@95..96 " " + PATH_TYPE@96..97 + PATH@96..97 + PATH_SEGMENT@96..97 + NAME_REF@96..97 + IDENT@96..97 "t" + WHITESPACE@97..98 "\n" + R_PAREN@98..99 ")" SEMICOLON@99..100 ";" WHITESPACE@100..101 "\n"