From 7ca8a5554ad64feaaa8b40c4a761f719817f58fb Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Thu, 11 Jun 2026 23:48:28 -0400 Subject: [PATCH] parser: fix collate parsing in create table + more --- crates/squawk_ide/src/column_name.rs | 4 +- crates/squawk_ide/src/expand_selection.rs | 2 + crates/squawk_ide/src/folding_ranges.rs | 2 + crates/squawk_ide/src/resolve.rs | 4 +- .../src/generated/syntax_kind.rs | 6 +- crates/squawk_parser/src/grammar.rs | 115 +++-- .../tests/data/ok/checkpoint.sql | 6 + .../tests/data/ok/create_table.sql | 5 + .../tests/data/ok/create_transform.sql | 16 + .../squawk_parser/tests/data/ok/explain.sql | 6 + .../snapshots/tests__alter_extension_ok.snap | 45 +- .../tests__alter_operator_family_ok.snap | 5 +- .../snapshots/tests__alter_sequence_ok.snap | 5 +- .../snapshots/tests__alter_table_ok.snap | 15 +- .../tests/snapshots/tests__alter_type_ok.snap | 10 +- .../tests/snapshots/tests__checkpoint_ok.snap | 63 +++ .../tests/snapshots/tests__comment_ok.snap | 10 +- .../snapshots/tests__create_domain_ok.snap | 5 +- .../snapshots/tests__create_function_ok.snap | 15 +- .../tests__create_operator_class_ok.snap | 15 +- .../snapshots/tests__create_operator_ok.snap | 5 +- .../snapshots/tests__create_sequence_ok.snap | 5 +- .../snapshots/tests__create_table_ok.snap | 107 +++++ .../snapshots/tests__create_transform_ok.snap | 141 ++++++- .../snapshots/tests__drop_transform_ok.snap | 5 +- .../tests/snapshots/tests__explain_ok.snap | 383 +++++++++++------ .../tests/snapshots/tests__misc_ok.snap | 17 +- .../snapshots/tests__select_casts_ok.snap | 155 +++---- ...ests__select_compound_union_select_ok.snap | 10 +- .../tests/snapshots/tests__select_err.snap | 30 +- .../tests/snapshots/tests__select_ok.snap | 16 +- .../tests/snapshots/tests__select_xml_ok.snap | 20 +- .../squawk_syntax/src/ast/generated/nodes.rs | 394 +++++++++++++++--- crates/squawk_syntax/src/postgresql.ungram | 101 +++-- 34 files changed, 1252 insertions(+), 491 deletions(-) diff --git a/crates/squawk_ide/src/column_name.rs b/crates/squawk_ide/src/column_name.rs index 9a99d38fa..92e718e7e 100644 --- a/crates/squawk_ide/src/column_name.rs +++ b/crates/squawk_ide/src/column_name.rs @@ -187,8 +187,8 @@ fn name_from_name_ref( } SyntaxKind::FLOAT_KW => { let precision = arg_list.and_then(|arg| { - arg.args_().find_map(|arg| { - if let ast::Expr::Literal(lit) = arg.expr()? { + arg.args().find_map(|arg| { + if let ast::Arg::Expr(ast::Expr::Literal(lit)) = arg { lit.syntax().text().to_string().parse::().ok() } else { None diff --git a/crates/squawk_ide/src/expand_selection.rs b/crates/squawk_ide/src/expand_selection.rs index 0de6f2e01..665faa23f 100644 --- a/crates/squawk_ide/src/expand_selection.rs +++ b/crates/squawk_ide/src/expand_selection.rs @@ -40,11 +40,13 @@ const DELIMITED_LIST_KINDS: &[SyntaxKind] = &[ SyntaxKind::ARG_LIST, SyntaxKind::ATTRIBUTE_LIST, SyntaxKind::BEGIN_FUNC_OPTION_LIST, + SyntaxKind::CHECKPOINT_OPTION_LIST, SyntaxKind::COLUMN_LIST, SyntaxKind::CONFLICT_INDEX_ITEM_LIST, SyntaxKind::CONSTRAINT_EXCLUSION_LIST, SyntaxKind::COPY_OPTION_LIST, SyntaxKind::DROP_OP_CLASS_OPTION_LIST, + SyntaxKind::EXPLAIN_OPTION_LIST, SyntaxKind::FDW_OPTION_LIST, SyntaxKind::FUNCTION_SIG_LIST, SyntaxKind::GROUP_BY_LIST, diff --git a/crates/squawk_ide/src/folding_ranges.rs b/crates/squawk_ide/src/folding_ranges.rs index 5d6cb7baa..e7eb43a68 100644 --- a/crates/squawk_ide/src/folding_ranges.rs +++ b/crates/squawk_ide/src/folding_ranges.rs @@ -123,11 +123,13 @@ fn fold_kind(kind: SyntaxKind) -> Option { | SyntaxKind::ALTER_OPTION_LIST | SyntaxKind::ATTRIBUTE_LIST | SyntaxKind::BEGIN_FUNC_OPTION_LIST + | SyntaxKind::CHECKPOINT_OPTION_LIST | SyntaxKind::COLUMN_LIST | SyntaxKind::CONFLICT_INDEX_ITEM_LIST | SyntaxKind::CONSTRAINT_EXCLUSION_LIST | SyntaxKind::COPY_OPTION_LIST | SyntaxKind::DATABASE_OPTION_LIST + | SyntaxKind::EXPLAIN_OPTION_LIST | SyntaxKind::DROP_OP_CLASS_OPTION_LIST | SyntaxKind::FDW_OPTION_LIST | SyntaxKind::FUNCTION_SIG_LIST diff --git a/crates/squawk_ide/src/resolve.rs b/crates/squawk_ide/src/resolve.rs index 53f322759..65d39d843 100644 --- a/crates/squawk_ide/src/resolve.rs +++ b/crates/squawk_ide/src/resolve.rs @@ -749,11 +749,11 @@ fn fallback_type_alias(type_name: &Name) -> Option { fn resolve_float_precision(name_ref: &ast::NameRef, type_name: Name) -> Name { if type_name.0.as_str() == "float" - && let Some(ast::Expr::Literal(lit)) = name_ref + && let Some(ast::Arg::Expr(ast::Expr::Literal(lit))) = name_ref .syntax() .ancestors() .find_map(ast::PathType::cast) - .and_then(|x| x.arg_list()?.args_().next()?.expr()) + .and_then(|x| x.arg_list()?.args().next()) { let precision: u32 = lit.syntax().text().to_string().parse().unwrap_or(0); return Name::from_string(if precision <= 24 { "float4" } else { "float8" }); diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index d5da5ed3e..e23b6b637 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -634,7 +634,6 @@ pub enum SyntaxKind { ALTER_VIEW, ANALYZE, ANY_FN, - ARG, ARG_LIST, ARRAY_EXPR, ARRAY_TYPE, @@ -661,6 +660,8 @@ pub enum SyntaxKind { CAST_SIG, CHAR_TYPE, CHECKPOINT, + CHECKPOINT_OPTION, + CHECKPOINT_OPTION_LIST, CHECK_CONSTRAINT, CLOSE, CLUSTER, @@ -841,6 +842,9 @@ pub enum SyntaxKind { EXECUTE, EXISTS_FN, EXPLAIN, + EXPLAIN_OPTION, + EXPLAIN_OPTION_LIST, + EXPLAIN_OPTION_VALUE, EXPR_AS_NAME, EXPR_AS_NAME_LIST, EXPR_FOLLOWING, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 495f8383e..3f22f33a3 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -1789,16 +1789,7 @@ fn type_mods( COMMA, || "unexpected comma".to_string(), EXPR_FIRST, - |p| { - let m = p.start(); - if expr(p).is_some() { - m.complete(p, ARG); - true - } else { - m.abandon(p); - false - } - }, + |p| expr(p).is_some(), ); m.complete(p, ARG_LIST); } @@ -3884,6 +3875,10 @@ fn opt_column_constraint(p: &mut Parser<'_>) -> Option { // [ column_constraint [ ... ] ] fn opt_column_constraint_list(p: &mut Parser<'_>) { while !p.at(EOF) { + if p.at(COLLATE_KW) { + opt_collate(p); + continue; + } if opt_column_constraint(p).is_none() { break; } @@ -5582,9 +5577,10 @@ fn opt_on_commit(p: &mut Parser<'_>) -> Option { fn commit(p: &mut Parser<'_>) -> CompletedMarker { assert!(p.at(COMMIT_KW) || p.at(END_KW)); let m = p.start(); + let is_commit = p.at(COMMIT_KW); p.bump_any(); // PREPARED transaction_id - if p.eat(PREPARED_KW) { + if is_commit && p.eat(PREPARED_KW) { string_literal(p); } else { // [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] @@ -10365,8 +10361,10 @@ fn create_text_search_template(p: &mut Parser<'_>) -> CompletedMarker { } // CREATE [ OR REPLACE ] TRANSFORM FOR type_name LANGUAGE lang_name ( -// FROM SQL WITH FUNCTION from_sql_function_name [ (argument_type [, ...]) ], -// TO SQL WITH FUNCTION to_sql_function_name [ (argument_type [, ...]) ] +// FROM SQL WITH FUNCTION from_sql_function_name [ (argument_type [, ...]) ] +// | TO SQL WITH FUNCTION to_sql_function_name [ (argument_type [, ...]) ] +// [, FROM SQL WITH FUNCTION from_sql_function_name [ (argument_type [, ...]) ] +// | TO SQL WITH FUNCTION to_sql_function_name [ (argument_type [, ...]) ]] // ); fn create_transform(p: &mut Parser<'_>) -> CompletedMarker { assert!(p.at(CREATE_KW)); @@ -10379,14 +10377,23 @@ fn create_transform(p: &mut Parser<'_>) -> CompletedMarker { p.expect(LANGUAGE_KW); name_ref(p); p.expect(L_PAREN); - transform_from_func(p); - p.expect(COMMA); - transform_to_func(p); + transform_func(p); + if p.eat(COMMA) { + transform_func(p); + } p.expect(R_PAREN); p.eat(SEMICOLON); m.complete(p, CREATE_TRANSFORM) } +fn transform_func(p: &mut Parser<'_>) { + match p.current() { + FROM_KW => transform_from_func(p), + TO_KW => transform_to_func(p), + _ => p.error("expected transform function"), + } +} + fn transform_to_func(p: &mut Parser<'_>) { let m = p.start(); p.expect(TO_KW); @@ -11147,8 +11154,9 @@ fn explain(p: &mut Parser<'_>) -> CompletedMarker { assert!(p.at(EXPLAIN_KW)); let m = p.start(); p.bump(EXPLAIN_KW); - let pre_pg_9_syntax = p.eat(ANALYZE_KW) || p.eat(VERBOSE_KW); - if !pre_pg_9_syntax { + let has_analyze = p.eat(ANALYZE_KW) || p.eat(ANALYSE_KW); + let has_verbose = p.eat(VERBOSE_KW); + if !(has_analyze || has_verbose) { opt_explain_option_list(p); } // statement is SELECT, INSERT, UPDATE, DELETE, MERGE, VALUES, EXECUTE, DECLARE, CREATE TABLE AS, or CREATE MATERIALIZED VIEW AS @@ -11183,10 +11191,11 @@ fn explain(p: &mut Parser<'_>) -> CompletedMarker { m.complete(p, EXPLAIN) } -fn opt_explain_option_list(p: &mut Parser<'_>) { +fn opt_explain_option_list(p: &mut Parser<'_>) -> Option { if !p.at(L_PAREN) || (p.at(L_PAREN) && p.nth_at_ts(1, SELECT_FIRST)) { - return; + return None; } + let m = p.start(); delimited( p, L_PAREN, @@ -11196,6 +11205,7 @@ fn opt_explain_option_list(p: &mut Parser<'_>) { EXPLAIN_OPTION_FIRST, opt_explain_option, ); + Some(m.complete(p, EXPLAIN_OPTION_LIST)) } const EXPLAIN_OPTION_FIRST: TokenSet = @@ -11219,22 +11229,30 @@ fn opt_explain_option(p: &mut Parser<'_>) -> bool { if !p.at_ts(EXPLAIN_OPTION_FIRST) { return false; } - p.bump_any(); - // WAL [ boolean ] - if opt_bool_literal(p) { - return true; - } - // [ { NONE | TEXT | BINARY } ] - if p.eat(NONE_KW) || p.eat(TEXT_KW) || p.eat(BINARY_KW) { - return true; - } - // { TEXT | XML | JSON | YAML } - if p.eat(TEXT_KW) || p.eat(XML_KW) || p.eat(JSON_KW) || opt_ident(p) { - return true; - } + let m = p.start(); + col_label(p); + opt_explain_option_value(p); + m.complete(p, EXPLAIN_OPTION); true } +fn opt_explain_option_value(p: &mut Parser<'_>) -> Option { + let m = p.start(); + // boolean, { NONE | TEXT | BINARY }, or { TEXT | XML | JSON | YAML } + if opt_bool_literal(p) + || p.eat(NONE_KW) + || p.eat(TEXT_KW) + || p.eat(BINARY_KW) + || p.eat(XML_KW) + || p.eat(JSON_KW) + || opt_ident(p) + { + return Some(m.complete(p, EXPLAIN_OPTION_VALUE)); + } + m.abandon(p); + None +} + // [ OPTIONS ( option 'value' [, ... ] ) ] fn opt_alter_option_list(p: &mut Parser<'_>) -> bool { if !p.at(OPTIONS_KW) { @@ -12373,15 +12391,44 @@ fn unlisten(p: &mut Parser<'_>) -> CompletedMarker { m.complete(p, UNLISTEN) } -// CHECKPOINT +// CHECKPOINT [ ( option [, ...] ) ] fn checkpoint(p: &mut Parser<'_>) -> CompletedMarker { assert!(p.at(CHECKPOINT_KW)); let m = p.start(); p.bump(CHECKPOINT_KW); + opt_checkpoint_option_list(p); p.eat(SEMICOLON); m.complete(p, CHECKPOINT) } +fn opt_checkpoint_option_list(p: &mut Parser<'_>) -> Option { + if !p.at(L_PAREN) { + return None; + } + let m = p.start(); + delimited( + p, + L_PAREN, + R_PAREN, + COMMA, + || "unexpected comma".to_string(), + NAME_FIRST, + opt_checkpoint_option, + ); + Some(m.complete(p, CHECKPOINT_OPTION_LIST)) +} + +fn opt_checkpoint_option(p: &mut Parser<'_>) -> bool { + if !p.at_ts(NAME_FIRST) { + return false; + } + let m = p.start(); + name(p); + opt_expr(p); + m.complete(p, CHECKPOINT_OPTION); + true +} + // DEALLOCATE [ PREPARE ] { name | ALL } fn deallocate(p: &mut Parser<'_>) -> CompletedMarker { assert!(p.at(DEALLOCATE_KW)); diff --git a/crates/squawk_parser/tests/data/ok/checkpoint.sql b/crates/squawk_parser/tests/data/ok/checkpoint.sql index 66d2728cd..4a1163ab8 100644 --- a/crates/squawk_parser/tests/data/ok/checkpoint.sql +++ b/crates/squawk_parser/tests/data/ok/checkpoint.sql @@ -1,3 +1,9 @@ -- checkpoint checkpoint; +-- checkpoint options +checkpoint (mode fast); +checkpoint (mode spread, flush_unlogged true); +checkpoint (flush_unlogged false); +checkpoint (flush_unlogged); + diff --git a/crates/squawk_parser/tests/data/ok/create_table.sql b/crates/squawk_parser/tests/data/ok/create_table.sql index 85b39a487..35c758125 100644 --- a/crates/squawk_parser/tests/data/ok/create_table.sql +++ b/crates/squawk_parser/tests/data/ok/create_table.sql @@ -408,3 +408,8 @@ CREATE TABLE t ( quarter int, PRIMARY KEY (symbol, period, year, quarter) ); + +-- collate can appear in many places +CREATE TABLE t (id varchar COLLATE "C" PRIMARY KEY); +CREATE TABLE t (id VARCHAR PRIMARY KEY COLLATE "C"); +CREATE TABLE t (id varchar NOT NULL COLLATE "C" UNIQUE); diff --git a/crates/squawk_parser/tests/data/ok/create_transform.sql b/crates/squawk_parser/tests/data/ok/create_transform.sql index 8a1b81330..9aace9e26 100644 --- a/crates/squawk_parser/tests/data/ok/create_transform.sql +++ b/crates/squawk_parser/tests/data/ok/create_transform.sql @@ -10,3 +10,19 @@ create or replace transform for foo.t(10231) language l ( to sql with function g ); +-- from only +create transform for only_from language l ( + from sql with function t +); + +-- to only +create transform for only_to language l ( + to sql with function g +); + +-- reverse order +create transform for reverse_order language l ( + to sql with function g, + from sql with function t +); + diff --git a/crates/squawk_parser/tests/data/ok/explain.sql b/crates/squawk_parser/tests/data/ok/explain.sql index 0b28709a1..23aecabd0 100644 --- a/crates/squawk_parser/tests/data/ok/explain.sql +++ b/crates/squawk_parser/tests/data/ok/explain.sql @@ -4,6 +4,12 @@ explain select * from t; -- explain_analyze explain analyze select a from t; +-- explain_analyze_verbose +explain analyze verbose select a from t; + +-- explain_parenthesized_options +explain (analyze, buffers) select 1; + -- all_options explain ( analyze, diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_extension_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_extension_ok.snap index 008d6518d..abc1bb94f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_extension_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_extension_ok.snap @@ -236,9 +236,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE " " AS_KW "as" @@ -678,9 +677,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" COMMA "," WHITESPACE " " @@ -761,9 +759,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" R_PAREN ")" SEMICOLON ";" @@ -891,9 +888,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" R_PAREN ")" SEMICOLON ";" @@ -927,9 +923,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" R_PAREN ")" SEMICOLON ";" @@ -1153,9 +1148,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" COMMA "," WHITESPACE " " @@ -1236,9 +1230,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" R_PAREN ")" SEMICOLON ";" @@ -1296,9 +1289,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" COMMA "," WHITESPACE " " @@ -1379,9 +1371,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" R_PAREN ")" SEMICOLON ";" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_operator_family_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_operator_family_ok.snap index b2eed7553..346d5eb7f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_operator_family_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_operator_family_ok.snap @@ -173,9 +173,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" R_PAREN ")" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_sequence_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_sequence_ok.snap index 30b4a3015..c60509460 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_sequence_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_sequence_ok.snap @@ -32,9 +32,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE "\n " SEQUENCE_OPTION 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 4f420e63a..86fc36571 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap @@ -62,14 +62,12 @@ SOURCE_FILE NUMERIC_KW "numeric" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "10" + LITERAL + INT_NUMBER "10" COMMA "," WHITESPACE " " - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n\n" @@ -3812,9 +3810,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "30" + LITERAL + INT_NUMBER "30" R_PAREN ")" WHITESPACE " " DEFAULT_CONSTRAINT 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 358817734..9e34b41e1 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap @@ -479,9 +479,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE " " RESTRICT_KW "restrict" @@ -624,9 +623,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE " " COLLATE diff --git a/crates/squawk_parser/tests/snapshots/tests__checkpoint_ok.snap b/crates/squawk_parser/tests/snapshots/tests__checkpoint_ok.snap index df9b0ff0b..ddfd92c9a 100644 --- a/crates/squawk_parser/tests/snapshots/tests__checkpoint_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__checkpoint_ok.snap @@ -9,3 +9,66 @@ SOURCE_FILE CHECKPOINT_KW "checkpoint" SEMICOLON ";" WHITESPACE "\n\n" + COMMENT "-- checkpoint options" + WHITESPACE "\n" + CHECKPOINT + CHECKPOINT_KW "checkpoint" + WHITESPACE " " + CHECKPOINT_OPTION_LIST + L_PAREN "(" + CHECKPOINT_OPTION + NAME + MODE_KW "mode" + WHITESPACE " " + NAME_REF + IDENT "fast" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + CHECKPOINT + CHECKPOINT_KW "checkpoint" + WHITESPACE " " + CHECKPOINT_OPTION_LIST + L_PAREN "(" + CHECKPOINT_OPTION + NAME + MODE_KW "mode" + WHITESPACE " " + NAME_REF + IDENT "spread" + COMMA "," + WHITESPACE " " + CHECKPOINT_OPTION + NAME + IDENT "flush_unlogged" + WHITESPACE " " + LITERAL + TRUE_KW "true" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + CHECKPOINT + CHECKPOINT_KW "checkpoint" + WHITESPACE " " + CHECKPOINT_OPTION_LIST + L_PAREN "(" + CHECKPOINT_OPTION + NAME + IDENT "flush_unlogged" + WHITESPACE " " + LITERAL + FALSE_KW "false" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + CHECKPOINT + CHECKPOINT_KW "checkpoint" + WHITESPACE " " + CHECKPOINT_OPTION_LIST + L_PAREN "(" + CHECKPOINT_OPTION + NAME + IDENT "flush_unlogged" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__comment_ok.snap b/crates/squawk_parser/tests/snapshots/tests__comment_ok.snap index 57363e7d9..c7f8cfd23 100644 --- a/crates/squawk_parser/tests/snapshots/tests__comment_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__comment_ok.snap @@ -637,9 +637,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" COMMA "," WHITESPACE " " @@ -647,9 +646,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "200" + LITERAL + INT_NUMBER "200" R_PAREN ")" R_PAREN ")" WHITESPACE " " diff --git a/crates/squawk_parser/tests/snapshots/tests__create_domain_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_domain_ok.snap index d1a974780..8e940de61 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_domain_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_domain_ok.snap @@ -40,9 +40,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE "\n " COLLATE diff --git a/crates/squawk_parser/tests/snapshots/tests__create_function_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_function_ok.snap index 7007b808d..569546066 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_function_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_function_ok.snap @@ -614,9 +614,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "255" + LITERAL + INT_NUMBER "255" R_PAREN ")" WHITESPACE "\n" FUNC_OPTION_LIST @@ -631,9 +630,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE "\n" AS_FUNC_OPTION @@ -2185,9 +2183,8 @@ SOURCE_FILE BIT_KW "bit" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "8" + LITERAL + INT_NUMBER "8" R_PAREN ")" R_PAREN ")" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_operator_class_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_operator_class_ok.snap index e51a1e169..94f842388 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_operator_class_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_operator_class_ok.snap @@ -72,9 +72,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE "\n " USING_KW "using" @@ -172,9 +171,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" COMMA "," WHITESPACE " " @@ -182,9 +180,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "10" + LITERAL + INT_NUMBER "10" R_PAREN ")" R_PAREN ")" 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 168342e75..601a6f8f6 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_operator_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_operator_ok.snap @@ -126,9 +126,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" COMMA "," WHITESPACE "\n " diff --git a/crates/squawk_parser/tests/snapshots/tests__create_sequence_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_sequence_ok.snap index 72569c9d2..852a4951b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_sequence_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_sequence_ok.snap @@ -45,9 +45,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE "\n " SEQUENCE_OPTION 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 8539b2b58..790361e04 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap @@ -4023,4 +4023,111 @@ SOURCE_FILE WHITESPACE "\n" R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "-- collate can appear in many places" + WHITESPACE "\n" + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "id" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "varchar" + WHITESPACE " " + COLLATE + COLLATE_KW "COLLATE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "\"C\"" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + CREATE_TABLE + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "id" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "VARCHAR" + WHITESPACE " " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLLATE + COLLATE_KW "COLLATE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "\"C\"" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + CREATE_TABLE + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + COLUMN + NAME + IDENT "id" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "varchar" + WHITESPACE " " + NOT_NULL_CONSTRAINT + NOT_KW "NOT" + WHITESPACE " " + NULL_KW "NULL" + WHITESPACE " " + COLLATE + COLLATE_KW "COLLATE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "\"C\"" + WHITESPACE " " + UNIQUE_CONSTRAINT + UNIQUE_KW "UNIQUE" + R_PAREN ")" + SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_transform_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_transform_ok.snap index b843d0f55..de4e25484 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_transform_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_transform_ok.snap @@ -85,9 +85,8 @@ SOURCE_FILE IDENT "t" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "10231" + LITERAL + INT_NUMBER "10231" R_PAREN ")" WHITESPACE " " LANGUAGE_KW "language" @@ -153,3 +152,139 @@ SOURCE_FILE R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" + COMMENT "-- from only" + WHITESPACE "\n" + CREATE_TRANSFORM + CREATE_KW "create" + WHITESPACE " " + TRANSFORM_KW "transform" + WHITESPACE " " + FOR_KW "for" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "only_from" + WHITESPACE " " + LANGUAGE_KW "language" + WHITESPACE " " + NAME_REF + IDENT "l" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + TRANSFORM_FROM_FUNC + FROM_KW "from" + WHITESPACE " " + SQL_KW "sql" + WHITESPACE " " + WITH_KW "with" + WHITESPACE " " + FUNCTION_KW "function" + WHITESPACE " " + FUNCTION_SIG + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- to only" + WHITESPACE "\n" + CREATE_TRANSFORM + CREATE_KW "create" + WHITESPACE " " + TRANSFORM_KW "transform" + WHITESPACE " " + FOR_KW "for" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "only_to" + WHITESPACE " " + LANGUAGE_KW "language" + WHITESPACE " " + NAME_REF + IDENT "l" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + TRANSFORM_TO_FUNC + TO_KW "to" + WHITESPACE " " + SQL_KW "sql" + WHITESPACE " " + WITH_KW "with" + WHITESPACE " " + FUNCTION_KW "function" + WHITESPACE " " + FUNCTION_SIG + PATH + PATH_SEGMENT + NAME_REF + IDENT "g" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- reverse order" + WHITESPACE "\n" + CREATE_TRANSFORM + CREATE_KW "create" + WHITESPACE " " + TRANSFORM_KW "transform" + WHITESPACE " " + FOR_KW "for" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "reverse_order" + WHITESPACE " " + LANGUAGE_KW "language" + WHITESPACE " " + NAME_REF + IDENT "l" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + TRANSFORM_TO_FUNC + TO_KW "to" + WHITESPACE " " + SQL_KW "sql" + WHITESPACE " " + WITH_KW "with" + WHITESPACE " " + FUNCTION_KW "function" + WHITESPACE " " + FUNCTION_SIG + PATH + PATH_SEGMENT + NAME_REF + IDENT "g" + COMMA "," + WHITESPACE "\n " + TRANSFORM_FROM_FUNC + FROM_KW "from" + WHITESPACE " " + SQL_KW "sql" + WHITESPACE " " + WITH_KW "with" + WHITESPACE " " + FUNCTION_KW "function" + WHITESPACE " " + FUNCTION_SIG + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__drop_transform_ok.snap b/crates/squawk_parser/tests/snapshots/tests__drop_transform_ok.snap index e8190c50b..ff65e592d 100644 --- a/crates/squawk_parser/tests/snapshots/tests__drop_transform_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__drop_transform_ok.snap @@ -65,9 +65,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" R_PAREN ")" WHITESPACE " " LANGUAGE_KW "language" diff --git a/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap b/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap index b6e1dc0b4..1c435145b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__explain_ok.snap @@ -48,93 +48,196 @@ SOURCE_FILE IDENT "t" SEMICOLON ";" WHITESPACE "\n\n" - COMMENT "-- all_options" + COMMENT "-- explain_analyze_verbose" WHITESPACE "\n" EXPLAIN EXPLAIN_KW "explain" WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " ANALYZE_KW "analyze" - COMMA "," - WHITESPACE "\n " - VERBOSE_KW "verbose" - COMMA "," - WHITESPACE "\n " - IDENT "costs" - COMMA "," - WHITESPACE "\n " - IDENT "costs" - WHITESPACE " " - LITERAL - TRUE_KW "true" - COMMA "," - WHITESPACE "\n " - IDENT "costs" - WHITESPACE " " - LITERAL - FALSE_KW "false" - COMMA "," - WHITESPACE "\n " - IDENT "settings" - COMMA "," - WHITESPACE "\n " - IDENT "generic_plan" - COMMA "," - WHITESPACE "\n " - IDENT "buffers" - COMMA "," - WHITESPACE "\n " - IDENT "serialize" - COMMA "," - WHITESPACE "\n " - IDENT "serialize" - WHITESPACE " " - NONE_KW "none" - COMMA "," - WHITESPACE "\n " - IDENT "serialize" - WHITESPACE " " - TEXT_KW "text" - COMMA "," - WHITESPACE "\n " - IDENT "serialize" WHITESPACE " " - BINARY_KW "binary" - COMMA "," - WHITESPACE "\n " - IDENT "wal" - COMMA "," - WHITESPACE "\n " - IDENT "timing" - COMMA "," - WHITESPACE "\n " - IDENT "summary" - COMMA "," - WHITESPACE "\n " - IDENT "memory" - COMMA "," - WHITESPACE "\n " - FORMAT_KW "format" + VERBOSE_KW "verbose" WHITESPACE " " - TEXT_KW "text" - COMMA "," - WHITESPACE "\n " - FORMAT_KW "format" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "a" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- explain_parenthesized_options" + WHITESPACE "\n" + EXPLAIN + EXPLAIN_KW "explain" WHITESPACE " " - XML_KW "xml" - COMMA "," - WHITESPACE "\n " - FORMAT_KW "format" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + ANALYZE_KW "analyze" + COMMA "," + WHITESPACE " " + EXPLAIN_OPTION + NAME + IDENT "buffers" + R_PAREN ")" WHITESPACE " " - JSON_KW "json" - COMMA "," - WHITESPACE "\n " - FORMAT_KW "format" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- all_options" + WHITESPACE "\n" + EXPLAIN + EXPLAIN_KW "explain" WHITESPACE " " - IDENT "yaml" - WHITESPACE "\n" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + ANALYZE_KW "analyze" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + VERBOSE_KW "verbose" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "costs" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "costs" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + LITERAL + TRUE_KW "true" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "costs" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + LITERAL + FALSE_KW "false" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "settings" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "generic_plan" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "buffers" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "serialize" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "serialize" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + NONE_KW "none" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "serialize" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "serialize" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + BINARY_KW "binary" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "wal" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "timing" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "summary" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + IDENT "memory" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + FORMAT_KW "format" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + FORMAT_KW "format" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + XML_KW "xml" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + FORMAT_KW "format" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + JSON_KW "json" + COMMA "," + WHITESPACE "\n " + EXPLAIN_OPTION + NAME + FORMAT_KW "format" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + IDENT "yaml" + WHITESPACE "\n" + R_PAREN ")" WHITESPACE "\n" SELECT SELECT_CLAUSE @@ -151,11 +254,15 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - FORMAT_KW "FORMAT" - WHITESPACE " " - JSON_KW "JSON" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + FORMAT_KW "FORMAT" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + JSON_KW "JSON" + R_PAREN ")" WHITESPACE " " SELECT SELECT_CLAUSE @@ -211,11 +318,15 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - FORMAT_KW "FORMAT" - WHITESPACE " " - IDENT "YAML" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + FORMAT_KW "FORMAT" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + IDENT "YAML" + R_PAREN ")" WHITESPACE " " SELECT SELECT_CLAUSE @@ -248,12 +359,16 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - IDENT "COSTS" - WHITESPACE " " - LITERAL - FALSE_KW "FALSE" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + IDENT "COSTS" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + LITERAL + FALSE_KW "FALSE" + R_PAREN ")" WHITESPACE " " SELECT SELECT_CLAUSE @@ -433,9 +548,12 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - IDENT "GENERIC_PLAN" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + IDENT "GENERIC_PLAN" + R_PAREN ")" WHITESPACE "\n " SELECT SELECT_CLAUSE @@ -499,9 +617,12 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - IDENT "GENERIC_PLAN" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + IDENT "GENERIC_PLAN" + R_PAREN ")" WHITESPACE "\n " SELECT SELECT_CLAUSE @@ -648,12 +769,16 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - IDENT "COSTS" - WHITESPACE " " - LITERAL - OFF_KW "OFF" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + IDENT "COSTS" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + LITERAL + OFF_KW "OFF" + R_PAREN ")" WHITESPACE " " SELECT SELECT_CLAUSE @@ -688,12 +813,16 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - IDENT "COSTS" - WHITESPACE " " - LITERAL - ON_KW "ON" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + IDENT "COSTS" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + LITERAL + ON_KW "ON" + R_PAREN ")" WHITESPACE " " SELECT SELECT_CLAUSE @@ -728,12 +857,16 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - IDENT "COSTS" - WHITESPACE " " - LITERAL - INT_NUMBER "1" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + IDENT "COSTS" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + LITERAL + INT_NUMBER "1" + R_PAREN ")" WHITESPACE " " SELECT SELECT_CLAUSE @@ -768,12 +901,16 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - IDENT "COSTS" - WHITESPACE " " - LITERAL - INT_NUMBER "0" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + IDENT "COSTS" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + LITERAL + INT_NUMBER "0" + R_PAREN ")" WHITESPACE " " SELECT SELECT_CLAUSE diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index 602f712e7..d148f4239 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -5456,12 +5456,17 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "EXPLAIN" WHITESPACE " " - L_PAREN "(" - ANALYZE_KW "ANALYZE" - COMMA "," - WHITESPACE " " - IDENT "BUFFERS" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + ANALYZE_KW "ANALYZE" + COMMA "," + WHITESPACE " " + EXPLAIN_OPTION + NAME + IDENT "BUFFERS" + R_PAREN ")" WHITESPACE " \n" SELECT SELECT_CLAUSE diff --git a/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap index f34432a92..497f223e7 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap @@ -95,9 +95,8 @@ SOURCE_FILE BIT_KW "bit" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "3" + LITERAL + INT_NUMBER "3" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -121,9 +120,8 @@ SOURCE_FILE BIT_KW "bit" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "12" + LITERAL + INT_NUMBER "12" R_PAREN ")" R_PAREN ")" SEMICOLON ";" @@ -145,9 +143,8 @@ SOURCE_FILE BIT_KW "bit" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "4" + LITERAL + INT_NUMBER "4" R_PAREN ")" COLON_COLON COLON ":" @@ -184,9 +181,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "1" + LITERAL + INT_NUMBER "1" R_PAREN ")" L_BRACK "[" R_BRACK "]" @@ -444,9 +440,8 @@ SOURCE_FILE VARYING_KW "varying" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "4" + LITERAL + INT_NUMBER "4" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -1661,14 +1656,12 @@ SOURCE_FILE IDENT "bar" ARG_LIST L_PAREN "(" - ARG - NAME_REF - IDENT "buzz" + NAME_REF + IDENT "buzz" COMMA "," WHITESPACE " " - ARG - NAME_REF - IDENT "bizz" + NAME_REF + IDENT "bizz" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -1704,9 +1697,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "5" + LITERAL + INT_NUMBER "5" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -1727,9 +1719,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "255" + LITERAL + INT_NUMBER "255" R_PAREN ")" L_BRACK "[" R_BRACK "]" @@ -1776,9 +1767,8 @@ SOURCE_FILE IDENT "t" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "255" + LITERAL + INT_NUMBER "255" R_PAREN ")" L_BRACK "[" R_BRACK "]" @@ -1808,9 +1798,8 @@ SOURCE_FILE IDENT "buzz" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "5" + LITERAL + INT_NUMBER "5" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -1878,9 +1867,8 @@ SOURCE_FILE IDENT "buzz" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "255" + LITERAL + INT_NUMBER "255" R_PAREN ")" L_BRACK "[" R_BRACK "]" @@ -2002,9 +1990,8 @@ SOURCE_FILE FLOAT_KW "float" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "1" + LITERAL + INT_NUMBER "1" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -2064,19 +2051,16 @@ SOURCE_FILE DECIMAL_KW "decimal" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "1" + LITERAL + INT_NUMBER "1" COMMA "," WHITESPACE " " - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" COMMA "," WHITESPACE " " - ARG - LITERAL - INT_NUMBER "3" + LITERAL + INT_NUMBER "3" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -2118,19 +2102,16 @@ SOURCE_FILE DEC_KW "dec" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "1" + LITERAL + INT_NUMBER "1" COMMA "," WHITESPACE " " - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" COMMA "," WHITESPACE " " - ARG - LITERAL - INT_NUMBER "3" + LITERAL + INT_NUMBER "3" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -2172,14 +2153,12 @@ SOURCE_FILE NUMERIC_KW "numeric" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "1" + LITERAL + INT_NUMBER "1" COMMA "," WHITESPACE " " - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n" @@ -2222,13 +2201,11 @@ SOURCE_FILE NUMERIC_KW "numeric" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "10" + LITERAL + INT_NUMBER "10" COMMA "," - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" R_PAREN ")" L_BRACK "[" LITERAL @@ -2565,9 +2542,8 @@ SOURCE_FILE CHAR_KW "char" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "1" + LITERAL + INT_NUMBER "1" R_PAREN ")" WHITESPACE " " COLLATE_KW "collate" @@ -2594,9 +2570,8 @@ SOURCE_FILE CHAR_KW "CHAR" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" R_PAREN ")" WHITESPACE " " COLLATE_KW "collate" @@ -2616,9 +2591,8 @@ SOURCE_FILE CHAR_KW "CHAR" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" R_PAREN ")" SEMICOLON ";" WHITESPACE "\n\n" @@ -2878,9 +2852,8 @@ SOURCE_FILE BIT_KW "bit" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "10" + LITERAL + INT_NUMBER "10" R_PAREN ")" SEMICOLON ";" WHITESPACE " " @@ -2902,9 +2875,8 @@ SOURCE_FILE BIT_KW "bit" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "3" + LITERAL + INT_NUMBER "3" R_PAREN ")" SEMICOLON ";" WHITESPACE " " @@ -2930,9 +2902,8 @@ SOURCE_FILE BIT_KW "bit" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "12" + LITERAL + INT_NUMBER "12" R_PAREN ")" R_PAREN ")" SEMICOLON ";" @@ -2956,9 +2927,8 @@ SOURCE_FILE BIT_KW "bit" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "4" + LITERAL + INT_NUMBER "4" R_PAREN ")" COLON_COLON COLON ":" @@ -3079,9 +3049,8 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "1" + LITERAL + INT_NUMBER "1" R_PAREN ")" L_BRACK "[" R_BRACK "]" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_compound_union_select_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_compound_union_select_ok.snap index 2e680487e..0683e14dc 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_compound_union_select_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_compound_union_select_ok.snap @@ -53,9 +53,8 @@ SOURCE_FILE CHAR_KW "char" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "4" + LITERAL + INT_NUMBER "4" R_PAREN ")" WHITESPACE " " ORDER_BY_CLAUSE @@ -191,9 +190,8 @@ SOURCE_FILE CHAR_KW "char" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "4" + LITERAL + INT_NUMBER "4" R_PAREN ")" WHITESPACE " " ORDER_BY_CLAUSE diff --git a/crates/squawk_parser/tests/snapshots/tests__select_err.snap b/crates/squawk_parser/tests/snapshots/tests__select_err.snap index a73efddb6..716c50fd3 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_err.snap @@ -532,13 +532,11 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" WHITESPACE " " - ARG - LITERAL - INT_NUMBER "200" + LITERAL + INT_NUMBER "200" R_PAREN ")" R_PAREN ")" SEMICOLON ";" @@ -561,17 +559,15 @@ SOURCE_FILE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" + LITERAL + INT_NUMBER "100" COMMA "," WHITESPACE " " ERROR COMMA "," WHITESPACE " " - ARG - LITERAL - INT_NUMBER "200" + LITERAL + INT_NUMBER "200" R_PAREN ")" R_PAREN ")" SEMICOLON ";" @@ -597,14 +593,12 @@ SOURCE_FILE IDENT "t" ARG_LIST L_PAREN "(" - ARG - NAME_REF - IDENT "a" + NAME_REF + IDENT "a" COMMA "," WHITESPACE " " - ARG - NAME_REF - IDENT "b" + NAME_REF + IDENT "b" ERROR COMMA "," R_PAREN ")" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap index 23c3be4c4..0b5573fa5 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_ok.snap @@ -6367,12 +6367,16 @@ SOURCE_FILE EXPLAIN EXPLAIN_KW "explain" WHITESPACE " " - L_PAREN "(" - IDENT "costs" - WHITESPACE " " - LITERAL - OFF_KW "off" - R_PAREN ")" + EXPLAIN_OPTION_LIST + L_PAREN "(" + EXPLAIN_OPTION + NAME + IDENT "costs" + WHITESPACE " " + EXPLAIN_OPTION_VALUE + LITERAL + OFF_KW "off" + R_PAREN ")" WHITESPACE "\n" SELECT SELECT_CLAUSE diff --git a/crates/squawk_parser/tests/snapshots/tests__select_xml_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_xml_ok.snap index 48f3cad33..6c5976f54 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_xml_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_xml_ok.snap @@ -145,13 +145,11 @@ SOURCE_FILE NUMERIC_KW "numeric" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "5" + LITERAL + INT_NUMBER "5" COMMA "," - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" R_PAREN ")" WHITESPACE " " XML_COLUMN_OPTION_LIST @@ -179,13 +177,11 @@ SOURCE_FILE NUMERIC_KW "numeric" ARG_LIST L_PAREN "(" - ARG - LITERAL - INT_NUMBER "5" + LITERAL + INT_NUMBER "5" COMMA "," - ARG - LITERAL - INT_NUMBER "2" + LITERAL + INT_NUMBER "2" R_PAREN ")" WHITESPACE " " XML_COLUMN_OPTION_LIST diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index c24c268f9..ec2e2d4ef 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -2365,21 +2365,49 @@ impl AlterTable { support::children(&self.syntax) } #[inline] + pub fn if_exists(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn owned_by_roles(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn relation_name(&self) -> Option { support::child(&self.syntax) } #[inline] + pub fn set_tablespace(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn semicolon_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SEMICOLON) } #[inline] + pub fn all_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALL_KW) + } + #[inline] pub fn alter_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ALTER_KW) } #[inline] + pub fn in_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::IN_KW) + } + #[inline] + pub fn nowait_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NOWAIT_KW) + } + #[inline] pub fn table_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::TABLE_KW) } + #[inline] + pub fn tablespace_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TABLESPACE_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -2997,28 +3025,13 @@ impl AnyFn { } } -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct Arg { - pub(crate) syntax: SyntaxNode, -} -impl Arg { - #[inline] - pub fn expr(&self) -> Option { - support::child(&self.syntax) - } -} - #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ArgList { pub(crate) syntax: SyntaxNode, } impl ArgList { #[inline] - pub fn args(&self) -> AstChildren { - support::children(&self.syntax) - } - #[inline] - pub fn args_(&self) -> AstChildren { + pub fn args(&self) -> AstChildren { support::children(&self.syntax) } #[inline] @@ -3627,6 +3640,10 @@ impl CaseExpr { pub fn case_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::CASE_KW) } + #[inline] + pub fn end_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::END_KW) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -3766,6 +3783,10 @@ pub struct Checkpoint { pub(crate) syntax: SyntaxNode, } impl Checkpoint { + #[inline] + pub fn checkpoint_option_list(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn semicolon_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SEMICOLON) @@ -3776,6 +3797,40 @@ impl Checkpoint { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct CheckpointOption { + pub(crate) syntax: SyntaxNode, +} +impl CheckpointOption { + #[inline] + pub fn expr(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn name(&self) -> Option { + support::child(&self.syntax) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct CheckpointOptionList { + pub(crate) syntax: SyntaxNode, +} +impl CheckpointOptionList { + #[inline] + pub fn checkpoint_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 Close { pub(crate) syntax: SyntaxNode, @@ -4339,6 +4394,10 @@ impl Commit { support::token(&self.syntax, SyntaxKind::COMMIT_KW) } #[inline] + pub fn end_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::END_KW) + } + #[inline] pub fn no_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::NO_KW) } @@ -6256,6 +6315,10 @@ impl CreateTable { support::child(&self.syntax) } #[inline] + pub fn partition_type(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn path(&self) -> Option { support::child(&self.syntax) } @@ -6323,6 +6386,10 @@ impl CreateTableAs { support::child(&self.syntax) } #[inline] + pub fn table_arg_list(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn tablespace(&self) -> Option { support::child(&self.syntax) } @@ -7149,18 +7216,14 @@ pub struct DefaultConstraint { } impl DefaultConstraint { #[inline] - pub fn expr(&self) -> Option { + pub fn constraint_name(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn name_ref(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn constraint_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::CONSTRAINT_KW) - } - #[inline] pub fn default_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::DEFAULT_KW) } @@ -10115,6 +10178,10 @@ pub struct Explain { pub(crate) syntax: SyntaxNode, } impl Explain { + #[inline] + pub fn explain_option_list(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn explain_stmt(&self) -> Option { support::child(&self.syntax) @@ -10141,6 +10208,75 @@ impl Explain { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ExplainOption { + pub(crate) syntax: SyntaxNode, +} +impl ExplainOption { + #[inline] + pub fn explain_option_value(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn name(&self) -> Option { + support::child(&self.syntax) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ExplainOptionList { + pub(crate) syntax: SyntaxNode, +} +impl ExplainOptionList { + #[inline] + pub fn explain_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 ExplainOptionValue { + pub(crate) syntax: SyntaxNode, +} +impl ExplainOptionValue { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn binary_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::BINARY_KW) + } + #[inline] + pub fn ident_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::IDENT) + } + #[inline] + pub fn json_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::JSON_KW) + } + #[inline] + pub fn none_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NONE_KW) + } + #[inline] + pub fn text_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TEXT_KW) + } + #[inline] + pub fn xml_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::XML_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ExprAsName { pub(crate) syntax: SyntaxNode, @@ -10919,11 +11055,11 @@ pub struct GeneratedConstraint { } impl GeneratedConstraint { #[inline] - pub fn expr(&self) -> Option { + pub fn constraint_name(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn name_ref(&self) -> Option { + pub fn expr(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -10951,10 +11087,6 @@ impl GeneratedConstraint { support::token(&self.syntax, SyntaxKind::BY_KW) } #[inline] - pub fn constraint_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::CONSTRAINT_KW) - } - #[inline] pub fn default_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::DEFAULT_KW) } @@ -13977,10 +14109,6 @@ pub struct NoInherit { pub(crate) syntax: SyntaxNode, } impl NoInherit { - #[inline] - pub fn path(&self) -> Option { - support::child(&self.syntax) - } #[inline] pub fn inherit_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::INHERIT_KW) @@ -14166,7 +14294,7 @@ pub struct NotNullConstraint { } impl NotNullConstraint { #[inline] - pub fn name_ref(&self) -> Option { + pub fn constraint_name(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -14174,10 +14302,6 @@ impl NotNullConstraint { support::child(&self.syntax) } #[inline] - pub fn constraint_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::CONSTRAINT_KW) - } - #[inline] pub fn not_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::NOT_KW) } @@ -14280,14 +14404,10 @@ pub struct NullConstraint { } impl NullConstraint { #[inline] - pub fn name_ref(&self) -> Option { + pub fn constraint_name(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn constraint_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::CONSTRAINT_KW) - } - #[inline] pub fn null_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::NULL_KW) } @@ -15636,12 +15756,16 @@ pub struct PercentType { } impl PercentType { #[inline] - pub fn percent_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::PERCENT) + pub fn path(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn type_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::TYPE_KW) + pub fn percent_type_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn setof_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SETOF_KW) } } @@ -15651,12 +15775,12 @@ pub struct PercentTypeClause { } impl PercentTypeClause { #[inline] - pub fn path(&self) -> Option { - support::child(&self.syntax) + pub fn percent_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PERCENT) } #[inline] - pub fn percent_type_clause(&self) -> Option { - support::child(&self.syntax) + pub fn type_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TYPE_KW) } } @@ -21238,6 +21362,12 @@ pub enum AlterTypeAction { DropAttribute(DropAttribute), } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum Arg { + NamedArg(NamedArg), + Expr(Expr), +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum BeginFuncOption { ReturnFuncOption(ReturnFuncOption), @@ -21249,7 +21379,9 @@ pub enum ColumnConstraint { CheckConstraint(CheckConstraint), DefaultConstraint(DefaultConstraint), ExcludeConstraint(ExcludeConstraint), + GeneratedConstraint(GeneratedConstraint), NotNullConstraint(NotNullConstraint), + NullConstraint(NullConstraint), PrimaryKeyConstraint(PrimaryKeyConstraint), ReferencesConstraint(ReferencesConstraint), UniqueConstraint(UniqueConstraint), @@ -23045,24 +23177,6 @@ impl AstNode for AnyFn { &self.syntax } } -impl AstNode for Arg { - #[inline] - fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::ARG - } - #[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 ArgList { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -23549,6 +23663,42 @@ impl AstNode for Checkpoint { &self.syntax } } +impl AstNode for CheckpointOption { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::CHECKPOINT_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 CheckpointOptionList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::CHECKPOINT_OPTION_LIST + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for Close { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26771,6 +26921,60 @@ impl AstNode for Explain { &self.syntax } } +impl AstNode for ExplainOption { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::EXPLAIN_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 ExplainOptionList { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::EXPLAIN_OPTION_LIST + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} +impl AstNode for ExplainOptionValue { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::EXPLAIN_OPTION_VALUE + } + #[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 ExprAsName { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -36066,6 +36270,38 @@ impl From for AlterTypeAction { AlterTypeAction::DropAttribute(node) } } +impl AstNode for Arg { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + matches!(kind, SyntaxKind::NAMED_ARG) + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + let res = match syntax.kind() { + SyntaxKind::NAMED_ARG => Arg::NamedArg(NamedArg { syntax }), + _ => { + if let Some(result) = Expr::cast(syntax) { + return Some(Arg::Expr(result)); + } + return None; + } + }; + Some(res) + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + match self { + Arg::NamedArg(it) => &it.syntax, + Arg::Expr(it) => it.syntax(), + } + } +} +impl From for Arg { + #[inline] + fn from(node: NamedArg) -> Arg { + Arg::NamedArg(node) + } +} impl AstNode for BeginFuncOption { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -36108,7 +36344,9 @@ impl AstNode for ColumnConstraint { SyntaxKind::CHECK_CONSTRAINT | SyntaxKind::DEFAULT_CONSTRAINT | SyntaxKind::EXCLUDE_CONSTRAINT + | SyntaxKind::GENERATED_CONSTRAINT | SyntaxKind::NOT_NULL_CONSTRAINT + | SyntaxKind::NULL_CONSTRAINT | SyntaxKind::PRIMARY_KEY_CONSTRAINT | SyntaxKind::REFERENCES_CONSTRAINT | SyntaxKind::UNIQUE_CONSTRAINT @@ -36126,9 +36364,15 @@ impl AstNode for ColumnConstraint { SyntaxKind::EXCLUDE_CONSTRAINT => { ColumnConstraint::ExcludeConstraint(ExcludeConstraint { syntax }) } + SyntaxKind::GENERATED_CONSTRAINT => { + ColumnConstraint::GeneratedConstraint(GeneratedConstraint { syntax }) + } SyntaxKind::NOT_NULL_CONSTRAINT => { ColumnConstraint::NotNullConstraint(NotNullConstraint { syntax }) } + SyntaxKind::NULL_CONSTRAINT => { + ColumnConstraint::NullConstraint(NullConstraint { syntax }) + } SyntaxKind::PRIMARY_KEY_CONSTRAINT => { ColumnConstraint::PrimaryKeyConstraint(PrimaryKeyConstraint { syntax }) } @@ -36150,7 +36394,9 @@ impl AstNode for ColumnConstraint { ColumnConstraint::CheckConstraint(it) => &it.syntax, ColumnConstraint::DefaultConstraint(it) => &it.syntax, ColumnConstraint::ExcludeConstraint(it) => &it.syntax, + ColumnConstraint::GeneratedConstraint(it) => &it.syntax, ColumnConstraint::NotNullConstraint(it) => &it.syntax, + ColumnConstraint::NullConstraint(it) => &it.syntax, ColumnConstraint::PrimaryKeyConstraint(it) => &it.syntax, ColumnConstraint::ReferencesConstraint(it) => &it.syntax, ColumnConstraint::UniqueConstraint(it) => &it.syntax, @@ -36175,12 +36421,24 @@ impl From for ColumnConstraint { ColumnConstraint::ExcludeConstraint(node) } } +impl From for ColumnConstraint { + #[inline] + fn from(node: GeneratedConstraint) -> ColumnConstraint { + ColumnConstraint::GeneratedConstraint(node) + } +} impl From for ColumnConstraint { #[inline] fn from(node: NotNullConstraint) -> ColumnConstraint { ColumnConstraint::NotNullConstraint(node) } } +impl From for ColumnConstraint { + #[inline] + fn from(node: NullConstraint) -> ColumnConstraint { + ColumnConstraint::NullConstraint(node) + } +} impl From for ColumnConstraint { #[inline] fn from(node: PrimaryKeyConstraint) -> ColumnConstraint { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 2e5db2672..39f3bb6c0 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -63,9 +63,7 @@ ParamList = ArgList = '(' '*' ')' | '(' ('distinct' | 'all') 'variadic'? Expr ')' -| '(' args:(Expr (',' Expr)*)? ')' -// TODO: Arg should be a union of *, Expr, or Expr list. Right now it doesn't do much -| '(' args_:(Arg (',' Arg)*)? ')' +| '(' args:(Arg (',' Arg)*)? ')' CallExpr = Expr ArgList WithinClause? FilterClause? OverClause? @@ -178,7 +176,7 @@ JsonArrayAggFn = JsonQueryFn = 'json_query' '(' Expr - JsonFormatClause + JsonFormatClause? ',' Expr JsonPassingClause? @@ -217,9 +215,9 @@ JsonTable = ',' Expr ('as' Name)? - JsonPassingClause + JsonPassingClause? JsonTableColumnList - JsonOnErrorClause + JsonOnErrorClause? ')' JsonSerializeFn = @@ -364,6 +362,9 @@ Literal = | '@unicode_esc_string' | '@esc_string' | '@positional_param' + | 'default' + | 'false' + | 'true' ) NamedArg = @@ -532,7 +533,7 @@ WhenClauseList = WhenClause WhenClause* CaseExpr = - 'case' Expr? WhenClauseList ElseClause? + 'case' Expr? WhenClauseList ElseClause? 'end' FieldExpr = // We manually implement these as we have NameRef as a variant of Expr. @@ -563,7 +564,7 @@ ArrayType = Type NameRef 'array'? '[' Expr? ']' PercentType = - '%' 'type' + 'setof'? Path PercentTypeClause PathType = 'setof'? Path ArgList? @@ -606,7 +607,7 @@ IntervalType = | 'hour' 'to' 'minute' | 'hour' 'to' 'second' | 'minute' 'to' 'second' - ) + )? ('(' Literal ')')? @@ -624,6 +625,7 @@ Type = Arg = Expr +| NamedArg // For when we're parsing expressions and then later we realize they're types. // e.g., `select pg_catalog.varchar(10) 'foo'` @@ -682,12 +684,14 @@ Column = ) ColumnConstraint = CheckConstraint +| DefaultConstraint +| ExcludeConstraint +| GeneratedConstraint | NotNullConstraint -| UniqueConstraint +| NullConstraint | PrimaryKeyConstraint -| ExcludeConstraint | ReferencesConstraint -| DefaultConstraint +| UniqueConstraint NullsDistinct = 'nulls' 'distinct' @@ -753,7 +757,7 @@ MatchType = ForeignKeyConstraint = ConstraintName? - 'foreign' 'key' from_columns:ColumnList 'references' Path to_columns:ColumnList + 'foreign' 'key' from_columns:ColumnList 'references' Path to_columns:ColumnList? MatchType? OnDeleteAction? OnUpdateAction? @@ -778,20 +782,20 @@ Enforced = 'enforced' NotNullConstraint = - ('constraint' NameRef) + ConstraintName? 'not' 'null' - NoInherit + NoInherit? NullConstraint = - ('constraint' NameRef) + ConstraintName? 'null' DefaultConstraint = - ('constraint' NameRef) + ConstraintName? 'default' Expr GeneratedConstraint = - ('constraint' NameRef) + ConstraintName? 'generated' ('always' 'as' '(' Expr ')' 'stored' | ('always' | 'by' 'default') 'as' 'identity' SequenceOptionList? ) @@ -888,7 +892,7 @@ WhereClause = 'where' Expr GroupByClause = - 'group' 'by' ('all' | 'distinct') GroupByList + 'group' 'by' ('all' | 'distinct')? GroupByList GroupByList = GroupBy (',' GroupBy)* @@ -936,7 +940,7 @@ OffsetClause = ('row' | 'rows')? DistinctClause = - 'distinct' 'on' '(' (Expr (',' Expr)*) ')' + 'distinct' ('on' '(' (Expr (',' Expr)*) ')')? Target = '*' @@ -1106,11 +1110,14 @@ TransactionModeList = TransactionMode (',' TransactionMode)* Begin = - ('begin' ('work' | 'transaction') | 'start' 'transaction') + ('begin' ('work' | 'transaction')? | 'start' 'transaction') TransactionModeList? ';'? Commit = - 'commit' (('work' | 'transaction')? ('and' 'no'? 'chain') | 'prepared' Literal) ';'? + ( + 'commit' ('prepared' Literal | ('work' | 'transaction')? ('and' 'no'? 'chain')?) + | 'end' ('work' | 'transaction')? ('and' 'no'? 'chain')? + ) ';'? Rollback = 'rollback' ('work' | 'transaction')? ('and' 'no'? 'chain')? ';'? @@ -1186,7 +1193,8 @@ CreateTable = 'table' IfNotExists? Path PartitionOf? OfType? - TableArgList + TableArgList? + PartitionType? Inherits? PartitionBy? UsingMethod? @@ -1320,7 +1328,11 @@ AlterDomain = 'alter' 'domain' Path action:AlterDomainAction ';'? AlterTable = - 'alter' 'table' RelationName actions:AlterTableAction* ';'? + 'alter' 'table' + ( + 'all' 'in' 'tablespace' RelationName OwnedByRoles? SetTablespace 'nowait'? + | IfExists? RelationName actions:AlterTableAction* + ) ';'? Revoke = 'revoke' ('grant' 'option' 'for')? @@ -1429,8 +1441,8 @@ ForPortionOf = ReturningClause = 'returning' - ReturningOptionList - TargetList? + ReturningOptionList? + TargetList ReturningOptionList = ('with' '(' (ReturningOption (',' ReturningOption)*) ')' ) @@ -1525,6 +1537,7 @@ CreateTableAs = 'table' IfNotExists? Path + TableArgList? UsingMethod? (WithParams | WithoutOids)? OnCommit? @@ -1662,7 +1675,7 @@ JsonPassingClause = 'passing' (JsonPassingArg (',' JsonPassingArg)*) PercentTypeClause = - Path PercentTypeClause + '%' 'type' WithTimezone = 'with' 'time' 'zone' @@ -2887,7 +2900,8 @@ CreateTextSearchTemplate = CreateTransform = 'create' OrReplace? 'transform' 'for' Type 'language' language:NameRef - '(' from_func:TransformFromFunc ',' to_func:TransformToFunc ')' ';'? + '(' (from_func:TransformFromFunc | to_func:TransformToFunc) + (',' (from_func:TransformFromFunc | to_func:TransformToFunc))? ')' ';'? TransformFromFunc = 'from' 'sql' 'with' 'function' FunctionSig @@ -3067,9 +3081,24 @@ DropView = Explain = 'explain' - ('analyze' | 'analyse' | 'verbose')? + (ExplainOptionList | ('analyze' | 'analyse') 'verbose'? | 'verbose')? ExplainStmt ';'? +ExplainOptionList = + '(' (ExplainOption (',' ExplainOption)*) ')' + +ExplainOption = + Name ExplainOptionValue? + +ExplainOptionValue = + Literal +| 'none' +| 'text' +| 'xml' +| 'json' +| 'binary' +| '#ident' + ExplainStmt = Select | CompoundSelect @@ -3248,7 +3277,13 @@ Unlisten = 'unlisten' ('*' | NameRef) ';'? Checkpoint = - 'checkpoint' ';'? + 'checkpoint' CheckpointOptionList? ';'? + +CheckpointOptionList = + '(' (CheckpointOption (',' CheckpointOption)*) ')' + +CheckpointOption = + Name Expr? Deallocate = 'deallocate' ('prepare' NameRef | 'all') ';'? @@ -3273,7 +3308,7 @@ Discard = 'discard' ('all' | 'temp' | 'temporary' | 'plans' | 'sequences') ';'? Do = - 'do' ('language' ('#ident' | Literal))? Literal ';'? + 'do' ('language' ('#ident' | Literal))? Literal ('language' ('#ident' | Literal))? ';'? Move = 'move' @@ -3472,7 +3507,7 @@ CreateType = ('as' 'enum' VariantList | 'as' 'range' AttributeList | 'as' ColumnList -| AttributeList) ';'? +| AttributeList)? ';'? VariantList = '(' @@ -3595,7 +3630,7 @@ Inherit = 'inherit' Path NoInherit = - 'no' 'inherit' Path + 'no' 'inherit' EnableTrigger = 'enable' 'trigger' (NameRef | 'all' | 'user')?