From fac588d4234ca2985866e4b31f9504d3a0648f2f Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Wed, 19 Aug 2026 19:18:37 -0400 Subject: [PATCH] parser: refactor char type into character and varchar nodes --- crates/squawk_ide/src/binder.rs | 27 +- crates/squawk_ide/src/classify.rs | 4 +- crates/squawk_ide/src/find_references.rs | 3 +- crates/squawk_ide/src/infer.rs | 2 +- crates/squawk_ide/src/name.rs | 11 +- crates/squawk_ide/src/semantic_tokens.rs | 32 +- .../squawk_linter/src/rules/ban_char_field.rs | 30 +- .../src/rules/prefer_bigint_over_int.rs | 3 +- .../src/rules/prefer_bigint_over_smallint.rs | 3 +- .../src/rules/prefer_identity.rs | 3 +- .../src/rules/prefer_text_field.rs | 11 +- .../src/rules/prefer_timestamptz.rs | 2 +- ...__ban_char_field__test__all_the_types.snap | 14 +- crates/squawk_linter/src/visitors.rs | 2 +- .../src/generated/syntax_kind.rs | 10 +- crates/squawk_parser/src/grammar.rs | 29 +- .../snapshots/tests__alter_extension_ok.snap | 18 +- .../tests__alter_operator_family_ok.snap | 2 +- .../snapshots/tests__alter_sequence_ok.snap | 2 +- .../snapshots/tests__alter_table_ok.snap | 2 +- .../tests/snapshots/tests__alter_type_ok.snap | 4 +- .../tests/snapshots/tests__comment_ok.snap | 4 +- .../snapshots/tests__create_domain_ok.snap | 2 +- .../snapshots/tests__create_function_ok.snap | 6 +- .../tests__create_operator_class_ok.snap | 6 +- .../snapshots/tests__create_operator_ok.snap | 2 +- .../snapshots/tests__create_sequence_ok.snap | 2 +- .../snapshots/tests__create_table_ok.snap | 6 +- .../snapshots/tests__drop_transform_ok.snap | 2 +- .../tests/snapshots/tests__misc_ok.snap | 2 +- .../snapshots/tests__select_casts_ok.snap | 60 +-- ...ests__select_compound_union_select_ok.snap | 4 +- .../tests/snapshots/tests__select_err.snap | 6 +- .../tests/snapshots/tests__sql_pgq_ok.snap | 6 +- .../snapshots/tests__transaction_ok.snap | 56 +-- .../tests/snapshots/tests__update_ok.snap | 4 +- .../squawk_syntax/src/ast/generated/nodes.rs | 424 ++++++++++++++---- crates/squawk_syntax/src/ast/node_ext.rs | 9 +- crates/squawk_syntax/src/column_name.rs | 18 +- crates/squawk_syntax/src/postgresql.ungram | 49 +- crates/xtask/src/codegen.rs | 2 +- 41 files changed, 604 insertions(+), 280 deletions(-) diff --git a/crates/squawk_ide/src/binder.rs b/crates/squawk_ide/src/binder.rs index 80b6abb98..5563eb39b 100644 --- a/crates/squawk_ide/src/binder.rs +++ b/crates/squawk_ide/src/binder.rs @@ -1740,7 +1740,7 @@ fn bind_release_savepoint(b: &mut Binder, release: ast::ReleaseSavepoint) { } fn bind_commit(b: &mut Binder, commit: ast::Commit) { - if commit.prepared_token().is_some() { + if let ast::Commit::CommitPrepared(commit) = commit { bind_prepared_transaction_ref(b, commit.literal()); } @@ -1778,17 +1778,20 @@ fn bind_prepared_transaction_ref(b: &mut Binder, literal: Option) } fn bind_rollback(b: &mut Binder, rollback: ast::Rollback) { - if rollback.prepared_token().is_some() { - bind_prepared_transaction_ref(b, rollback.literal()); - } - - let Some(savepoint_ref) = rollback.savepoint_ref() else { - b.savepoint_stack.clear(); - return; - }; - - if let Some(idx) = bind_savepoint_ref(b, &savepoint_ref) { - b.savepoint_stack.truncate(idx + 1); + match rollback { + ast::Rollback::RollbackPrepared(rollback) => { + bind_prepared_transaction_ref(b, rollback.literal()); + b.savepoint_stack.clear(); + } + ast::Rollback::RollbackToSavepoint(rollback) => { + let Some(savepoint_ref) = rollback.savepoint_ref() else { + return; + }; + if let Some(idx) = bind_savepoint_ref(b, &savepoint_ref) { + b.savepoint_stack.truncate(idx + 1); + } + } + ast::Rollback::RollbackTransaction(_) => b.savepoint_stack.clear(), } } diff --git a/crates/squawk_ide/src/classify.rs b/crates/squawk_ide/src/classify.rs index a7058db79..03d39c40e 100644 --- a/crates/squawk_ide/src/classify.rs +++ b/crates/squawk_ide/src/classify.rs @@ -425,9 +425,9 @@ fn is_prepared_transaction_id(node: &SyntaxNode) -> bool { return false; }; if let Some(commit) = ast::Commit::cast(parent.clone()) { - commit.prepared_token().is_some() + matches!(commit, ast::Commit::CommitPrepared(_)) } else if let Some(rollback) = ast::Rollback::cast(parent) { - rollback.prepared_token().is_some() + matches!(rollback, ast::Rollback::RollbackPrepared(_)) } else { false } diff --git a/crates/squawk_ide/src/find_references.rs b/crates/squawk_ide/src/find_references.rs index b2a01b642..99c680d8e 100644 --- a/crates/squawk_ide/src/find_references.rs +++ b/crates/squawk_ide/src/find_references.rs @@ -23,7 +23,8 @@ fn is_reference_node(node: &SyntaxNode) -> bool { if let Some(ty) = ast::Type::cast(node.clone()) { return match ty { ast::Type::BitType(_) - | ast::Type::CharType(_) + | ast::Type::VarcharType(_) + | ast::Type::CharacterType(_) | ast::Type::DoubleType(_) | ast::Type::IntervalType(_) | ast::Type::TimeType(_) => true, diff --git a/crates/squawk_ide/src/infer.rs b/crates/squawk_ide/src/infer.rs index f549f947b..4aafcff12 100644 --- a/crates/squawk_ide/src/infer.rs +++ b/crates/squawk_ide/src/infer.rs @@ -59,7 +59,7 @@ pub(crate) fn infer_type_from_expr(expr: &ast::Expr) -> Option { pub(crate) fn infer_type_from_ty(ty: &ast::Type) -> Option { match ty { - ast::Type::CharType(_) => Some(Type::Text), + ast::Type::VarcharType(_) | ast::Type::CharacterType(_) => Some(Type::Text), ast::Type::BitType(_) => Some(Type::Bit), ast::Type::PathType(path_type) => { let name = path_type.path_ref()?.segment()?; diff --git a/crates/squawk_ide/src/name.rs b/crates/squawk_ide/src/name.rs index e0e4ac000..0d079ce6e 100644 --- a/crates/squawk_ide/src/name.rs +++ b/crates/squawk_ide/src/name.rs @@ -230,15 +230,8 @@ pub(crate) fn schema_and_type_name(ty: &ast::Type) -> Option<(Option, Na None } } - ast::Type::CharType(char_type) => { - let name = if char_type.varchar_token().is_some() || char_type.varying_token().is_some() - { - "varchar" - } else { - "bpchar" - }; - Some((None, Name::from_string(name))) - } + ast::Type::VarcharType(_) => Some((None, Name::from_string("varchar"))), + ast::Type::CharacterType(_) => Some((None, Name::from_string("bpchar"))), ast::Type::DoubleType(_) => Some((None, Name::from_string("float8"))), ast::Type::TimeType(time_type) => { let mut name = if time_type.timestamp_token().is_some() { diff --git a/crates/squawk_ide/src/semantic_tokens.rs b/crates/squawk_ide/src/semantic_tokens.rs index e7a4ed996..b2e4acc37 100644 --- a/crates/squawk_ide/src/semantic_tokens.rs +++ b/crates/squawk_ide/src/semantic_tokens.rs @@ -55,23 +55,37 @@ fn highlight_type(out: &mut SemanticTokenBuilder, ty: ast::Type) { out.push_type(token.into()); } } - ast::Type::CharType(char_type) => { - if let Some(token) = char_type.setof_token() { + ast::Type::VarcharType(varchar_type) => { + if let Some(token) = varchar_type.setof_token() { out.push_type(token.into()); } - if let Some(token) = char_type.national_token() { + if let Some(token) = varchar_type.national_token() { out.push_type(token.into()); } - - if let Some(token) = char_type + if let Some(token) = varchar_type .varchar_token() - .or_else(|| char_type.nchar_token()) - .or_else(|| char_type.character_token()) - .or_else(|| char_type.char_token()) + .or_else(|| varchar_type.nchar_token()) + .or_else(|| varchar_type.character_token()) + .or_else(|| varchar_type.char_token()) { out.push_type(token.into()); } - if let Some(token) = char_type.varying_token() { + if let Some(token) = varchar_type.varying_token() { + out.push_type(token.into()); + } + } + ast::Type::CharacterType(character_type) => { + if let Some(token) = character_type.setof_token() { + out.push_type(token.into()); + } + if let Some(token) = character_type.national_token() { + out.push_type(token.into()); + } + if let Some(token) = character_type + .nchar_token() + .or_else(|| character_type.character_token()) + .or_else(|| character_type.char_token()) + { out.push_type(token.into()); } } diff --git a/crates/squawk_linter/src/rules/ban_char_field.rs b/crates/squawk_linter/src/rules/ban_char_field.rs index 4fb92a3b2..542e48f91 100644 --- a/crates/squawk_linter/src/rules/ban_char_field.rs +++ b/crates/squawk_linter/src/rules/ban_char_field.rs @@ -44,22 +44,23 @@ fn check_path_type(ctx: &mut Linter, path_type: ast::PathType) { } } -fn check_char_type(ctx: &mut Linter, char_type: ast::CharType) { - if is_char_type(&char_type.text()) { - let fix = create_fix(char_type.syntax().text_range(), char_type.arg_list()); - ctx.report(Violation::for_node( - Rule::BanCharField, - "Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`.".into(), - char_type.syntax(), - ).fix(fix)); - } +fn check_character_type(ctx: &mut Linter, character_type: ast::CharacterType) { + let fix = create_fix( + character_type.syntax().text_range(), + character_type.arg_list(), + ); + ctx.report(Violation::for_node( + Rule::BanCharField, + "Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`.".into(), + character_type.syntax(), + ).fix(fix)); } fn check_ty(ctx: &mut Linter, ty: Option) { match ty { Some(ast::Type::ArrayType(array_type)) => match array_type.ty() { - Some(ast::Type::CharType(char_type)) => { - check_char_type(ctx, char_type); + Some(ast::Type::CharacterType(character_type)) => { + check_character_type(ctx, character_type); } Some(ast::Type::PathType(path_type)) => { check_path_type(ctx, path_type); @@ -69,8 +70,8 @@ fn check_ty(ctx: &mut Linter, ty: Option) { Some(ast::Type::PathType(path_type)) => { check_path_type(ctx, path_type); } - Some(ast::Type::CharType(char_type)) => { - check_char_type(ctx, char_type); + Some(ast::Type::CharacterType(character_type)) => { + check_character_type(ctx, character_type); } _ => (), } @@ -180,7 +181,8 @@ create table t ( l bit varying, m int array[], o pg_catalog.char, - p char[] + p char[], + q nchar ); "#; assert_snapshot!(lint_errors(sql, Rule::BanCharField)); diff --git a/crates/squawk_linter/src/rules/prefer_bigint_over_int.rs b/crates/squawk_linter/src/rules/prefer_bigint_over_int.rs index 1a60529c8..044763069 100644 --- a/crates/squawk_linter/src/rules/prefer_bigint_over_int.rs +++ b/crates/squawk_linter/src/rules/prefer_bigint_over_int.rs @@ -30,7 +30,8 @@ fn create_bigint_fix(ty: &ast::Type) -> Option { ast::Type::ArrayType(array_type) => return create_bigint_fix(&array_type.ty()?), ast::Type::PathType(path_type) => path_type.path_ref()?.segment()?, ast::Type::BitType(_) - | ast::Type::CharType(_) + | ast::Type::VarcharType(_) + | ast::Type::CharacterType(_) | ast::Type::DoubleType(_) | ast::Type::ExprType(_) | ast::Type::PercentType(_) diff --git a/crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs b/crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs index dbce1b694..331ce4a30 100644 --- a/crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs +++ b/crates/squawk_linter/src/rules/prefer_bigint_over_smallint.rs @@ -31,7 +31,8 @@ fn create_bigint_fix(ty: &ast::Type) -> Option { ast::Type::ArrayType(array_type) => return create_bigint_fix(&array_type.ty()?), ast::Type::PathType(path_type) => path_type.path_ref()?.segment()?, ast::Type::BitType(_) - | ast::Type::CharType(_) + | ast::Type::VarcharType(_) + | ast::Type::CharacterType(_) | ast::Type::DoubleType(_) | ast::Type::ExprType(_) | ast::Type::PercentType(_) diff --git a/crates/squawk_linter/src/rules/prefer_identity.rs b/crates/squawk_linter/src/rules/prefer_identity.rs index 53a5cdbf8..e305c0384 100644 --- a/crates/squawk_linter/src/rules/prefer_identity.rs +++ b/crates/squawk_linter/src/rules/prefer_identity.rs @@ -39,7 +39,8 @@ fn create_identity_fix(ty: &ast::Type) -> Option { ast::Type::ArrayType(array_type) => return create_identity_fix(&array_type.ty()?), ast::Type::PathType(path_type) => path_type.path_ref()?.segment()?, ast::Type::BitType(_) - | ast::Type::CharType(_) + | ast::Type::VarcharType(_) + | ast::Type::CharacterType(_) | ast::Type::DoubleType(_) | ast::Type::ExprType(_) | ast::Type::PercentType(_) diff --git a/crates/squawk_linter/src/rules/prefer_text_field.rs b/crates/squawk_linter/src/rules/prefer_text_field.rs index 933f8f516..a5a11f512 100644 --- a/crates/squawk_linter/src/rules/prefer_text_field.rs +++ b/crates/squawk_linter/src/rules/prefer_text_field.rs @@ -28,9 +28,8 @@ fn is_not_allowed_varchar(ty: &ast::Type) -> bool { // if we don't have any args, then it's the same as `text` ty_name == "varchar" && path_type.arg_list().is_some() } - ast::Type::CharType(char_type) => { - char_type.text().eq_ignore_ascii_case("varchar") && char_type.arg_list().is_some() - } + ast::Type::VarcharType(varchar_type) => varchar_type.arg_list().is_some(), + ast::Type::CharacterType(_) => false, ast::Type::BitType(_) => false, ast::Type::DoubleType(_) => false, ast::Type::TimeType(_) => false, @@ -46,10 +45,10 @@ fn create_varchar_to_text_fix(ty: &ast::Type) -> Option { // so: `"varchar"(100)` becomes `text` path_type.syntax().text_range() } - ast::Type::CharType(char_type) => { - // we'll replace the entire char type, including args + ast::Type::VarcharType(varchar_type) => { + // we'll replace the entire varchar type, including args // so: `varchar(100)` becomes `text` - char_type.syntax().text_range() + varchar_type.syntax().text_range() } ast::Type::ArrayType(array_type) => { let ty = array_type.ty()?; diff --git a/crates/squawk_linter/src/rules/prefer_timestamptz.rs b/crates/squawk_linter/src/rules/prefer_timestamptz.rs index 9d799a5be..2f02fc04a 100644 --- a/crates/squawk_linter/src/rules/prefer_timestamptz.rs +++ b/crates/squawk_linter/src/rules/prefer_timestamptz.rs @@ -27,7 +27,7 @@ pub fn is_not_allowed_timestamp(ty: &ast::Type) -> bool { // if we don't have any args, then it's the same as `text` ty_name == "varchar" && path_type.arg_list().is_some() } - ast::Type::CharType(_) => false, + ast::Type::VarcharType(_) | ast::Type::CharacterType(_) => false, ast::Type::BitType(_) => false, ast::Type::DoubleType(_) => false, ast::Type::TimeType(time_type) => { diff --git a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__all_the_types.snap b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__all_the_types.snap index d8a7b7ccb..43418ef63 100644 --- a/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__all_the_types.snap +++ b/crates/squawk_linter/src/rules/snapshots/squawk_linter__rules__ban_char_field__test__all_the_types.snap @@ -43,9 +43,17 @@ warning[ban-char-field]: Using `character` is likely a mistake and should almost ╰╴ warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. ╭▸ -16 │ p char[] +16 │ p char[], │ ━━━━ ╭╴ -16 - p char[] -16 + p text[] +16 - p char[], +16 + p text[], + ╰╴ +warning[ban-char-field]: Using `character` is likely a mistake and should almost always be replaced by `text` or `varchar`. + ╭▸ +17 │ q nchar + │ ━━━━━ + ╭╴ +17 - q nchar +17 + q text ╰╴ diff --git a/crates/squawk_linter/src/visitors.rs b/crates/squawk_linter/src/visitors.rs index 2d09a3ce9..21ebec141 100644 --- a/crates/squawk_linter/src/visitors.rs +++ b/crates/squawk_linter/src/visitors.rs @@ -27,7 +27,7 @@ pub(crate) fn is_not_valid_int_type( }; invalid_type_names.contains(ty_name.as_str()) } - ast::Type::CharType(_) => false, + ast::Type::VarcharType(_) | ast::Type::CharacterType(_) => false, ast::Type::BitType(_) => false, ast::Type::DoubleType(_) => false, ast::Type::TimeType(_) => false, diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index 4a3952e99..7dc148add 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -702,7 +702,7 @@ pub enum SyntaxKind { CAST_SIG, CHANNEL, CHANNEL_REF, - CHAR_TYPE, + CHARACTER_TYPE, CHECKPOINT, CHECKPOINT_OPTION, CHECKPOINT_OPTION_LIST, @@ -731,7 +731,8 @@ pub enum SyntaxKind { COLUMN_TARGET, COLUMN_TARGET_LIST, COMMENT_ON, - COMMIT, + COMMIT_PREPARED, + COMMIT_TRANSACTION, COMPOSITE_FIELD, COMPOSITE_FIELD_DEF, COMPOSITE_FIELD_LIST, @@ -1602,7 +1603,9 @@ pub enum SyntaxKind { ROLE_REF, ROLE_REF_LIST, ROLE_RENAME_TO, - ROLLBACK, + ROLLBACK_PREPARED, + ROLLBACK_TO_SAVEPOINT, + ROLLBACK_TRANSACTION, ROUTINE_NAME, ROUTINE_NAME_REF, ROUTINE_RENAME_TO, @@ -1836,6 +1839,7 @@ pub enum SyntaxKind { VALIDATE_CONSTRAINT, VALIDATOR_CLAUSE, VALUES, + VARCHAR_TYPE, VARIANT, VARIANT_LIST, VERTEX_PATTERN, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 4d27ee14f..86096c01f 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -2208,11 +2208,14 @@ fn type_mods( fn char_type(p: &mut Parser<'_>) -> SyntaxKind { assert!(p.at(CHARACTER_KW) || p.at(CHAR_KW) || p.at(NCHAR_KW) || p.at(VARCHAR_KW)); if p.eat(VARCHAR_KW) { - return CHAR_TYPE; + return VARCHAR_TYPE; } p.bump_any(); - p.eat(VARYING_KW); - CHAR_TYPE + if p.eat(VARYING_KW) { + VARCHAR_TYPE + } else { + CHARACTER_TYPE + } } const TYPE_NAME_FIRST: TokenSet = TokenSet::new(&[ @@ -7258,15 +7261,17 @@ fn commit(p: &mut Parser<'_>) -> CompletedMarker { let is_commit = p.at(COMMIT_KW); p.bump_any(); // PREPARED transaction_id - if is_commit && p.eat(PREPARED_KW) { + let kind = if is_commit && p.eat(PREPARED_KW) { string_literal(p); + COMMIT_PREPARED } else { // [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ] let _ = p.eat(WORK_KW) || p.eat(TRANSACTION_KW); opt_chain_clause(p); - } + COMMIT_TRANSACTION + }; p.eat(SEMICOLON); - m.complete(p, COMMIT) + m.complete(p, kind) } fn opt_chain_clause(p: &mut Parser<'_>) { @@ -7465,20 +7470,22 @@ fn rollback(p: &mut Parser<'_>) -> CompletedMarker { let m = p.start(); let is_rollback = p.at(ROLLBACK_KW); p.bump_any(); - if p.eat(PREPARED_KW) { + if is_rollback && p.eat(PREPARED_KW) { string_literal(p); p.eat(SEMICOLON); - return m.complete(p, ROLLBACK); + return m.complete(p, ROLLBACK_PREPARED); } let _ = p.eat(WORK_KW) || p.eat(TRANSACTION_KW); - if is_rollback && p.eat(TO_KW) { + let kind = if is_rollback && p.eat(TO_KW) { p.eat(SAVEPOINT_KW); savepoint_ref(p); + ROLLBACK_TO_SAVEPOINT } else { opt_chain_clause(p); - } + ROLLBACK_TRANSACTION + }; p.eat(SEMICOLON); - m.complete(p, ROLLBACK) + m.complete(p, kind) } #[derive(Default)] 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 5628b1306..336a19d43 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_extension_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_extension_ok.snap @@ -243,7 +243,7 @@ SOURCE_FILE WHITESPACE " " CAST_SIG L_PAREN "(" - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -721,7 +721,7 @@ SOURCE_FILE PARAM_IN IN_KW "in" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -805,7 +805,7 @@ SOURCE_FILE PARAM_NAME IDENT "b" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -942,7 +942,7 @@ SOURCE_FILE IDENT "t" COMMA "," WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -979,7 +979,7 @@ SOURCE_FILE IDENT "u" COMMA "," WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -1236,7 +1236,7 @@ SOURCE_FILE PARAM_IN IN_KW "in" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -1320,7 +1320,7 @@ SOURCE_FILE PARAM_NAME IDENT "b" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -1383,7 +1383,7 @@ SOURCE_FILE PARAM_IN IN_KW "in" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -1467,7 +1467,7 @@ SOURCE_FILE PARAM_NAME IDENT "b" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 4113ef329..6ab4f930c 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 @@ -164,7 +164,7 @@ SOURCE_FILE COMMA "," WHITESPACE " " PARAM - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 9a44f38cb..570300fd0 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_sequence_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_sequence_ok.snap @@ -27,7 +27,7 @@ SOURCE_FILE OPTION_AS_TYPE AS_KW "as" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 8c06511ea..b72fd9d3c 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap @@ -3856,7 +3856,7 @@ SOURCE_FILE COLUMN_NAME IDENT "status" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 d6910bf84..f78419793 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap @@ -476,7 +476,7 @@ SOURCE_FILE COMPOSITE_FIELD IDENT "a" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -627,7 +627,7 @@ SOURCE_FILE WHITESPACE " " TYPE_KW "type" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__comment_ok.snap b/crates/squawk_parser/tests/snapshots/tests__comment_ok.snap index d03332d23..916dc0907 100644 --- a/crates/squawk_parser/tests/snapshots/tests__comment_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__comment_ok.snap @@ -635,7 +635,7 @@ SOURCE_FILE AT "@" R_ANGLE ">" L_PAREN "(" - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -645,7 +645,7 @@ SOURCE_FILE R_PAREN ")" COMMA "," WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 c1cd65849..a7ba0bcbd 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_domain_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_domain_ok.snap @@ -35,7 +35,7 @@ SOURCE_FILE WHITESPACE " " AS_KW "as" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 92792cdc3..c1b5ea9d7 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_function_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_function_ok.snap @@ -603,7 +603,7 @@ SOURCE_FILE RET_TYPE RETURNS_KW "returns" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -621,7 +621,7 @@ SOURCE_FILE WHITESPACE " " TYPE_KW "type" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -1927,7 +1927,7 @@ SOURCE_FILE END_KW "end" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION END_KW "end" SEMICOLON ";" WHITESPACE "\n\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 eada82126..bca9a95a2 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 @@ -66,7 +66,7 @@ SOURCE_FILE WHITESPACE " " TYPE_KW "type" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -164,7 +164,7 @@ SOURCE_FILE POUND "#" WHITESPACE " " L_PAREN "(" - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -174,7 +174,7 @@ SOURCE_FILE R_PAREN ")" COMMA "," WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 cc2f0b877..e3a6e8438 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_operator_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_operator_ok.snap @@ -115,7 +115,7 @@ SOURCE_FILE EQ "=" WHITESPACE " " ATTRIBUTE_VALUE - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 aedc3d6ba..089c07d1d 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_sequence_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_sequence_ok.snap @@ -41,7 +41,7 @@ SOURCE_FILE OPTION_AS_TYPE AS_KW "as" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" 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 4f9d52c44..353316398 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap @@ -4073,7 +4073,7 @@ SOURCE_FILE COLUMN_NAME IDENT "id" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" WHITESPACE " " COLLATE @@ -4108,7 +4108,7 @@ SOURCE_FILE COLUMN_NAME IDENT "id" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "VARCHAR" WHITESPACE " " PRIMARY_KEY_CONSTRAINT @@ -4143,7 +4143,7 @@ SOURCE_FILE COLUMN_NAME IDENT "id" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" WHITESPACE " " NOT_NULL_CONSTRAINT 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 6cb47ea20..865f28b42 100644 --- a/crates/squawk_parser/tests/snapshots/tests__drop_transform_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__drop_transform_ok.snap @@ -60,7 +60,7 @@ SOURCE_FILE WHITESPACE " " FOR_KW "for" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap index 52775478b..5bad07385 100644 --- a/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__misc_ok.snap @@ -1760,7 +1760,7 @@ SOURCE_FILE IDENT "clean_default_temp" SEMICOLON ";" WHITESPACE "\n\n" - COMMIT + COMMIT_TRANSACTION COMMIT_KW "COMMIT" SEMICOLON ";" WHITESPACE "\n\n" 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 5b2402663..691cad88f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap @@ -448,7 +448,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE CHARACTER_KW "character" SEMICOLON ";" WHITESPACE "\n" @@ -464,7 +464,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + VARCHAR_TYPE CHARACTER_KW "character" WHITESPACE " " VARYING_KW "varying" @@ -482,7 +482,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE CHAR_KW "char" SEMICOLON ";" WHITESPACE "\n" @@ -498,7 +498,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + VARCHAR_TYPE CHAR_KW "char" WHITESPACE " " VARYING_KW "varying" @@ -516,7 +516,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" SEMICOLON ";" WHITESPACE "\n\n" @@ -532,7 +532,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE NATIONAL_KW "national" WHITESPACE " " CHARACTER_KW "character" @@ -550,7 +550,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + VARCHAR_TYPE NATIONAL_KW "national" WHITESPACE " " CHARACTER_KW "character" @@ -570,7 +570,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE NATIONAL_KW "national" WHITESPACE " " CHAR_KW "char" @@ -588,7 +588,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + VARCHAR_TYPE NATIONAL_KW "national" WHITESPACE " " CHAR_KW "char" @@ -608,7 +608,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE NCHAR_KW "nchar" SEMICOLON ";" WHITESPACE "\n" @@ -624,7 +624,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + VARCHAR_TYPE NCHAR_KW "nchar" WHITESPACE " " VARYING_KW "varying" @@ -643,7 +643,7 @@ SOURCE_FILE COLON ":" COLON ":" ARRAY_TYPE - CHAR_TYPE + VARCHAR_TYPE NCHAR_KW "nchar" WHITESPACE " " VARYING_KW "varying" @@ -1664,7 +1664,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" SEMICOLON ";" WHITESPACE "\n" @@ -1680,7 +1680,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -1703,7 +1703,7 @@ SOURCE_FILE COLON ":" COLON ":" ARRAY_TYPE - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -1728,7 +1728,7 @@ SOURCE_FILE COLON ":" COLON ":" ARRAY_TYPE - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" L_BRACK "[" LITERAL @@ -2518,7 +2518,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE CHAR_KW "char" ARG_LIST L_PAREN "(" @@ -2549,7 +2549,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE CHAR_KW "CHAR" ARG_LIST L_PAREN "(" @@ -2573,7 +2573,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE CHAR_KW "CHAR" ARG_LIST L_PAREN "(" @@ -3171,7 +3171,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + VARCHAR_TYPE CHARACTER_KW "character" WHITESPACE " " VARYING_KW "varying" @@ -3187,7 +3187,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + CHARACTER_TYPE CHARACTER_KW "character" WHITESPACE " " LITERAL @@ -3201,7 +3201,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + VARCHAR_TYPE CHAR_KW "char" WHITESPACE " " VARYING_KW "varying" @@ -3217,7 +3217,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + CHARACTER_TYPE CHAR_KW "char" WHITESPACE " " LITERAL @@ -3231,7 +3231,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" WHITESPACE " " LITERAL @@ -3245,7 +3245,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + VARCHAR_TYPE NATIONAL_KW "national" WHITESPACE " " CHARACTER_KW "character" @@ -3263,7 +3263,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + CHARACTER_TYPE NATIONAL_KW "national" WHITESPACE " " CHARACTER_KW "character" @@ -3279,7 +3279,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + VARCHAR_TYPE NATIONAL_KW "national" WHITESPACE " " CHAR_KW "char" @@ -3297,7 +3297,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + CHARACTER_TYPE NATIONAL_KW "national" WHITESPACE " " CHAR_KW "char" @@ -3313,7 +3313,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + VARCHAR_TYPE NCHAR_KW "nchar" WHITESPACE " " VARYING_KW "varying" @@ -3329,7 +3329,7 @@ SOURCE_FILE TARGET_LIST TARGET CAST_EXPR - CHAR_TYPE + CHARACTER_TYPE NCHAR_KW "nchar" WHITESPACE " " LITERAL 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 8bd9c3ca5..4f5d96050 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 @@ -51,7 +51,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE CHAR_KW "char" ARG_LIST L_PAREN "(" @@ -194,7 +194,7 @@ SOURCE_FILE COLON_COLON COLON ":" COLON ":" - CHAR_TYPE + CHARACTER_TYPE CHAR_KW "char" ARG_LIST L_PAREN "(" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_err.snap b/crates/squawk_parser/tests/snapshots/tests__select_err.snap index 1ac2d4bb2..0b8b2c794 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_err.snap @@ -545,7 +545,7 @@ SOURCE_FILE WHITESPACE " " AS_KW "as" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -574,7 +574,7 @@ SOURCE_FILE WHITESPACE " " AS_KW "as" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" ARG_LIST L_PAREN "(" @@ -1106,7 +1106,7 @@ SOURCE_FILE SELECT_CLAUSE SELECT_KW "select" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION END_KW "end" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__sql_pgq_ok.snap b/crates/squawk_parser/tests/snapshots/tests__sql_pgq_ok.snap index c078d7170..f12c7d53f 100644 --- a/crates/squawk_parser/tests/snapshots/tests__sql_pgq_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__sql_pgq_ok.snap @@ -78,7 +78,7 @@ SOURCE_FILE COLUMN_NAME NAME_KW "name" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" COMMA "," WHITESPACE "\n " @@ -127,7 +127,7 @@ SOURCE_FILE COLUMN_NAME NAME_KW "name" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" COMMA "," WHITESPACE "\n " @@ -135,7 +135,7 @@ SOURCE_FILE COLUMN_NAME IDENT "address" WHITESPACE " " - CHAR_TYPE + VARCHAR_TYPE VARCHAR_KW "varchar" WHITESPACE "\n" R_PAREN ")" diff --git a/crates/squawk_parser/tests/snapshots/tests__transaction_ok.snap b/crates/squawk_parser/tests/snapshots/tests__transaction_ok.snap index 282506b6b..02d8682bd 100644 --- a/crates/squawk_parser/tests/snapshots/tests__transaction_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__transaction_ok.snap @@ -7,23 +7,23 @@ SOURCE_FILE WHITESPACE "\n" COMMENT "-- https://www.postgresql.org/docs/17/sql-commit.html" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION COMMIT_KW "commit" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION COMMIT_KW "commit" WHITESPACE " " WORK_KW "work" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION COMMIT_KW "commit" WHITESPACE " " TRANSACTION_KW "transaction" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION COMMIT_KW "commit" WHITESPACE " " AND_CHAIN @@ -32,7 +32,7 @@ SOURCE_FILE CHAIN_KW "chain" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION COMMIT_KW "commit" WHITESPACE " " AND_NO_CHAIN @@ -43,7 +43,7 @@ SOURCE_FILE CHAIN_KW "chain" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_PREPARED COMMIT_KW "commit" WHITESPACE " " PREPARED_KW "prepared" @@ -298,7 +298,7 @@ SOURCE_FILE IDENT "foo" SEMICOLON ";" WHITESPACE "\n\n" - ROLLBACK + ROLLBACK_TO_SAVEPOINT ROLLBACK_KW "rollback" WHITESPACE " " TO_KW "to" @@ -309,7 +309,7 @@ SOURCE_FILE IDENT "foo" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TO_SAVEPOINT ROLLBACK_KW "rollback" WHITESPACE " " WORK_KW "work" @@ -322,7 +322,7 @@ SOURCE_FILE IDENT "foo" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TO_SAVEPOINT ROLLBACK_KW "rollback" WHITESPACE " " TRANSACTION_KW "transaction" @@ -335,7 +335,7 @@ SOURCE_FILE IDENT "foo" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TO_SAVEPOINT ROLLBACK_KW "rollback" WHITESPACE " " TO_KW "to" @@ -344,7 +344,7 @@ SOURCE_FILE IDENT "foo" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TO_SAVEPOINT ROLLBACK_KW "rollback" WHITESPACE " " WORK_KW "work" @@ -355,7 +355,7 @@ SOURCE_FILE IDENT "foo" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TO_SAVEPOINT ROLLBACK_KW "rollback" WHITESPACE " " TRANSACTION_KW "transaction" @@ -366,23 +366,23 @@ SOURCE_FILE IDENT "foo" SEMICOLON ";" WHITESPACE "\n\n" - COMMIT + COMMIT_TRANSACTION END_KW "end" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION END_KW "end" WHITESPACE " " WORK_KW "work" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION END_KW "end" WHITESPACE " " TRANSACTION_KW "transaction" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION END_KW "end" WHITESPACE " " AND_CHAIN @@ -391,7 +391,7 @@ SOURCE_FILE CHAIN_KW "chain" SEMICOLON ";" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION END_KW "end" WHITESPACE " " AND_NO_CHAIN @@ -402,23 +402,23 @@ SOURCE_FILE CHAIN_KW "chain" SEMICOLON ";" WHITESPACE "\n\n" - ROLLBACK + ROLLBACK_TRANSACTION ABORT_KW "abort" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TRANSACTION ABORT_KW "abort" WHITESPACE " " WORK_KW "work" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TRANSACTION ABORT_KW "abort" WHITESPACE " " TRANSACTION_KW "transaction" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TRANSACTION ABORT_KW "abort" WHITESPACE " " AND_CHAIN @@ -427,7 +427,7 @@ SOURCE_FILE CHAIN_KW "chain" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TRANSACTION ABORT_KW "abort" WHITESPACE " " AND_NO_CHAIN @@ -438,23 +438,23 @@ SOURCE_FILE CHAIN_KW "chain" SEMICOLON ";" WHITESPACE "\n\n" - ROLLBACK + ROLLBACK_TRANSACTION ROLLBACK_KW "rollback" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TRANSACTION ROLLBACK_KW "rollback" WHITESPACE " " WORK_KW "work" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TRANSACTION ROLLBACK_KW "rollback" WHITESPACE " " TRANSACTION_KW "transaction" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TRANSACTION ROLLBACK_KW "rollback" WHITESPACE " " AND_CHAIN @@ -463,7 +463,7 @@ SOURCE_FILE CHAIN_KW "chain" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TRANSACTION ROLLBACK_KW "rollback" WHITESPACE " " AND_NO_CHAIN @@ -474,7 +474,7 @@ SOURCE_FILE CHAIN_KW "chain" SEMICOLON ";" WHITESPACE "\n" - ROLLBACK + ROLLBACK_PREPARED ROLLBACK_KW "rollback" WHITESPACE " " PREPARED_KW "prepared" diff --git a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap index a14363e35..c21c6f779 100644 --- a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap @@ -1191,7 +1191,7 @@ SOURCE_FILE WHITESPACE "\n" COMMENT "-- so now we issue these commands:" WHITESPACE "\n" - ROLLBACK + ROLLBACK_TO_SAVEPOINT ROLLBACK_KW "ROLLBACK" WHITESPACE " " TO_KW "TO" @@ -1245,7 +1245,7 @@ SOURCE_FILE WHITESPACE "\n" COMMENT "-- continue with other operations, and eventually" WHITESPACE "\n" - COMMIT + COMMIT_TRANSACTION COMMIT_KW "COMMIT" SEMICOLON ";" WHITESPACE "\n\n" diff --git a/crates/squawk_syntax/src/ast/generated/nodes.rs b/crates/squawk_syntax/src/ast/generated/nodes.rs index 655cdb088..e73695b8b 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -3390,10 +3390,10 @@ impl ChannelRef { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct CharType { +pub struct CharacterType { pub(crate) syntax: SyntaxNode, } -impl CharType { +impl CharacterType { #[inline] pub fn arg_list(&self) -> Option { support::child(&self.syntax) @@ -3418,14 +3418,6 @@ impl CharType { pub fn setof_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::SETOF_KW) } - #[inline] - pub fn varchar_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::VARCHAR_KW) - } - #[inline] - pub fn varying_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::VARYING_KW) - } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -3965,16 +3957,35 @@ impl CommentOn { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct Commit { +pub struct CommitPrepared { pub(crate) syntax: SyntaxNode, } -impl Commit { +impl CommitPrepared { #[inline] - pub fn chain_clause(&self) -> Option { + pub fn literal(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn literal(&self) -> Option { + pub fn semicolon_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SEMICOLON) + } + #[inline] + pub fn commit_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::COMMIT_KW) + } + #[inline] + pub fn prepared_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PREPARED_KW) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct CommitTransaction { + pub(crate) syntax: SyntaxNode, +} +impl CommitTransaction { + #[inline] + pub fn chain_clause(&self) -> Option { support::child(&self.syntax) } #[inline] @@ -3990,10 +4001,6 @@ impl Commit { support::token(&self.syntax, SyntaxKind::END_KW) } #[inline] - pub fn prepared_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::PREPARED_KW) - } - #[inline] pub fn transaction_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::TRANSACTION_KW) } @@ -22105,33 +22112,40 @@ impl RoleRenameTo { } #[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct Rollback { +pub struct RollbackPrepared { pub(crate) syntax: SyntaxNode, } -impl Rollback { +impl RollbackPrepared { #[inline] - pub fn chain_clause(&self) -> Option { + pub fn literal(&self) -> Option { support::child(&self.syntax) } #[inline] - pub fn literal(&self) -> Option { - support::child(&self.syntax) + pub fn semicolon_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SEMICOLON) } #[inline] - pub fn savepoint_ref(&self) -> Option { - support::child(&self.syntax) + pub fn prepared_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::PREPARED_KW) } #[inline] - pub fn semicolon_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::SEMICOLON) + pub fn rollback_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROLLBACK_KW) } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RollbackToSavepoint { + pub(crate) syntax: SyntaxNode, +} +impl RollbackToSavepoint { #[inline] - pub fn abort_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::ABORT_KW) + pub fn savepoint_ref(&self) -> Option { + support::child(&self.syntax) } #[inline] - pub fn prepared_token(&self) -> Option { - support::token(&self.syntax, SyntaxKind::PREPARED_KW) + pub fn semicolon_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SEMICOLON) } #[inline] pub fn rollback_token(&self) -> Option { @@ -22155,6 +22169,37 @@ impl Rollback { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RollbackTransaction { + pub(crate) syntax: SyntaxNode, +} +impl RollbackTransaction { + #[inline] + pub fn chain_clause(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn semicolon_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SEMICOLON) + } + #[inline] + pub fn abort_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ABORT_KW) + } + #[inline] + pub fn rollback_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ROLLBACK_KW) + } + #[inline] + pub fn transaction_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TRANSACTION_KW) + } + #[inline] + pub fn work_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::WORK_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RoutineName { pub(crate) syntax: SyntaxNode, @@ -26314,6 +26359,45 @@ impl Values { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct VarcharType { + pub(crate) syntax: SyntaxNode, +} +impl VarcharType { + #[inline] + pub fn arg_list(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn char_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::CHAR_KW) + } + #[inline] + pub fn character_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::CHARACTER_KW) + } + #[inline] + pub fn national_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NATIONAL_KW) + } + #[inline] + pub fn nchar_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::NCHAR_KW) + } + #[inline] + pub fn setof_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::SETOF_KW) + } + #[inline] + pub fn varchar_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::VARCHAR_KW) + } + #[inline] + pub fn varying_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::VARYING_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Variant { pub(crate) syntax: SyntaxNode, @@ -28300,6 +28384,12 @@ pub enum CommentObject { ObjectView(ObjectView), } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum Commit { + CommitPrepared(CommitPrepared), + CommitTransaction(CommitTransaction), +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum CompoundOp { Except(Except), @@ -29153,6 +29243,13 @@ pub enum RoleOption { RoleOptionValidUntil(RoleOptionValidUntil), } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum Rollback { + RollbackPrepared(RollbackPrepared), + RollbackToSavepoint(RollbackToSavepoint), + RollbackTransaction(RollbackTransaction), +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum RuleAction { Nothing(Nothing), @@ -29355,7 +29452,6 @@ pub enum Stmt { Close(Close), Cluster(Cluster), CommentOn(CommentOn), - Commit(Commit), CompoundSelect(CompoundSelect), Copy(Copy), CreateAccessMethod(CreateAccessMethod), @@ -29475,7 +29571,6 @@ pub enum Stmt { ResetRole(ResetRole), ResetSessionAuth(ResetSessionAuth), Revoke(Revoke), - Rollback(Rollback), SavepointCreate(SavepointCreate), SecurityLabel(SecurityLabel), Select(Select), @@ -29492,6 +29587,8 @@ pub enum Stmt { Update(Update), Vacuum(Vacuum), Values(Values), + Commit(Commit), + Rollback(Rollback), } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -29614,13 +29711,14 @@ pub enum TrimSide { pub enum Type { ArrayType(ArrayType), BitType(BitType), - CharType(CharType), + CharacterType(CharacterType), DoubleType(DoubleType), ExprType(ExprType), IntervalType(IntervalType), PathType(PathType), PercentType(PercentType), TimeType(TimeType), + VarcharType(VarcharType), } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -32166,10 +32264,10 @@ impl AstNode for ChannelRef { &self.syntax } } -impl AstNode for CharType { +impl AstNode for CharacterType { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::CHAR_TYPE + kind == SyntaxKind::CHARACTER_TYPE } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -32688,10 +32786,28 @@ impl AstNode for CommentOn { &self.syntax } } -impl AstNode for Commit { +impl AstNode for CommitPrepared { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::COMMIT + kind == SyntaxKind::COMMIT_PREPARED + } + #[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 CommitTransaction { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::COMMIT_TRANSACTION } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -48366,10 +48482,46 @@ impl AstNode for RoleRenameTo { &self.syntax } } -impl AstNode for Rollback { +impl AstNode for RollbackPrepared { #[inline] fn can_cast(kind: SyntaxKind) -> bool { - kind == SyntaxKind::ROLLBACK + kind == SyntaxKind::ROLLBACK_PREPARED + } + #[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 RollbackToSavepoint { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ROLLBACK_TO_SAVEPOINT + } + #[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 RollbackTransaction { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ROLLBACK_TRANSACTION } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -52578,6 +52730,24 @@ impl AstNode for Values { &self.syntax } } +impl AstNode for VarcharType { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::VARCHAR_TYPE + } + #[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 Variant { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -55134,7 +55304,7 @@ impl AstNode for AlterMaterializedViewAction { AlterMaterializedViewAction::ViewRenameTo(ViewRenameTo { syntax }) } _ => { - if let Some(result) = AlterTableAction::cast(syntax) { + if let Some(result) = AlterTableAction::cast(syntax.clone()) { return Some(AlterMaterializedViewAction::AlterTableAction(result)); } return None; @@ -55973,7 +56143,7 @@ impl AstNode for AlterSequenceAction { SyntaxKind::SET_SCHEMA => AlterSequenceAction::SetSchema(SetSchema { syntax }), SyntaxKind::SET_UNLOGGED => AlterSequenceAction::SetUnlogged(SetUnlogged { syntax }), _ => { - if let Some(result) = SequenceOption::cast(syntax) { + if let Some(result) = SequenceOption::cast(syntax.clone()) { return Some(AlterSequenceAction::SequenceOption(result)); } return None; @@ -58668,7 +58838,7 @@ impl AstNode for BeginFuncOption { BeginFuncOption::ReturnFuncOption(ReturnFuncOption { syntax }) } _ => { - if let Some(result) = Stmt::cast(syntax) { + if let Some(result) = Stmt::cast(syntax.clone()) { return Some(BeginFuncOption::Stmt(result)); } return None; @@ -59466,6 +59636,47 @@ impl From for CommentObject { CommentObject::ObjectView(node) } } +impl AstNode for Commit { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + matches!( + kind, + SyntaxKind::COMMIT_PREPARED | SyntaxKind::COMMIT_TRANSACTION + ) + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + let res = match syntax.kind() { + SyntaxKind::COMMIT_PREPARED => Commit::CommitPrepared(CommitPrepared { syntax }), + SyntaxKind::COMMIT_TRANSACTION => { + Commit::CommitTransaction(CommitTransaction { syntax }) + } + _ => { + return None; + } + }; + Some(res) + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + match self { + Commit::CommitPrepared(it) => &it.syntax, + Commit::CommitTransaction(it) => &it.syntax, + } + } +} +impl From for Commit { + #[inline] + fn from(node: CommitPrepared) -> Commit { + Commit::CommitPrepared(node) + } +} +impl From for Commit { + #[inline] + fn from(node: CommitTransaction) -> Commit { + Commit::CommitTransaction(node) + } +} impl AstNode for CompoundOp { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -60228,7 +60439,7 @@ impl AstNode for CreateTableAsQuery { let res = match syntax.kind() { SyntaxKind::EXECUTE => CreateTableAsQuery::Execute(Execute { syntax }), _ => { - if let Some(result) = SelectVariant::cast(syntax) { + if let Some(result) = SelectVariant::cast(syntax.clone()) { return Some(CreateTableAsQuery::SelectVariant(result)); } return None; @@ -60337,7 +60548,7 @@ impl AstNode for CursorAction { SyntaxKind::PRIOR => CursorAction::Prior(Prior { syntax }), SyntaxKind::RELATIVE => CursorAction::Relative(Relative { syntax }), _ => { - if let Some(result) = Expr::cast(syntax) { + if let Some(result) = Expr::cast(syntax.clone()) { return Some(CursorAction::Expr(result)); } return None; @@ -60846,7 +61057,7 @@ impl AstNode for ElementTableLabelAndProperties { }) } _ => { - if let Some(result) = ElementTableProperties::cast(syntax) { + if let Some(result) = ElementTableProperties::cast(syntax.clone()) { return Some(ElementTableLabelAndProperties::ElementTableProperties( result, )); @@ -62002,7 +62213,7 @@ impl AstNode for FrameExtent { let res = match syntax.kind() { SyntaxKind::FRAME_BETWEEN => FrameExtent::FrameBetween(FrameBetween { syntax }), _ => { - if let Some(result) = FrameBound::cast(syntax) { + if let Some(result) = FrameBound::cast(syntax.clone()) { return Some(FrameExtent::FrameBound(result)); } return None; @@ -62294,7 +62505,7 @@ impl AstNode for FuncOption { FuncOption::WindowFuncOption(WindowFuncOption { syntax }) } _ => { - if let Some(result) = VolatilityFuncOption::cast(syntax) { + if let Some(result) = VolatilityFuncOption::cast(syntax.clone()) { return Some(FuncOption::VolatilityFuncOption(result)); } return None; @@ -62805,7 +63016,7 @@ impl AstNode for InsertSource { let res = match syntax.kind() { SyntaxKind::DEFAULT_VALUES => InsertSource::DefaultValues(DefaultValues { syntax }), _ => { - if let Some(result) = SelectVariant::cast(syntax) { + if let Some(result) = SelectVariant::cast(syntax.clone()) { return Some(InsertSource::SelectVariant(result)); } return None; @@ -63517,7 +63728,7 @@ impl AstNode for LimitValue { let res = match syntax.kind() { SyntaxKind::ALL => LimitValue::All(All { syntax }), _ => { - if let Some(result) = Expr::cast(syntax) { + if let Some(result) = Expr::cast(syntax.clone()) { return Some(LimitValue::Expr(result)); } return None; @@ -64279,7 +64490,7 @@ impl AstNode for OverlayExpr { let res = match syntax.kind() { SyntaxKind::NAMED_ARG => OverlayExpr::NamedArg(NamedArg { syntax }), _ => { - if let Some(result) = Expr::cast(syntax) { + if let Some(result) = Expr::cast(syntax.clone()) { return Some(OverlayExpr::Expr(result)); } return None; @@ -66000,6 +66211,61 @@ impl From for RoleOption { RoleOption::RoleOptionValidUntil(node) } } +impl AstNode for Rollback { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + matches!( + kind, + SyntaxKind::ROLLBACK_PREPARED + | SyntaxKind::ROLLBACK_TO_SAVEPOINT + | SyntaxKind::ROLLBACK_TRANSACTION + ) + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + let res = match syntax.kind() { + SyntaxKind::ROLLBACK_PREPARED => { + Rollback::RollbackPrepared(RollbackPrepared { syntax }) + } + SyntaxKind::ROLLBACK_TO_SAVEPOINT => { + Rollback::RollbackToSavepoint(RollbackToSavepoint { syntax }) + } + SyntaxKind::ROLLBACK_TRANSACTION => { + Rollback::RollbackTransaction(RollbackTransaction { syntax }) + } + _ => { + return None; + } + }; + Some(res) + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + match self { + Rollback::RollbackPrepared(it) => &it.syntax, + Rollback::RollbackToSavepoint(it) => &it.syntax, + Rollback::RollbackTransaction(it) => &it.syntax, + } + } +} +impl From for Rollback { + #[inline] + fn from(node: RollbackPrepared) -> Rollback { + Rollback::RollbackPrepared(node) + } +} +impl From for Rollback { + #[inline] + fn from(node: RollbackToSavepoint) -> Rollback { + Rollback::RollbackToSavepoint(node) + } +} +impl From for Rollback { + #[inline] + fn from(node: RollbackTransaction) -> Rollback { + Rollback::RollbackTransaction(node) + } +} impl AstNode for RuleAction { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -66011,7 +66277,7 @@ impl AstNode for RuleAction { SyntaxKind::NOTHING => RuleAction::Nothing(Nothing { syntax }), SyntaxKind::RULE_STMT_LIST => RuleAction::RuleStmtList(RuleStmtList { syntax }), _ => { - if let Some(result) = RuleStmt::cast(syntax) { + if let Some(result) = RuleStmt::cast(syntax.clone()) { return Some(RuleAction::RuleStmt(result)); } return None; @@ -66056,7 +66322,7 @@ impl AstNode for RuleStmt { SyntaxKind::NOTIFY => RuleStmt::Notify(Notify { syntax }), SyntaxKind::UPDATE => RuleStmt::Update(Update { syntax }), _ => { - if let Some(result) = SelectVariant::cast(syntax) { + if let Some(result) = SelectVariant::cast(syntax.clone()) { return Some(RuleStmt::SelectVariant(result)); } return None; @@ -67199,7 +67465,6 @@ impl AstNode for Stmt { | SyntaxKind::CLOSE | SyntaxKind::CLUSTER | SyntaxKind::COMMENT_ON - | SyntaxKind::COMMIT | SyntaxKind::COMPOUND_SELECT | SyntaxKind::COPY | SyntaxKind::CREATE_ACCESS_METHOD @@ -67319,7 +67584,6 @@ impl AstNode for Stmt { | SyntaxKind::RESET_ROLE | SyntaxKind::RESET_SESSION_AUTH | SyntaxKind::REVOKE - | SyntaxKind::ROLLBACK | SyntaxKind::SAVEPOINT_CREATE | SyntaxKind::SECURITY_LABEL | SyntaxKind::SELECT @@ -67336,7 +67600,8 @@ impl AstNode for Stmt { | SyntaxKind::UPDATE | SyntaxKind::VACUUM | SyntaxKind::VALUES - ) + ) || Commit::can_cast(kind) + || Rollback::can_cast(kind) } #[inline] fn cast(syntax: SyntaxNode) -> Option { @@ -67415,7 +67680,6 @@ impl AstNode for Stmt { SyntaxKind::CLOSE => Stmt::Close(Close { syntax }), SyntaxKind::CLUSTER => Stmt::Cluster(Cluster { syntax }), SyntaxKind::COMMENT_ON => Stmt::CommentOn(CommentOn { syntax }), - SyntaxKind::COMMIT => Stmt::Commit(Commit { syntax }), SyntaxKind::COMPOUND_SELECT => Stmt::CompoundSelect(CompoundSelect { syntax }), SyntaxKind::COPY => Stmt::Copy(Copy { syntax }), SyntaxKind::CREATE_ACCESS_METHOD => { @@ -67585,7 +67849,6 @@ impl AstNode for Stmt { SyntaxKind::RESET_ROLE => Stmt::ResetRole(ResetRole { syntax }), SyntaxKind::RESET_SESSION_AUTH => Stmt::ResetSessionAuth(ResetSessionAuth { syntax }), SyntaxKind::REVOKE => Stmt::Revoke(Revoke { syntax }), - SyntaxKind::ROLLBACK => Stmt::Rollback(Rollback { syntax }), SyntaxKind::SAVEPOINT_CREATE => Stmt::SavepointCreate(SavepointCreate { syntax }), SyntaxKind::SECURITY_LABEL => Stmt::SecurityLabel(SecurityLabel { syntax }), SyntaxKind::SELECT => Stmt::Select(Select { syntax }), @@ -67603,6 +67866,12 @@ impl AstNode for Stmt { SyntaxKind::VACUUM => Stmt::Vacuum(Vacuum { syntax }), SyntaxKind::VALUES => Stmt::Values(Values { syntax }), _ => { + if let Some(result) = Commit::cast(syntax.clone()) { + return Some(Stmt::Commit(result)); + } + if let Some(result) = Rollback::cast(syntax.clone()) { + return Some(Stmt::Rollback(result)); + } return None; } }; @@ -67661,7 +67930,6 @@ impl AstNode for Stmt { Stmt::Close(it) => &it.syntax, Stmt::Cluster(it) => &it.syntax, Stmt::CommentOn(it) => &it.syntax, - Stmt::Commit(it) => &it.syntax, Stmt::CompoundSelect(it) => &it.syntax, Stmt::Copy(it) => &it.syntax, Stmt::CreateAccessMethod(it) => &it.syntax, @@ -67781,7 +68049,6 @@ impl AstNode for Stmt { Stmt::ResetRole(it) => &it.syntax, Stmt::ResetSessionAuth(it) => &it.syntax, Stmt::Revoke(it) => &it.syntax, - Stmt::Rollback(it) => &it.syntax, Stmt::SavepointCreate(it) => &it.syntax, Stmt::SecurityLabel(it) => &it.syntax, Stmt::Select(it) => &it.syntax, @@ -67798,6 +68065,8 @@ impl AstNode for Stmt { Stmt::Update(it) => &it.syntax, Stmt::Vacuum(it) => &it.syntax, Stmt::Values(it) => &it.syntax, + Stmt::Commit(it) => it.syntax(), + Stmt::Rollback(it) => it.syntax(), } } } @@ -68101,12 +68370,6 @@ impl From for Stmt { Stmt::CommentOn(node) } } -impl From for Stmt { - #[inline] - fn from(node: Commit) -> Stmt { - Stmt::Commit(node) - } -} impl From for Stmt { #[inline] fn from(node: CompoundSelect) -> Stmt { @@ -68821,12 +69084,6 @@ impl From for Stmt { Stmt::Revoke(node) } } -impl From for Stmt { - #[inline] - fn from(node: Rollback) -> Stmt { - Stmt::Rollback(node) - } -} impl From for Stmt { #[inline] fn from(node: SavepointCreate) -> Stmt { @@ -69040,7 +69297,7 @@ impl AstNode for TableArg { SyntaxKind::COLUMN => TableArg::Column(Column { syntax }), SyntaxKind::LIKE_CLAUSE => TableArg::LikeClause(LikeClause { syntax }), _ => { - if let Some(result) = TableConstraint::cast(syntax) { + if let Some(result) = TableConstraint::cast(syntax.clone()) { return Some(TableArg::TableConstraint(result)); } return None; @@ -69794,13 +70051,14 @@ impl AstNode for Type { kind, SyntaxKind::ARRAY_TYPE | SyntaxKind::BIT_TYPE - | SyntaxKind::CHAR_TYPE + | SyntaxKind::CHARACTER_TYPE | SyntaxKind::DOUBLE_TYPE | SyntaxKind::EXPR_TYPE | SyntaxKind::INTERVAL_TYPE | SyntaxKind::PATH_TYPE | SyntaxKind::PERCENT_TYPE | SyntaxKind::TIME_TYPE + | SyntaxKind::VARCHAR_TYPE ) } #[inline] @@ -69808,13 +70066,14 @@ impl AstNode for Type { let res = match syntax.kind() { SyntaxKind::ARRAY_TYPE => Type::ArrayType(ArrayType { syntax }), SyntaxKind::BIT_TYPE => Type::BitType(BitType { syntax }), - SyntaxKind::CHAR_TYPE => Type::CharType(CharType { syntax }), + SyntaxKind::CHARACTER_TYPE => Type::CharacterType(CharacterType { syntax }), SyntaxKind::DOUBLE_TYPE => Type::DoubleType(DoubleType { syntax }), SyntaxKind::EXPR_TYPE => Type::ExprType(ExprType { syntax }), SyntaxKind::INTERVAL_TYPE => Type::IntervalType(IntervalType { syntax }), SyntaxKind::PATH_TYPE => Type::PathType(PathType { syntax }), SyntaxKind::PERCENT_TYPE => Type::PercentType(PercentType { syntax }), SyntaxKind::TIME_TYPE => Type::TimeType(TimeType { syntax }), + SyntaxKind::VARCHAR_TYPE => Type::VarcharType(VarcharType { syntax }), _ => { return None; } @@ -69826,13 +70085,14 @@ impl AstNode for Type { match self { Type::ArrayType(it) => &it.syntax, Type::BitType(it) => &it.syntax, - Type::CharType(it) => &it.syntax, + Type::CharacterType(it) => &it.syntax, Type::DoubleType(it) => &it.syntax, Type::ExprType(it) => &it.syntax, Type::IntervalType(it) => &it.syntax, Type::PathType(it) => &it.syntax, Type::PercentType(it) => &it.syntax, Type::TimeType(it) => &it.syntax, + Type::VarcharType(it) => &it.syntax, } } } @@ -69848,10 +70108,10 @@ impl From for Type { Type::BitType(node) } } -impl From for Type { +impl From for Type { #[inline] - fn from(node: CharType) -> Type { - Type::CharType(node) + fn from(node: CharacterType) -> Type { + Type::CharacterType(node) } } impl From for Type { @@ -69890,6 +70150,12 @@ impl From for Type { Type::TimeType(node) } } +impl From for Type { + #[inline] + fn from(node: VarcharType) -> Type { + Type::VarcharType(node) + } +} impl AstNode for ValuePosition { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/ast/node_ext.rs b/crates/squawk_syntax/src/ast/node_ext.rs index 8f0bf0cfe..c295e2b3e 100644 --- a/crates/squawk_syntax/src/ast/node_ext.rs +++ b/crates/squawk_syntax/src/ast/node_ext.rs @@ -675,7 +675,14 @@ pub(crate) fn normalize_name_node(node: &SyntaxNode) -> String { .unwrap_or_else(|| raw.to_ascii_lowercase()) } -impl ast::CharType { +impl ast::VarcharType { + #[inline] + pub fn text(&self) -> TokenText<'_> { + text_of_first_token(self.syntax()) + } +} + +impl ast::CharacterType { #[inline] pub fn text(&self) -> TokenText<'_> { text_of_first_token(self.syntax()) diff --git a/crates/squawk_syntax/src/column_name.rs b/crates/squawk_syntax/src/column_name.rs index e34483bbe..3ac07a45e 100644 --- a/crates/squawk_syntax/src/column_name.rs +++ b/crates/squawk_syntax/src/column_name.rs @@ -122,16 +122,16 @@ fn name_from_type(ty: ast::Type, unknown_column: bool) -> Option<(ColumnName, Sy bit_type.syntax().clone(), )); } - ast::Type::CharType(char_type) => { - let name = if char_type.varchar_token().is_some() || char_type.varying_token().is_some() - { - "varchar" - } else { - "bpchar" - }; + ast::Type::VarcharType(varchar_type) => { return Some(( - ColumnName::new_static(name, unknown_column), - char_type.syntax().clone(), + ColumnName::new_static("varchar", unknown_column), + varchar_type.syntax().clone(), + )); + } + ast::Type::CharacterType(character_type) => { + return Some(( + ColumnName::new_static("bpchar", unknown_column), + character_type.syntax().clone(), )); } ast::Type::DoubleType(double_type) => { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index f1fbc0b68..5ff9fb055 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -771,9 +771,18 @@ PercentType = PathType = 'setof'? PathRef ArgList? -CharType = +VarcharType = 'setof'? - ('varchar' | 'national'? ( 'character' | 'char' | 'nchar' ) 'varying'? ) + ( + 'varchar' + | 'national'? ( 'character' | 'char' ) 'varying' + | 'nchar' 'varying' + ) + ArgList? + +CharacterType = + 'setof'? + ('national'? ( 'character' | 'char' ) | 'nchar') ArgList? BitType = @@ -819,7 +828,8 @@ Type = | PathType // TODO: I think we can probably simplify the AST nodes for Types & Exprs. | ExprType -| CharType +| VarcharType +| CharacterType | BitType | DoubleType | TimeType @@ -1747,16 +1757,28 @@ Begin = TransactionModeList? ';'? Commit = - ( - 'commit' ('prepared' Literal | ('work' | 'transaction')? ChainClause?) - | 'end' ('work' | 'transaction')? ChainClause? - ) ';'? + CommitTransaction +| CommitPrepared + +CommitTransaction = + ('commit' | 'end') ('work' | 'transaction')? ChainClause? ';'? + +CommitPrepared = + 'commit' 'prepared' Literal ';'? Rollback = - 'rollback' ('work' | 'transaction')? ChainClause? ';'? -| 'abort' ('work' | 'transaction')? ChainClause? ';'? -| 'rollback' ('work' | 'transaction')? 'to' 'savepoint'? SavepointRef ';'? -| 'rollback' 'prepared' Literal ';'? + RollbackTransaction +| RollbackToSavepoint +| RollbackPrepared + +RollbackTransaction = + ('rollback' | 'abort') ('work' | 'transaction')? ChainClause? ';'? + +RollbackToSavepoint = + 'rollback' ('work' | 'transaction')? 'to' 'savepoint'? SavepointRef ';'? + +RollbackPrepared = + 'rollback' 'prepared' Literal ';'? ChainClause = AndChain @@ -6124,8 +6146,6 @@ Collate = Expr? 'collate' CollationRef Stmt = - // We merge this into Rollback - // Abort AlterAggregate | AlterCollation | AlterConversion @@ -6296,9 +6316,6 @@ Stmt = | Reset | Revoke | Rollback -// Merged into Rollback -// | RollbackPrepared -// | RollbackToSavepoint | SavepointCreate | SecurityLabel | Select diff --git a/crates/xtask/src/codegen.rs b/crates/xtask/src/codegen.rs index 88a2cefd9..ffae6d109 100644 --- a/crates/xtask/src/codegen.rs +++ b/crates/xtask/src/codegen.rs @@ -931,7 +931,7 @@ fn generate_nodes(nodes: &[AstNodeSrc], enums: &[AstEnumSrc]) -> String { )* _ => { #( - if let Some(result) = #cast_variants::cast(syntax) { + if let Some(result) = #cast_variants::cast(syntax.clone()) { return Some(#name::#cast_variants(result)); } )*