diff --git a/crates/squawk_ide/src/expand_selection.rs b/crates/squawk_ide/src/expand_selection.rs index ce37ee06..0ed6dae3 100644 --- a/crates/squawk_ide/src/expand_selection.rs +++ b/crates/squawk_ide/src/expand_selection.rs @@ -33,18 +33,16 @@ use squawk_syntax::{ ast::{self, AstToken}, }; -const ALL_LIST_KINDS: &[SyntaxKind] = &[ +const DELIMITED_LIST_KINDS: &[SyntaxKind] = &[ SyntaxKind::ARG_LIST, SyntaxKind::ATTRIBUTE_LIST, SyntaxKind::COLUMN_LIST, SyntaxKind::CONSTRAINT_EXCLUSION_LIST, - // only separated by whitespace - // SyntaxKind::FUNC_OPTION_LIST, SyntaxKind::JSON_TABLE_COLUMN_LIST, SyntaxKind::OPTIONS_LIST, SyntaxKind::PARAM_LIST, - // only separated by whitespace - // SyntaxKind::SEQUENCE_OPTION_LIST, + SyntaxKind::PARTITION_ITEM_LIST, + SyntaxKind::ROW_LIST, SyntaxKind::SET_OPTIONS_LIST, SyntaxKind::TABLE_ARG_LIST, SyntaxKind::TABLE_LIST, @@ -52,8 +50,6 @@ const ALL_LIST_KINDS: &[SyntaxKind] = &[ SyntaxKind::TRANSACTION_MODE_LIST, SyntaxKind::VACUUM_OPTION_LIST, SyntaxKind::VARIANT_LIST, - // only separated by whitespace - // SyntaxKind::XML_COLUMN_OPTION_LIST, SyntaxKind::XML_TABLE_COLUMN_LIST, ]; @@ -117,7 +113,7 @@ fn try_extend_selection(root: &SyntaxNode, range: TextRange) -> Option = (0..SyntaxKind::__LAST as u16) .map(SyntaxKind::from) .filter(|kind| { - format!("{:?}", kind).ends_with("_LIST") && !EXCLUDED_LIST_KINDS.contains(kind) + format!("{:?}", kind).ends_with("_LIST") && !delimited_ws_list_kinds.contains(kind) }) .collect(); - assert_debug_snapshot!(generated_list_kinds, @r" - [ - ARG_LIST, - ATTRIBUTE_LIST, - COLUMN_LIST, - CONSTRAINT_EXCLUSION_LIST, - JSON_TABLE_COLUMN_LIST, - OPTIONS_LIST, - PARAM_LIST, - SET_OPTIONS_LIST, - TABLE_ARG_LIST, - TABLE_LIST, - TARGET_LIST, - TRANSACTION_MODE_LIST, - VACUUM_OPTION_LIST, - VARIANT_LIST, - XML_TABLE_COLUMN_LIST, - ] - "); + let diff: Vec = generated_list_kinds + .iter() + .filter(|kind| !DELIMITED_LIST_KINDS.contains(kind)) + .copied() + .collect(); - assert_eq!( - ALL_LIST_KINDS, - generated_list_kinds.as_slice(), - "ALL_LIST_KINDS constant is out of sync with actual _LIST variants" - ); + assert_eq!(diff, vec![], "We shouldn't have any unhandled list kinds") } } diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index 0bffdd23..0fc416a7 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -741,6 +741,7 @@ pub enum SyntaxKind { DROP_USER, DROP_USER_MAPPING, DROP_VIEW, + ELSE_CLAUSE, ENABLE_ALWAYS_RULE, ENABLE_ALWAYS_TRIGGER, ENABLE_REPLICA_RULE, @@ -776,7 +777,6 @@ pub enum SyntaxKind { IF_NOT_EXISTS, IMPORT_FOREIGN_SCHEMA, INDEX_EXPR, - INDEX_PARAMS, INHERIT, INHERITS, INITIALLY_DEFERRED_CONSTRAINT_OPTION, @@ -901,6 +901,7 @@ pub enum SyntaxKind { PARTITION_FOR_VALUES_IN, PARTITION_FOR_VALUES_WITH, PARTITION_ITEM, + PARTITION_ITEM_LIST, PARTITION_OF, PATH, PATH_SEGMENT, @@ -941,7 +942,9 @@ pub enum SyntaxKind { REVOKE, ROLE, ROLLBACK, + ROW, ROWS_FUNC_OPTION, + ROW_LIST, SAVEPOINT, SECURITY_FUNC_OPTION, SECURITY_LABEL, @@ -1015,6 +1018,7 @@ pub enum SyntaxKind { VARIANT_LIST, VOLATILITY_FUNC_OPTION, WHEN_CLAUSE, + WHEN_CLAUSE_LIST, WHERE_CLAUSE, WINDOW_CLAUSE, WINDOW_DEF, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 26a68de5..3f0ef022 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -183,20 +183,35 @@ fn case_expr(p: &mut Parser<'_>) -> CompletedMarker { if !p.at(WHEN_KW) && expr(p).is_none() { p.error("expected an expression"); } + when_clause_list(p); + opt_else_clause(p); + p.expect(END_KW); + m.complete(p, CASE_EXPR) +} + +fn when_clause_list(p: &mut Parser<'_>) { + let m = p.start(); while !p.at(EOF) { when_clause(p); if !p.at(WHEN_KW) { break; } } - // case_default - // | ELSE a_expr - // | /* empty */ + m.complete(p, WHEN_CLAUSE_LIST); +} + +// case_default +// | ELSE a_expr +// | /* empty */ +fn opt_else_clause(p: &mut Parser<'_>) { + if !p.at(ELSE_KW) { + return; + } + let m = p.start(); if p.eat(ELSE_KW) && expr(p).is_none() { p.error("expected an expression"); } - p.expect(END_KW); - m.complete(p, CASE_EXPR) + m.complete(p, ELSE_CLAUSE); } // when_clause: @@ -10917,21 +10932,23 @@ fn set_transaction(p: &mut Parser<'_>) -> CompletedMarker { fn values(p: &mut Parser<'_>, m: Option) -> CompletedMarker { let m = m.unwrap_or_else(|| p.start()); p.bump(VALUES_KW); - // TODO: generalize this + row_list(p); + opt_order_by_clause(p); + opt_limit_clause(p); + opt_offset_clause(p); + opt_fetch_clause(p); + m.complete(p, VALUES) +} + +// ( expression [, ...] ) [, ...] +fn row_list(p: &mut Parser<'_>) { + let m = p.start(); while !p.at(EOF) { if !p.at(L_PAREN) { p.err_and_bump("expected L_PAREN"); continue; } - delimited( - p, - L_PAREN, - R_PAREN, - COMMA, - || "expected expression".to_string(), - EXPR_FIRST, - |p| expr(p).is_some(), - ); + row(p); if !p.eat(COMMA) { if p.at(L_PAREN) { p.error("expected COMMA"); @@ -10940,11 +10957,22 @@ fn values(p: &mut Parser<'_>, m: Option) -> CompletedMarker { } } } - opt_order_by_clause(p); - opt_limit_clause(p); - opt_offset_clause(p); - opt_fetch_clause(p); - m.complete(p, VALUES) + m.complete(p, ROW_LIST); +} + +// ( expression [, ...] ) +fn row(p: &mut Parser<'_>) { + let m = p.start(); + delimited( + p, + L_PAREN, + R_PAREN, + COMMA, + || "expected expression".to_string(), + EXPR_FIRST, + |p| expr(p).is_some(), + ); + m.complete(p, ROW); } const REINDEX_OPTION_FIRST: TokenSet = TokenSet::new(&[CONCURRENTLY_KW, VERBOSE_KW, TABLESPACE_KW]); @@ -12375,7 +12403,7 @@ fn create_index(p: &mut Parser<'_>) -> CompletedMarker { // [ NULLS { FIRST | LAST } ] // [, ...] // ) - index_params(p); + partition_items(p, true); opt_include_columns(p); opt_nulls_not_distinct(p); opt_with_params(p); @@ -12384,12 +12412,6 @@ fn create_index(p: &mut Parser<'_>) -> CompletedMarker { 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 ] @@ -12407,6 +12429,7 @@ fn index_params(p: &mut Parser<'_>) { // [, ...] // ) fn partition_items(p: &mut Parser<'_>, allow_extra_params: bool) { + let m = p.start(); delimited( p, L_PAREN, @@ -12416,6 +12439,7 @@ fn partition_items(p: &mut Parser<'_>, allow_extra_params: bool) { EXPR_FIRST, |p| opt_partition_item(p, allow_extra_params).is_some(), ); + m.complete(p, PARTITION_ITEM_LIST); } // [ argmode ] diff --git a/crates/squawk_parser/tests/snapshots/tests__create_index_err.snap b/crates/squawk_parser/tests/snapshots/tests__create_index_err.snap index 2ed22359..37c746d6 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_index_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_index_err.snap @@ -21,7 +21,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF 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 f6c86b7a..4bc69c89 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_index_ok.snap @@ -20,7 +20,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -64,7 +64,7 @@ SOURCE_FILE NAME_REF IDENT "bar" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -87,7 +87,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM BIN_EXPR @@ -122,7 +122,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -153,7 +153,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" WHITESPACE "\n " PARTITION_ITEM @@ -218,7 +218,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM PAREN_EXPR @@ -261,7 +261,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -345,7 +345,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -393,7 +393,7 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -421,7 +421,7 @@ SOURCE_FILE NAME_REF IDENT "films" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -447,7 +447,7 @@ SOURCE_FILE NAME_REF IDENT "films" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -486,7 +486,7 @@ SOURCE_FILE NAME_REF IDENT "films" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -522,7 +522,7 @@ SOURCE_FILE NAME_REF IDENT "films" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM PAREN_EXPR @@ -555,7 +555,7 @@ SOURCE_FILE NAME_REF IDENT "films" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM BIN_EXPR @@ -585,7 +585,7 @@ SOURCE_FILE NAME_REF IDENT "films" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -616,7 +616,7 @@ SOURCE_FILE NAME_REF IDENT "films" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -660,7 +660,7 @@ SOURCE_FILE NAME_REF IDENT "GIN" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -699,7 +699,7 @@ SOURCE_FILE NAME_REF IDENT "films" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -734,7 +734,7 @@ SOURCE_FILE NAME_REF IDENT "gist" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM CALL_EXPR @@ -769,7 +769,7 @@ SOURCE_FILE NAME_REF IDENT "sales_table" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF 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 7c3c3dc5..72ed2528 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 @@ -186,20 +186,23 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- https://github.com/sbdchd/squawk/issues/646" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap index 6f1483e8..4ac9f235 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap @@ -131,14 +131,16 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n " DELETE @@ -156,14 +158,16 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n " UPDATE 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 9e2b9cef..0cc3f99a 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 @@ -316,10 +316,12 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE_AS @@ -339,23 +341,26 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "3" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "5" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "3" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "5" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" 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 4581d710..6b6cc374 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap @@ -453,63 +453,64 @@ SOURCE_FILE WHITESPACE " " RANGE_KW "range" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - PARTITION_ITEM - BIN_EXPR - NAME_REF - IDENT "foo" - WHITESPACE " " - COLLATE_KW "collate" - WHITESPACE " " - NAME_REF - IDENT "\"fr_FR\"" - WHITESPACE " " - IDENT "text_pattern_ops" - COMMA "," - WHITESPACE " \n " - PARTITION_ITEM - NAME_REF - IDENT "bar" - COMMA "," - WHITESPACE "\n " - PARTITION_ITEM - CALL_EXPR - NAME_REF - EXTRACT_KW "extract" - ARG_LIST - L_PAREN "(" - MONTH_KW "month" + PARTITION_ITEM_LIST + L_PAREN "(" + WHITESPACE "\n " + PARTITION_ITEM + BIN_EXPR + NAME_REF + IDENT "foo" WHITESPACE " " - FROM_KW "from" + COLLATE_KW "collate" WHITESPACE " " NAME_REF - IDENT "b" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - PARTITION_ITEM - BIN_EXPR - PAREN_EXPR - L_PAREN "(" - BIN_EXPR - NAME_REF - IDENT "a" + IDENT "\"fr_FR\"" + WHITESPACE " " + IDENT "text_pattern_ops" + COMMA "," + WHITESPACE " \n " + PARTITION_ITEM + NAME_REF + IDENT "bar" + COMMA "," + WHITESPACE "\n " + 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" - WHITESPACE "\n" - R_PAREN ")" + 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 ";" WHITESPACE "\n\n" CREATE_TABLE @@ -544,11 +545,12 @@ SOURCE_FILE WHITESPACE " " IDENT "hash" WHITESPACE " " - L_PAREN "(" - PARTITION_ITEM - NAME_REF - IDENT "z" - R_PAREN ")" + PARTITION_ITEM_LIST + L_PAREN "(" + PARTITION_ITEM + NAME_REF + IDENT "z" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -583,16 +585,17 @@ SOURCE_FILE WHITESPACE " " IDENT "list" WHITESPACE " " - L_PAREN "(" - PARTITION_ITEM - NAME_REF - IDENT "z" - COMMA "," - WHITESPACE " " - PARTITION_ITEM - NAME_REF - IDENT "b" - R_PAREN ")" + PARTITION_ITEM_LIST + L_PAREN "(" + PARTITION_ITEM + NAME_REF + IDENT "z" + COMMA "," + WHITESPACE " " + PARTITION_ITEM + NAME_REF + IDENT "b" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE 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 fcca813a..88883252 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap @@ -356,10 +356,12 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE "\n" UNION_KW "UNION" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap b/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap index 414dccf7..b72ca9cc 100644 --- a/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap @@ -618,10 +618,12 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" R_PAREN ")" R_PAREN ")" R_PAREN ")" diff --git a/crates/squawk_parser/tests/snapshots/tests__insert_err.snap b/crates/squawk_parser/tests/snapshots/tests__insert_err.snap index 6a9f0397..4a857214 100644 --- a/crates/squawk_parser/tests/snapshots/tests__insert_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__insert_err.snap @@ -34,18 +34,20 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "3" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "3" + R_PAREN ")" WHITESPACE "\n " ON_KW "on" WHITESPACE " " @@ -86,18 +88,20 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "3" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "3" + R_PAREN ")" WHITESPACE "\n " ON_KW "on" WHITESPACE " " @@ -140,19 +144,21 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "4" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "5" - WHITESPACE " " - LITERAL - INT_NUMBER "6" - ERROR - COMMA "," - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "4" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "5" + WHITESPACE " " + LITERAL + INT_NUMBER "6" + ERROR + COMMA "," + R_PAREN ")" WHITESPACE "\n " ON_KW "on" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap b/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap index a650025a..946393e7 100644 --- a/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap @@ -18,18 +18,20 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Cheese'" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "9.99" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Cheese'" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "9.99" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" INSERT @@ -62,18 +64,20 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Cheese'" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "9.99" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Cheese'" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "9.99" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" INSERT @@ -106,18 +110,20 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - STRING "'Cheese'" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "9.99" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'Cheese'" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "9.99" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" INSERT @@ -165,46 +171,50 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE "\n " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Cheese'" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "9.99" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Bread'" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "1.99" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - L_PAREN "(" - LITERAL - INT_NUMBER "3" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Milk'" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "2.99" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Cheese'" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "9.99" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Bread'" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "1.99" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "3" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Milk'" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "2.99" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n" INSERT @@ -361,30 +371,32 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE "\n " - L_PAREN "(" - LITERAL - STRING "'UA502'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Bananas'" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "105" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'1971-07-13'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Comedy'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'82 minutes'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'UA502'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Bananas'" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "105" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'1971-07-13'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Comedy'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'82 minutes'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" INSERT @@ -427,26 +439,28 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - STRING "'T_601'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Yojimbo'" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "106" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'1961-06-16'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Drama'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'T_601'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Yojimbo'" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "106" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'1961-06-16'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Drama'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" INSERT @@ -462,30 +476,32 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE "\n " - L_PAREN "(" - LITERAL - STRING "'UA502'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Bananas'" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "105" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "DEFAULT" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Comedy'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'82 minutes'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'UA502'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Bananas'" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "105" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "DEFAULT" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Comedy'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'82 minutes'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" INSERT @@ -528,26 +544,28 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - STRING "'T_601'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Yojimbo'" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "106" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "DEFAULT" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Drama'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'T_601'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Yojimbo'" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "106" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "DEFAULT" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Drama'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" INSERT @@ -605,48 +623,51 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE "\n " - L_PAREN "(" - LITERAL - STRING "'B6717'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Tampopo'" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "110" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'1985-02-10'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Comedy'" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - L_PAREN "(" - LITERAL - STRING "'HG120'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'The Dinner Game'" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "140" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "DEFAULT" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Comedy'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'B6717'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Tampopo'" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "110" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'1985-02-10'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Comedy'" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + ROW + L_PAREN "(" + LITERAL + STRING "'HG120'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'The Dinner Game'" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "140" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "DEFAULT" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Comedy'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" INSERT @@ -730,14 +751,16 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'{{\" \",\" \",\" \"},{\" \",\" \",\" \"},{\" \",\" \",\" \"}}'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'{{\" \",\" \",\" \"},{\" \",\" \",\" \"},{\" \",\" \",\" \"}}'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" COMMENT "-- The subscripts in the above example aren't really needed" @@ -767,14 +790,16 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'{{X,\" \",\" \"},{\" \",O,\" \"},{\" \",X,\" \"}}'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'{{X,\" \",\" \"},{\" \",O,\" \"},{\" \",X,\" \"}}'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" INSERT @@ -802,14 +827,16 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - DEFAULT_KW "DEFAULT" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'XYZ Widgets'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + DEFAULT_KW "DEFAULT" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'XYZ Widgets'" + R_PAREN ")" WHITESPACE "\n " RETURNING_CLAUSE RETURNING_KW "RETURNING" @@ -961,24 +988,27 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "5" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Gizmo Transglobal'" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "6" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Associated Computing, Inc'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "5" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Gizmo Transglobal'" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "6" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Associated Computing, Inc'" + R_PAREN ")" WHITESPACE "\n " ON_KW "ON" WHITESPACE " " @@ -1033,14 +1063,16 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "7" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Redline GmbH'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "7" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Redline GmbH'" + R_PAREN ")" WHITESPACE "\n " ON_KW "ON" WHITESPACE " " @@ -1089,14 +1121,16 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "8" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Anvil Distribution'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "8" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Anvil Distribution'" + R_PAREN ")" WHITESPACE "\n " ON_KW "ON" WHITESPACE " " @@ -1199,14 +1233,16 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "9" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Antwerp Design'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "9" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Antwerp Design'" + R_PAREN ")" WHITESPACE "\n " ON_KW "ON" WHITESPACE " " @@ -1255,14 +1291,16 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "10" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Conrad International'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "10" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Conrad International'" + R_PAREN ")" WHITESPACE "\n " ON_KW "ON" WHITESPACE " " @@ -1311,9 +1349,11 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap index 000232f9..81cd8d2e 100644 --- a/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap @@ -573,38 +573,40 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "default" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "3" - COMMA "," - WHITESPACE " " - BIN_EXPR - BIN_EXPR + ROW_LIST + ROW + L_PAREN "(" LITERAL - INT_NUMBER "10" + INT_NUMBER "1" + COMMA "," WHITESPACE " " - STAR "*" + LITERAL + INT_NUMBER "2" + COMMA "," WHITESPACE " " LITERAL - INT_NUMBER "10" - WHITESPACE " " - PLUS "+" - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" + DEFAULT_KW "default" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "3" + COMMA "," + WHITESPACE " " + BIN_EXPR + BIN_EXPR + LITERAL + INT_NUMBER "10" + WHITESPACE " " + STAR "*" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + WHITESPACE " " + PLUS "+" + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- merge_update" @@ -1017,22 +1019,24 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "customer_id" - COMMA "," - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "transaction_value" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "customer_id" + COMMA "," + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "transaction_value" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_2" @@ -1154,22 +1158,24 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "customer_id" - COMMA "," - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "transaction_value" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "customer_id" + COMMA "," + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "transaction_value" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- doc_example_3" @@ -1246,22 +1252,24 @@ SOURCE_FILE WHITESPACE " " VALUES VALUES_KW "VALUES" - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "winename" - COMMA "," - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock_delta" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "winename" + COMMA "," + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock_delta" + R_PAREN ")" WHITESPACE "\n" WHEN_KW "WHEN" WHITESPACE " " @@ -1412,22 +1420,24 @@ SOURCE_FILE WHITESPACE " " VALUES VALUES_KW "VALUES" - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "winename" - COMMA "," - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "winename" + COMMA "," + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock" + R_PAREN ")" WHITESPACE "\n" WHEN_KW "WHEN" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index 8c58d1b5..23622441 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -169,48 +169,52 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " \n " - L_PAREN "(" - LITERAL - POSITIONAL_PARAM "$1" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$2" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$3" - R_PAREN ")" - COMMA "," - WHITESPACE " \n " - L_PAREN "(" - LITERAL - POSITIONAL_PARAM "$4" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$5" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$6" - R_PAREN ")" - COMMA "," - WHITESPACE " \n " - COMMENT "-- ..., " - WHITESPACE "\n " - L_PAREN "(" - LITERAL - POSITIONAL_PARAM "$2998" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$2999" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$3000" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + POSITIONAL_PARAM "$1" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$2" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$3" + R_PAREN ")" + COMMA "," + WHITESPACE " \n " + ROW + L_PAREN "(" + LITERAL + POSITIONAL_PARAM "$4" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$5" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$6" + R_PAREN ")" + COMMA "," + WHITESPACE " \n " + COMMENT "-- ..., " + WHITESPACE "\n " + ROW + L_PAREN "(" + LITERAL + POSITIONAL_PARAM "$2998" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$2999" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$3000" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n" COMMENT "-- https://www.timescale.com/blog/combining-semantic-search-and-full-text-search-in-postgresql-with-cohere-pgvector-and-pgai/" @@ -1231,16 +1235,18 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - CAST_EXPR - LITERAL - STRING "'2024-12-25'" - COLON_COLON - COLON ":" - COLON ":" - NAME_REF - IDENT "date" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + CAST_EXPR + LITERAL + STRING "'2024-12-25'" + COLON_COLON + COLON ":" + COLON ":" + NAME_REF + IDENT "date" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -1302,16 +1308,18 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - CAST_EXPR - LITERAL - STRING "'2024-12-25'" - COLON_COLON - COLON ":" - COLON ":" - NAME_REF - IDENT "date" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + CAST_EXPR + LITERAL + STRING "'2024-12-25'" + COLON_COLON + COLON ":" + COLON ":" + NAME_REF + IDENT "date" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" SELECT @@ -2356,7 +2364,7 @@ SOURCE_FILE NAME_REF IDENT "brin" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -2627,7 +2635,7 @@ SOURCE_FILE NAME_REF IDENT "brin" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -2740,7 +2748,7 @@ SOURCE_FILE NAME_REF IDENT "brin" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -3629,18 +3637,20 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - CAST_EXPR - LITERAL - STRING "'{\n \"start\": \"2025-01-01T23:30:00.000Z\",\n \"eventTypeId\": 1398027,\n \"attendee\": {\n \"name\": \"Elon Musk\",\n \"email\": \"elon.musk@x.com\",\n \"timeZone\": \"America/New_York\"\n }\n }'" - COLON_COLON - COLON ":" - COLON ":" - NAME_REF - IDENT "jsonb" - WHITESPACE "\n" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + WHITESPACE "\n " + CAST_EXPR + LITERAL + STRING "'{\n \"start\": \"2025-01-01T23:30:00.000Z\",\n \"eventTypeId\": 1398027,\n \"attendee\": {\n \"name\": \"Elon Musk\",\n \"email\": \"elon.musk@x.com\",\n \"timeZone\": \"America/New_York\"\n }\n }'" + COLON_COLON + COLON ":" + COLON ":" + NAME_REF + IDENT "jsonb" + WHITESPACE "\n" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n" COMMENT "-- https://www.tinybird.co/blog-posts/outgrowing-postgres-how-to-run-olap-workloads-on-postgres" @@ -3747,7 +3757,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "hourly_stats" - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -3809,11 +3819,12 @@ SOURCE_FILE WHITESPACE " " RANGE_KW "RANGE" WHITESPACE " " - L_PAREN "(" - PARTITION_ITEM - NAME_REF - IDENT "event_time" - R_PAREN ")" + PARTITION_ITEM_LIST + L_PAREN "(" + PARTITION_ITEM + NAME_REF + IDENT "event_time" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" CREATE_TABLE @@ -4980,44 +4991,46 @@ SOURCE_FILE CASE_EXPR CASE_KW "CASE" WHITESPACE " \n " - WHEN_CLAUSE - WHEN_KW "WHEN" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "lifetime_value" + WHEN_CLAUSE_LIST + WHEN_CLAUSE + WHEN_KW "WHEN" WHITESPACE " " - R_ANGLE ">" + BIN_EXPR + NAME_REF + IDENT "lifetime_value" + WHITESPACE " " + R_ANGLE ">" + WHITESPACE " " + LITERAL + INT_NUMBER "1000" + WHITESPACE " " + THEN_KW "THEN" WHITESPACE " " LITERAL - INT_NUMBER "1000" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE " " - LITERAL - STRING "'high'" - WHITESPACE "\n " - WHEN_CLAUSE - WHEN_KW "WHEN" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "lifetime_value" + STRING "'high'" + WHITESPACE "\n " + WHEN_CLAUSE + WHEN_KW "WHEN" WHITESPACE " " - R_ANGLE ">" + BIN_EXPR + NAME_REF + IDENT "lifetime_value" + WHITESPACE " " + R_ANGLE ">" + WHITESPACE " " + LITERAL + INT_NUMBER "100" + WHITESPACE " " + THEN_KW "THEN" WHITESPACE " " LITERAL - INT_NUMBER "100" - WHITESPACE " " - THEN_KW "THEN" + STRING "'medium'" + WHITESPACE "\n " + ELSE_CLAUSE + ELSE_KW "ELSE" WHITESPACE " " LITERAL - STRING "'medium'" - WHITESPACE "\n " - ELSE_KW "ELSE" - WHITESPACE " " - LITERAL - STRING "'low'" + STRING "'low'" WHITESPACE "\n " END_KW "END" WHITESPACE " " @@ -5602,7 +5615,7 @@ SOURCE_FILE NAME_REF IDENT "events" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" WHITESPACE "\n " PARTITION_ITEM @@ -5642,7 +5655,7 @@ SOURCE_FILE WHITESPACE " " NAME_REF IDENT "brin" - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -5900,7 +5913,7 @@ SOURCE_FILE NAME_REF IDENT "recent_product_sales" WHITESPACE " " - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -5938,7 +5951,7 @@ SOURCE_FILE PATH_SEGMENT NAME_REF IDENT "recent_product_sales" - INDEX_PARAMS + PARTITION_ITEM_LIST L_PAREN "(" PARTITION_ITEM NAME_REF @@ -6791,44 +6804,46 @@ SOURCE_FILE CASE_EXPR CASE_KW "CASE" WHITESPACE " \n " - WHEN_CLAUSE - WHEN_KW "WHEN" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "avg_price" + WHEN_CLAUSE_LIST + WHEN_CLAUSE + WHEN_KW "WHEN" WHITESPACE " " - R_ANGLE ">" + BIN_EXPR + NAME_REF + IDENT "avg_price" + WHITESPACE " " + R_ANGLE ">" + WHITESPACE " " + NAME_REF + IDENT "price_75th" WHITESPACE " " - NAME_REF - IDENT "price_75th" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE " " - LITERAL - STRING "'SELL'" - WHITESPACE "\n " - WHEN_CLAUSE - WHEN_KW "WHEN" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "avg_price" + THEN_KW "THEN" WHITESPACE " " - L_ANGLE "<" + LITERAL + STRING "'SELL'" + WHITESPACE "\n " + WHEN_CLAUSE + WHEN_KW "WHEN" WHITESPACE " " - NAME_REF - IDENT "price_75th" - WHITESPACE " " - THEN_KW "THEN" + BIN_EXPR + NAME_REF + IDENT "avg_price" + WHITESPACE " " + L_ANGLE "<" + WHITESPACE " " + NAME_REF + IDENT "price_75th" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE " " + LITERAL + STRING "'BUY'" + WHITESPACE "\n " + ELSE_CLAUSE + ELSE_KW "ELSE" WHITESPACE " " LITERAL - STRING "'BUY'" - WHITESPACE "\n " - ELSE_KW "ELSE" - WHITESPACE " " - LITERAL - STRING "'HOLD'" + STRING "'HOLD'" WHITESPACE "\n " END_KW "END" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__prepare_err.snap b/crates/squawk_parser/tests/snapshots/tests__prepare_err.snap index fb5ec86b..98fd4dad 100644 --- a/crates/squawk_parser/tests/snapshots/tests__prepare_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__prepare_err.snap @@ -52,22 +52,24 @@ SOURCE_FILE WHITESPACE " " VALUES VALUES_KW "VALUES" - L_PAREN "(" - LITERAL - POSITIONAL_PARAM "$1" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$2" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$3" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$4" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + POSITIONAL_PARAM "$1" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$2" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$3" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$4" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" --- diff --git a/crates/squawk_parser/tests/snapshots/tests__prepare_ok.snap b/crates/squawk_parser/tests/snapshots/tests__prepare_ok.snap index 40a286b3..99076920 100644 --- a/crates/squawk_parser/tests/snapshots/tests__prepare_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__prepare_ok.snap @@ -54,22 +54,24 @@ SOURCE_FILE WHITESPACE " " VALUES VALUES_KW "VALUES" - L_PAREN "(" - LITERAL - POSITIONAL_PARAM "$1" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$2" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$3" - COMMA "," - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$4" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + POSITIONAL_PARAM "$1" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$2" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$3" + COMMA "," + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$4" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n\n" COMMENT "-- select" @@ -386,23 +388,26 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'one'" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'two'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'one'" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'two'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_cte_err.snap b/crates/squawk_parser/tests/snapshots/tests__select_cte_err.snap index 1b4ecf99..f5a30953 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_cte_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_cte_err.snap @@ -322,10 +322,12 @@ SOURCE_FILE WHITESPACE "\n" VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" --- diff --git a/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap index 4bc08d9e..1e5e0fd6 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap @@ -84,10 +84,12 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE "\n" R_PAREN ")" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap index 0dc4d173..2be2e401 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap @@ -2556,10 +2556,12 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap index ff45cfe7..8180cd9c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap @@ -815,16 +815,19 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "3" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "3" + R_PAREN ")" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -995,34 +998,38 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - NAME_REF - IDENT "b" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "3" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - NAME_REF - IDENT "c" - COMMA "," - WHITESPACE " " - NAME_REF - IDENT "d" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + NAME_REF + IDENT "b" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "3" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + NAME_REF + IDENT "c" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "d" + R_PAREN ")" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -1149,27 +1156,28 @@ SOURCE_FILE CASE_EXPR CASE_KW "case" WHITESPACE " " - WHEN_CLAUSE - WHEN_KW "when" - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$1" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - WHEN_CLAUSE - WHEN_KW "when" - WHITESPACE " " - LITERAL - POSITIONAL_PARAM "$2" - WHITESPACE " " - THEN_KW "then" + WHEN_CLAUSE_LIST + WHEN_CLAUSE + WHEN_KW "when" + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$1" + WHITESPACE " " + THEN_KW "then" + WHITESPACE " " + LITERAL + INT_NUMBER "1" WHITESPACE " " - LITERAL - INT_NUMBER "2" + WHEN_CLAUSE + WHEN_KW "when" + WHITESPACE " " + LITERAL + POSITIONAL_PARAM "$2" + WHITESPACE " " + THEN_KW "then" + WHITESPACE " " + LITERAL + INT_NUMBER "2" WHITESPACE " " END_KW "end" WHITESPACE " " @@ -1197,44 +1205,46 @@ SOURCE_FILE CASE_EXPR CASE_KW "case" WHITESPACE " " - WHEN_CLAUSE - WHEN_KW "when" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "a" + WHEN_CLAUSE_LIST + WHEN_CLAUSE + WHEN_KW "when" WHITESPACE " " - EQ "=" + BIN_EXPR + NAME_REF + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + WHITESPACE " " + THEN_KW "then" WHITESPACE " " LITERAL - INT_NUMBER "1" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " " - LITERAL - STRING "'one'" - WHITESPACE "\n " - WHEN_CLAUSE - WHEN_KW "when" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "a" + STRING "'one'" + WHITESPACE "\n " + WHEN_CLAUSE + WHEN_KW "when" WHITESPACE " " - EQ "=" + BIN_EXPR + NAME_REF + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "2" + WHITESPACE " " + THEN_KW "then" WHITESPACE " " LITERAL - INT_NUMBER "2" - WHITESPACE " " - THEN_KW "then" + STRING "'two'" + WHITESPACE "\n " + ELSE_CLAUSE + ELSE_KW "else" WHITESPACE " " LITERAL - STRING "'two'" - WHITESPACE "\n " - ELSE_KW "else" - WHITESPACE " " - LITERAL - STRING "'other'" + STRING "'other'" WHITESPACE "\n " END_KW "end" WHITESPACE "\n" @@ -1262,39 +1272,40 @@ SOURCE_FILE CASE_EXPR CASE_KW "case" WHITESPACE " " - WHEN_CLAUSE - WHEN_KW "when" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "a" + WHEN_CLAUSE_LIST + WHEN_CLAUSE + WHEN_KW "when" WHITESPACE " " - EQ "=" + BIN_EXPR + NAME_REF + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + WHITESPACE " " + THEN_KW "then" WHITESPACE " " LITERAL - INT_NUMBER "1" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " " - LITERAL - STRING "'one'" - WHITESPACE "\n " - WHEN_CLAUSE - WHEN_KW "when" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "a" + STRING "'one'" + WHITESPACE "\n " + WHEN_CLAUSE + WHEN_KW "when" WHITESPACE " " - EQ "=" + BIN_EXPR + NAME_REF + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "2" + WHITESPACE " " + THEN_KW "then" WHITESPACE " " LITERAL - INT_NUMBER "2" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " " - LITERAL - STRING "'two'" + STRING "'two'" WHITESPACE "\n " END_KW "end" WHITESPACE "\n" @@ -1325,32 +1336,34 @@ SOURCE_FILE NAME_REF IDENT "a" WHITESPACE " " - WHEN_CLAUSE - WHEN_KW "when" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " " - LITERAL - STRING "'one'" + WHEN_CLAUSE_LIST + WHEN_CLAUSE + WHEN_KW "when" + WHITESPACE " " + LITERAL + INT_NUMBER "1" + WHITESPACE " " + THEN_KW "then" + WHITESPACE " " + LITERAL + STRING "'one'" + WHITESPACE "\n " + WHEN_CLAUSE + WHEN_KW "when" + WHITESPACE " " + LITERAL + INT_NUMBER "2" + WHITESPACE " " + THEN_KW "then" + WHITESPACE " " + LITERAL + STRING "'two'" WHITESPACE "\n " - WHEN_CLAUSE - WHEN_KW "when" - WHITESPACE " " - LITERAL - INT_NUMBER "2" - WHITESPACE " " - THEN_KW "then" + ELSE_CLAUSE + ELSE_KW "else" WHITESPACE " " LITERAL - STRING "'two'" - WHITESPACE "\n " - ELSE_KW "else" - WHITESPACE " " - LITERAL - STRING "'other'" + STRING "'other'" WHITESPACE "\n " END_KW "end" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap index 7d72608e..dbedc323 100644 --- a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap @@ -1026,14 +1026,16 @@ SOURCE_FILE WHITESPACE " " VALUES VALUES_KW "VALUES" - L_PAREN "(" - LITERAL - STRING "'Chateau Lafite 2003'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'24'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'Chateau Lafite 2003'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'24'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" COMMENT "-- Assume the above fails because of a unique key violation," diff --git a/crates/squawk_parser/tests/snapshots/tests__values_err.snap b/crates/squawk_parser/tests/snapshots/tests__values_err.snap index bf96e74a..6b125d6d 100644 --- a/crates/squawk_parser/tests/snapshots/tests__values_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__values_err.snap @@ -9,17 +9,20 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - ERROR - COMMA "," - R_PAREN ")" - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + ERROR + COMMA "," + R_PAREN ")" + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- extra comma, aka missing tuple" @@ -27,18 +30,21 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" - COMMA "," - ERROR + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - R_PAREN ")" + ERROR + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" --- diff --git a/crates/squawk_parser/tests/snapshots/tests__values_ok.snap b/crates/squawk_parser/tests/snapshots/tests__values_ok.snap index d65302cb..e7b805f7 100644 --- a/crates/squawk_parser/tests/snapshots/tests__values_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__values_ok.snap @@ -8,34 +8,38 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'one'" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'two'" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "3" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'three'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'one'" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'two'" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "3" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'three'" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- union_with_select" @@ -118,56 +122,59 @@ SOURCE_FILE VALUES VALUES_KW "VALUES" WHITESPACE "\n " - L_PAREN "(" - LITERAL - STRING "'UA502'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Bananas'" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "105" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "DEFAULT" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Comedy'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'82 minutes'" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - L_PAREN "(" - LITERAL - STRING "'T_601'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Yojimbo'" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "106" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "DEFAULT" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Drama'" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "DEFAULT" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'UA502'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Bananas'" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "105" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "DEFAULT" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Comedy'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'82 minutes'" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + ROW + L_PAREN "(" + LITERAL + STRING "'T_601'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Yojimbo'" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "106" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "DEFAULT" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Drama'" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "DEFAULT" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- in_select_from_position" @@ -201,24 +208,27 @@ SOURCE_FILE L_PAREN "(" VALUES VALUES_KW "VALUES" - L_PAREN "(" - LITERAL - STRING "'MGM'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Horror'" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - STRING "'UA'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'Sci-Fi'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + STRING "'MGM'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Horror'" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + STRING "'UA'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'Sci-Fi'" + R_PAREN ")" R_PAREN ")" WHITESPACE " " ALIAS @@ -319,32 +329,35 @@ SOURCE_FILE L_PAREN "(" VALUES VALUES_KW "VALUES" - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "200000" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "1.2" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "400000" - COMMA "," - WHITESPACE " " - LITERAL - FLOAT_NUMBER "1.4" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "200000" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "1.2" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "400000" + COMMA "," + WHITESPACE " " + LITERAL + FLOAT_NUMBER "1.4" + R_PAREN ")" R_PAREN ")" WHITESPACE " " ALIAS @@ -441,28 +454,32 @@ SOURCE_FILE L_PAREN "(" VALUES VALUES_KW "VALUES" - L_PAREN "(" - CAST_EXPR - LITERAL - STRING "'192.168.0.1'" - COLON_COLON - COLON ":" - COLON ":" - NAME_REF - IDENT "inet" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - STRING "'192.168.0.10'" - R_PAREN ")" - COMMA "," - WHITESPACE " " - L_PAREN "(" - LITERAL - STRING "'192.168.1.43'" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + CAST_EXPR + LITERAL + STRING "'192.168.0.1'" + COLON_COLON + COLON ":" + COLON ":" + NAME_REF + IDENT "inet" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + STRING "'192.168.0.10'" + R_PAREN ")" + COMMA "," + WHITESPACE " " + ROW + L_PAREN "(" + LITERAL + STRING "'192.168.1.43'" + R_PAREN ")" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -472,28 +489,32 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" WHITESPACE " " UNION_KW "union" WHITESPACE " " VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "3" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "4" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "3" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "4" + R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- union_select_values" @@ -502,10 +523,12 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE " " UNION_KW "union" WHITESPACE " " @@ -513,10 +536,12 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + R_PAREN ")" WHITESPACE " " UNION_KW "union" WHITESPACE " " @@ -549,10 +574,12 @@ SOURCE_FILE VALUES VALUES_KW "values" WHITESPACE " " - L_PAREN "(" - LITERAL - INT_NUMBER "2" - R_PAREN ")" + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "2" + R_PAREN ")" WHITESPACE " " UNION_KW "union" WHITESPACE " " diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index b63c35dd..5e987ed0 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -1418,6 +1418,18 @@ pub struct CaseExpr { pub(crate) syntax: SyntaxNode, } impl CaseExpr { + #[inline] + pub fn else_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn when_clause_list(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn case_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::CASE_KW) @@ -4468,6 +4480,21 @@ impl DropView { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ElseClause { + pub(crate) syntax: SyntaxNode, +} +impl ElseClause { + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn else_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ELSE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct EnableAlwaysRule { pub(crate) syntax: SyntaxNode, @@ -5181,25 +5208,6 @@ impl IndexExpr { } } -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -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) - } - #[inline] - pub fn r_paren_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::R_PAREN) - } -} - #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Inherit { pub(crate) syntax: SyntaxNode, @@ -7599,6 +7607,25 @@ impl PartitionItem { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct PartitionItemList { + pub(crate) syntax: SyntaxNode, +} +impl PartitionItemList { + #[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) + } + #[inline] + pub fn r_paren_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::R_PAREN) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct PartitionOf { pub(crate) syntax: SyntaxNode, @@ -7778,11 +7805,11 @@ impl PrimaryKeyConstraint { support::child(&self.syntax) } #[inline] - pub fn index_params(&self) -> Option { + pub fn name_ref(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn name_ref(&self) -> Option { + pub fn partition_item_list(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -8339,6 +8366,28 @@ impl Rollback { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Row { + pub(crate) syntax: SyntaxNode, +} +impl Row { + #[inline] + pub fn exprs(&self) -> AstChildren { + support::children(&self.syntax) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RowList { + pub(crate) syntax: SyntaxNode, +} +impl RowList { + #[inline] + pub fn rows(&self) -> AstChildren { + support::children(&self.syntax) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RowsFuncOption { pub(crate) syntax: SyntaxNode, @@ -9643,6 +9692,10 @@ pub struct Values { pub(crate) syntax: SyntaxNode, } impl Values { + #[inline] + pub fn row_list(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn values_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::VALUES_KW) @@ -9703,12 +9756,35 @@ pub struct WhenClause { pub(crate) syntax: SyntaxNode, } impl WhenClause { + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn then_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::THEN_KW) + } #[inline] pub fn when_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::WHEN_KW) } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct WhenClauseList { + pub(crate) syntax: SyntaxNode, +} +impl WhenClauseList { + #[inline] + pub fn when_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn when_clauses(&self) -> AstChildren { + support::children(&self.syntax) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct WhereClause { pub(crate) syntax: SyntaxNode, @@ -14134,6 +14210,24 @@ impl AstNode for DropView { &self.syntax } } +impl AstNode for ElseClause { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ELSE_CLAUSE + } + #[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 EnableAlwaysRule { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -14764,24 +14858,6 @@ impl AstNode for IndexExpr { &self.syntax } } -impl AstNode for IndexParams { - #[inline] - fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::INDEX_PARAMS - } - #[inline] - fn cast(syntax: SyntaxNode) -> Option { - if Self::can_cast(syntax.kind()) { - Some(Self { syntax }) - } else { - None - } - } - #[inline] - fn syntax(&self) -> &SyntaxNode { - &self.syntax - } -} impl AstNode for Inherit { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -17014,6 +17090,24 @@ impl AstNode for PartitionItem { &self.syntax } } +impl AstNode for PartitionItemList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::PARTITION_ITEM_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 PartitionOf { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -17734,6 +17828,42 @@ impl AstNode for Rollback { &self.syntax } } +impl AstNode for Row { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ROW + } + #[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 RowList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ROW_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 RowsFuncOption { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -19066,6 +19196,24 @@ impl AstNode for WhenClause { &self.syntax } } +impl AstNode for WhenClauseList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::WHEN_CLAUSE_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 WhereClause { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index eeb58122..6acd881c 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -203,8 +203,11 @@ IsJsonScalar = BinExpr = lhs:Expr Op rhs:Expr +WhenClauseList = + WhenClause WhenClause* + CaseExpr = - 'case' + 'case' Expr? WhenClauseList ElseClause? FieldExpr = Expr '.' (NameRef | '*') @@ -340,7 +343,7 @@ UniqueConstraint = PrimaryKeyConstraint = ('constraint' NameRef) - 'primary' 'key' (UsingIndex | ColumnList IndexParams) + 'primary' 'key' (UsingIndex | ColumnList PartitionItemList) SetNullColumns = 'set' 'null' ColumnList? @@ -590,7 +593,10 @@ TableArgList = '(' args:((TableArg (',' TableArg)*)?) ')' WhenClause = - 'when' + 'when' Expr 'then' Expr + +ElseClause = + 'else' Expr UsingClause = 'using' @@ -893,8 +899,14 @@ AlterTable = Revoke = 'revoke' +Row = + (Expr (',' Expr)*) + +RowList = + (Row (',' Row)*) + Values = - 'values' + 'values' RowList Table = 'table' @@ -1621,7 +1633,7 @@ DropTrigger = PartitionItem = Expr Collate? -IndexParams = +PartitionItemList = '(' (PartitionItem (',' PartitionItem)*) ')' CreateType =