diff --git a/crates/squawk_parser/src/generated/syntax_kind.rs b/crates/squawk_parser/src/generated/syntax_kind.rs index 0a1899eb..82bca450 100644 --- a/crates/squawk_parser/src/generated/syntax_kind.rs +++ b/crates/squawk_parser/src/generated/syntax_kind.rs @@ -551,14 +551,17 @@ pub enum SyntaxKind { ERROR, IDENT, WHITESPACE, + ADD_ATTRIBUTE, ADD_COLUMN, ADD_CONSTRAINT, ADD_GENERATED, ADD_OP_CLASS_OPTIONS, + ADD_VALUE, AGGREGATE, ALIAS, ALL_FN, ALTER_AGGREGATE, + ALTER_ATTRIBUTE, ALTER_COLLATION, ALTER_COLUMN, ALTER_CONSTRAINT, @@ -728,6 +731,7 @@ pub enum SyntaxKind { DROP, DROP_ACCESS_METHOD, DROP_AGGREGATE, + DROP_ATTRIBUTE, DROP_CAST, DROP_COLLATION, DROP_COLUMN, @@ -1026,9 +1030,11 @@ pub enum SyntaxKind { REINDEX, RELATION_NAME, RELEASE_SAVEPOINT, + RENAME_ATTRIBUTE, RENAME_COLUMN, RENAME_CONSTRAINT, RENAME_TO, + RENAME_VALUE, REPEATABLE_CLAUSE, REPEATABLE_READ, REPLICA_IDENTITY, diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index b705ef46..ad3727d5 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -7910,17 +7910,20 @@ fn alter_trigger(p: &mut Parser<'_>) -> CompletedMarker { } fn alter_type_action(p: &mut Parser<'_>) { - if p.eat(ADD_KW) { + let m = p.start(); + let kind = if p.eat(ADD_KW) { p.expect(ATTRIBUTE_KW); name(p); type_name(p); opt_collate(p); opt_cascade_or_restrict(p); + ADD_ATTRIBUTE } else if p.eat(DROP_KW) { p.expect(ATTRIBUTE_KW); opt_if_exists(p); name_ref(p); opt_cascade_or_restrict(p); + DROP_ATTRIBUTE } else { p.expect(ALTER_KW); p.expect(ATTRIBUTE_KW); @@ -7932,7 +7935,9 @@ fn alter_type_action(p: &mut Parser<'_>) { type_name(p); opt_collate(p); opt_cascade_or_restrict(p); - } + ALTER_ATTRIBUTE + }; + m.complete(p, kind); } // ALTER TYPE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } @@ -7974,36 +7979,34 @@ fn alter_type(p: &mut Parser<'_>) -> CompletedMarker { rename_to(p); } RENAME_KW => { + let m = p.start(); p.bump(RENAME_KW); if p.eat(ATTRIBUTE_KW) { name_ref(p); p.expect(TO_KW); name(p); opt_cascade_or_restrict(p); + m.complete(p, RENAME_ATTRIBUTE); } else if p.eat(VALUE_KW) { string_literal(p); p.expect(TO_KW); string_literal(p); + m.complete(p, RENAME_VALUE); } else { p.error("expected TO, ATTRIBUTE, or VALUE"); + m.abandon(p); } } ADD_KW => { + let m = p.start(); p.bump(ADD_KW); - if p.eat(VALUE_KW) { - opt_if_not_exists(p); + p.expect(VALUE_KW); + opt_if_not_exists(p); + string_literal(p); + if p.eat(BEFORE_KW) || p.eat(AFTER_KW) { string_literal(p); - if p.eat(BEFORE_KW) || p.eat(AFTER_KW) { - string_literal(p); - } - } else if p.eat(ATTRIBUTE_KW) { - name(p); - type_name(p); - opt_collate(p); - opt_cascade_or_restrict(p); - } else { - p.error("expected VALUE or ATTRIBUTE"); } + m.complete(p, ADD_VALUE); } _ => p.error("expected ALTER TYPE option"), } 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 d684ae66..684929e2 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_type_ok.snap @@ -98,17 +98,18 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - RENAME_KW "rename" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME_REF - IDENT "a" - WHITESPACE " " - TO_KW "to" - WHITESPACE " " - NAME - IDENT "b" + RENAME_ATTRIBUTE + RENAME_KW "rename" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME_REF + IDENT "a" + WHITESPACE " " + TO_KW "to" + WHITESPACE " " + NAME + IDENT "b" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- rename_attribute_cascade" @@ -128,19 +129,20 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - RENAME_KW "rename" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME_REF - IDENT "a" - WHITESPACE " " - TO_KW "to" - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - CASCADE_KW "cascade" + RENAME_ATTRIBUTE + RENAME_KW "rename" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME_REF + IDENT "a" + WHITESPACE " " + TO_KW "to" + WHITESPACE " " + NAME + IDENT "b" + WHITESPACE " " + CASCADE_KW "cascade" SEMICOLON ";" WHITESPACE "\n" ALTER_TYPE @@ -158,19 +160,20 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - RENAME_KW "rename" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME_REF - IDENT "a" - WHITESPACE " " - TO_KW "to" - WHITESPACE " " - NAME - IDENT "b" - WHITESPACE " " - RESTRICT_KW "restrict" + RENAME_ATTRIBUTE + RENAME_KW "rename" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME_REF + IDENT "a" + WHITESPACE " " + TO_KW "to" + WHITESPACE " " + NAME + IDENT "b" + WHITESPACE " " + RESTRICT_KW "restrict" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- add_value" @@ -185,12 +188,13 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - VALUE_KW "value" - WHITESPACE " " - LITERAL - STRING "'v'" + ADD_VALUE + ADD_KW "add" + WHITESPACE " " + VALUE_KW "value" + WHITESPACE " " + LITERAL + STRING "'v'" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- add_value_full" @@ -210,24 +214,25 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - VALUE_KW "value" - WHITESPACE " " - IF_NOT_EXISTS - IF_KW "if" + ADD_VALUE + ADD_KW "add" WHITESPACE " " - NOT_KW "not" + VALUE_KW "value" WHITESPACE " " - EXISTS_KW "exists" - WHITESPACE " " - LITERAL - STRING "'v'" - WHITESPACE " " - BEFORE_KW "before" - WHITESPACE " " - LITERAL - STRING "'w'" + IF_NOT_EXISTS + IF_KW "if" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + EXISTS_KW "exists" + WHITESPACE " " + LITERAL + STRING "'v'" + WHITESPACE " " + BEFORE_KW "before" + WHITESPACE " " + LITERAL + STRING "'w'" SEMICOLON ";" WHITESPACE "\n" ALTER_TYPE @@ -245,24 +250,25 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - VALUE_KW "value" - WHITESPACE " " - IF_NOT_EXISTS - IF_KW "if" + ADD_VALUE + ADD_KW "add" WHITESPACE " " - NOT_KW "not" + VALUE_KW "value" WHITESPACE " " - EXISTS_KW "exists" - WHITESPACE " " - LITERAL - STRING "'v'" - WHITESPACE " " - AFTER_KW "after" - WHITESPACE " " - LITERAL - STRING "'w'" + IF_NOT_EXISTS + IF_KW "if" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + EXISTS_KW "exists" + WHITESPACE " " + LITERAL + STRING "'v'" + WHITESPACE " " + AFTER_KW "after" + WHITESPACE " " + LITERAL + STRING "'w'" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- rename_value" @@ -277,17 +283,18 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - RENAME_KW "rename" - WHITESPACE " " - VALUE_KW "value" - WHITESPACE " " - LITERAL - STRING "'v'" - WHITESPACE " " - TO_KW "to" - WHITESPACE " " - LITERAL - STRING "'w'" + RENAME_VALUE + RENAME_KW "rename" + WHITESPACE " " + VALUE_KW "value" + WHITESPACE " " + LITERAL + STRING "'v'" + WHITESPACE " " + TO_KW "to" + WHITESPACE " " + LITERAL + STRING "'w'" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- set_property" @@ -369,18 +376,19 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "b" + ADD_ATTRIBUTE + ADD_KW "add" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "b" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- add_attribute_collate" @@ -395,26 +403,27 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "b" - WHITESPACE " " - COLLATE - COLLATE_KW "collate" + ADD_ATTRIBUTE + ADD_KW "add" WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "c" + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "b" + WHITESPACE " " + COLLATE + COLLATE_KW "collate" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "c" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- add_attribute_cascade" @@ -429,20 +438,21 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - CASCADE_KW "cascade" + ADD_ATTRIBUTE + ADD_KW "add" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + CASCADE_KW "cascade" SEMICOLON ";" WHITESPACE "\n" ALTER_TYPE @@ -455,23 +465,24 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME - IDENT "a" - WHITESPACE " " - CHAR_TYPE - VARCHAR_KW "varchar" - ARG_LIST - L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" - R_PAREN ")" - WHITESPACE " " - RESTRICT_KW "restrict" + ADD_ATTRIBUTE + ADD_KW "add" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME + IDENT "a" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "varchar" + ARG_LIST + L_PAREN "(" + ARG + LITERAL + INT_NUMBER "100" + R_PAREN ")" + WHITESPACE " " + RESTRICT_KW "restrict" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- drop_attribute" @@ -486,12 +497,13 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME_REF - IDENT "a" + DROP_ATTRIBUTE + DROP_KW "drop" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME_REF + IDENT "a" SEMICOLON ";" WHITESPACE "\n" ALTER_TYPE @@ -504,19 +516,20 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - IF_EXISTS - IF_KW "if" + DROP_ATTRIBUTE + DROP_KW "drop" WHITESPACE " " - EXISTS_KW "exists" - WHITESPACE " " - NAME_REF - IDENT "a" - WHITESPACE " " - CASCADE_KW "cascade" + ATTRIBUTE_KW "attribute" + WHITESPACE " " + IF_EXISTS + IF_KW "if" + WHITESPACE " " + EXISTS_KW "exists" + WHITESPACE " " + NAME_REF + IDENT "a" + WHITESPACE " " + CASCADE_KW "cascade" SEMICOLON ";" WHITESPACE "\n" ALTER_TYPE @@ -529,19 +542,20 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - IF_EXISTS - IF_KW "if" + DROP_ATTRIBUTE + DROP_KW "drop" WHITESPACE " " - EXISTS_KW "exists" - WHITESPACE " " - NAME_REF - IDENT "a" - WHITESPACE " " - RESTRICT_KW "restrict" + ATTRIBUTE_KW "attribute" + WHITESPACE " " + IF_EXISTS + IF_KW "if" + WHITESPACE " " + EXISTS_KW "exists" + WHITESPACE " " + NAME_REF + IDENT "a" + WHITESPACE " " + RESTRICT_KW "restrict" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- alter_attribute" @@ -556,20 +570,21 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ALTER_KW "alter" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME_REF - IDENT "a" - WHITESPACE " " - TYPE_KW "type" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "b" + ALTER_ATTRIBUTE + ALTER_KW "alter" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME_REF + IDENT "a" + WHITESPACE " " + TYPE_KW "type" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "b" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- alter_attribute_set_data" @@ -589,37 +604,38 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ALTER_KW "alter" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME_REF - IDENT "a" - WHITESPACE " " - SET_KW "set" - WHITESPACE " " - DATA_KW "data" - WHITESPACE " " - TYPE_KW "type" - WHITESPACE " " - CHAR_TYPE - VARCHAR_KW "varchar" - ARG_LIST - L_PAREN "(" - ARG - LITERAL - INT_NUMBER "100" - R_PAREN ")" - WHITESPACE " " - COLLATE - COLLATE_KW "collate" + ALTER_ATTRIBUTE + ALTER_KW "alter" WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "c" - WHITESPACE " " - CASCADE_KW "cascade" + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME_REF + IDENT "a" + WHITESPACE " " + SET_KW "set" + WHITESPACE " " + DATA_KW "data" + WHITESPACE " " + TYPE_KW "type" + WHITESPACE " " + CHAR_TYPE + VARCHAR_KW "varchar" + ARG_LIST + L_PAREN "(" + ARG + LITERAL + INT_NUMBER "100" + R_PAREN ")" + WHITESPACE " " + COLLATE + COLLATE_KW "collate" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "c" + WHITESPACE " " + CASCADE_KW "cascade" SEMICOLON ";" WHITESPACE "\n" ALTER_TYPE @@ -632,22 +648,23 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ALTER_KW "alter" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME_REF - IDENT "a" - WHITESPACE " " - TYPE_KW "type" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE " " - RESTRICT_KW "restrict" + ALTER_ATTRIBUTE + ALTER_KW "alter" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME_REF + IDENT "a" + WHITESPACE " " + TYPE_KW "type" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE " " + RESTRICT_KW "restrict" SEMICOLON ";" WHITESPACE "\n\n" COMMENT "-- multiple_actions" @@ -662,25 +679,27 @@ SOURCE_FILE NAME_REF IDENT "t" WHITESPACE " " - ADD_KW "add" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "b" + ADD_ATTRIBUTE + ADD_KW "add" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "b" COMMA "," WHITESPACE " " - DROP_KW "drop" - WHITESPACE " " - ATTRIBUTE_KW "attribute" - WHITESPACE " " - NAME_REF - IDENT "c" + DROP_ATTRIBUTE + DROP_KW "drop" + WHITESPACE " " + ATTRIBUTE_KW "attribute" + WHITESPACE " " + NAME_REF + IDENT "c" 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 570f895c..ae0322c0 100644 --- a/crates/squawk_syntax/src/ast/generated/nodes.rs +++ b/crates/squawk_syntax/src/ast/generated/nodes.rs @@ -7,6 +7,41 @@ use crate::ast::{AstChildren, support}; use crate::syntax_node::SyntaxNode; use crate::syntax_node::SyntaxToken; +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AddAttribute { + pub(crate) syntax: SyntaxNode, +} +impl AddAttribute { + #[inline] + pub fn cascade(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn collate(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn name(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn restrict(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn ty(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn add_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ADD_KW) + } + #[inline] + pub fn attribute_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ATTRIBUTE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct AddColumn { pub(crate) syntax: SyntaxNode, @@ -119,6 +154,37 @@ impl AddOpClassOptions { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AddValue { + pub(crate) syntax: SyntaxNode, +} +impl AddValue { + #[inline] + pub fn if_not_exists(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn add_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ADD_KW) + } + #[inline] + pub fn after_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::AFTER_KW) + } + #[inline] + pub fn before_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::BEFORE_KW) + } + #[inline] + pub fn value_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::VALUE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Aggregate { pub(crate) syntax: SyntaxNode, @@ -199,6 +265,29 @@ impl AlterAggregate { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct AlterAttribute { + pub(crate) syntax: SyntaxNode, +} +impl AlterAttribute { + #[inline] + pub fn cascade(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn restrict(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn alter_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ALTER_KW) + } + #[inline] + pub fn attribute_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ATTRIBUTE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct AlterCollation { pub(crate) syntax: SyntaxNode, @@ -1606,11 +1695,43 @@ pub struct AlterType { pub(crate) syntax: SyntaxNode, } impl AlterType { + #[inline] + pub fn add_value(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn alter_type_actions(&self) -> AstChildren { + support::children(&self.syntax) + } + #[inline] + pub fn owner_to(&self) -> Option { + support::child(&self.syntax) + } #[inline] pub fn path(&self) -> Option { support::child(&self.syntax) } #[inline] + pub fn rename_attribute(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn rename_to(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn rename_value(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn set_options(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn set_schema(&self) -> Option { + support::child(&self.syntax) + } + #[inline] pub fn alter_token(&self) -> Option { support::token(&self.syntax, SyntaxKind::ALTER_KW) } @@ -5845,6 +5966,33 @@ impl DropAggregate { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct DropAttribute { + pub(crate) syntax: SyntaxNode, +} +impl DropAttribute { + #[inline] + pub fn cascade(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn if_exists(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn restrict(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn attribute_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ATTRIBUTE_KW) + } + #[inline] + pub fn drop_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::DROP_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct DropCast { pub(crate) syntax: SyntaxNode, @@ -13078,6 +13226,33 @@ impl ReleaseSavepoint { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RenameAttribute { + pub(crate) syntax: SyntaxNode, +} +impl RenameAttribute { + #[inline] + pub fn name(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn name_ref(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn attribute_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::ATTRIBUTE_KW) + } + #[inline] + pub fn rename_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::RENAME_KW) + } + #[inline] + pub fn to_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TO_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RenameColumn { pub(crate) syntax: SyntaxNode, @@ -13143,6 +13318,29 @@ impl RenameTo { } } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct RenameValue { + pub(crate) syntax: SyntaxNode, +} +impl RenameValue { + #[inline] + pub fn literal(&self) -> Option { + support::child(&self.syntax) + } + #[inline] + pub fn rename_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::RENAME_KW) + } + #[inline] + pub fn to_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::TO_KW) + } + #[inline] + pub fn value_token(&self) -> Option { + support::token(&self.syntax, SyntaxKind::VALUE_KW) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RepeatableClause { pub(crate) syntax: SyntaxNode, @@ -17105,6 +17303,13 @@ pub enum AlterTableAction { ValidateConstraint(ValidateConstraint), } +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub enum AlterTypeAction { + AddAttribute(AddAttribute), + AlterAttribute(AlterAttribute), + DropAttribute(DropAttribute), +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum ColumnConstraint { CheckConstraint(CheckConstraint), @@ -17570,6 +17775,24 @@ pub enum WithQuery { Update(Update), Values(Values), } +impl AstNode for AddAttribute { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ADD_ATTRIBUTE + } + #[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 AddColumn { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -17642,6 +17865,24 @@ impl AstNode for AddOpClassOptions { &self.syntax } } +impl AstNode for AddValue { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ADD_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 Aggregate { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -17714,6 +17955,24 @@ impl AstNode for AlterAggregate { &self.syntax } } +impl AstNode for AlterAttribute { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::ALTER_ATTRIBUTE + } + #[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 AlterCollation { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -20756,6 +21015,24 @@ impl AstNode for DropAggregate { &self.syntax } } +impl AstNode for DropAttribute { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::DROP_ATTRIBUTE + } + #[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 DropCast { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26120,6 +26397,24 @@ impl AstNode for ReleaseSavepoint { &self.syntax } } +impl AstNode for RenameAttribute { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::RENAME_ATTRIBUTE + } + #[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 RenameColumn { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -26174,6 +26469,24 @@ impl AstNode for RenameTo { &self.syntax } } +impl AstNode for RenameValue { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::RENAME_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 RepeatableClause { #[inline] fn can_cast(kind: SyntaxKind) -> bool { @@ -30088,6 +30401,55 @@ impl From for AlterTableAction { AlterTableAction::ValidateConstraint(node) } } +impl AstNode for AlterTypeAction { + #[inline] + fn can_cast(kind: SyntaxKind) -> bool { + matches!( + kind, + SyntaxKind::ADD_ATTRIBUTE | SyntaxKind::ALTER_ATTRIBUTE | SyntaxKind::DROP_ATTRIBUTE + ) + } + #[inline] + fn cast(syntax: SyntaxNode) -> Option { + let res = match syntax.kind() { + SyntaxKind::ADD_ATTRIBUTE => AlterTypeAction::AddAttribute(AddAttribute { syntax }), + SyntaxKind::ALTER_ATTRIBUTE => { + AlterTypeAction::AlterAttribute(AlterAttribute { syntax }) + } + SyntaxKind::DROP_ATTRIBUTE => AlterTypeAction::DropAttribute(DropAttribute { syntax }), + _ => { + return None; + } + }; + Some(res) + } + #[inline] + fn syntax(&self) -> &SyntaxNode { + match self { + AlterTypeAction::AddAttribute(it) => &it.syntax, + AlterTypeAction::AlterAttribute(it) => &it.syntax, + AlterTypeAction::DropAttribute(it) => &it.syntax, + } + } +} +impl From for AlterTypeAction { + #[inline] + fn from(node: AddAttribute) -> AlterTypeAction { + AlterTypeAction::AddAttribute(node) + } +} +impl From for AlterTypeAction { + #[inline] + fn from(node: AlterAttribute) -> AlterTypeAction { + AlterTypeAction::AlterAttribute(node) + } +} +impl From for AlterTypeAction { + #[inline] + fn from(node: DropAttribute) -> AlterTypeAction { + AlterTypeAction::DropAttribute(node) + } +} impl AstNode for ColumnConstraint { #[inline] fn can_cast(kind: SyntaxKind) -> bool { diff --git a/crates/squawk_syntax/src/postgresql.ungram b/crates/squawk_syntax/src/postgresql.ungram index 9b616ef4..59f1157a 100644 --- a/crates/squawk_syntax/src/postgresql.ungram +++ b/crates/squawk_syntax/src/postgresql.ungram @@ -2116,6 +2116,39 @@ AlterTrigger = AlterType = 'alter' 'type' Path + ( + AlterTypeAction (',' AlterTypeAction)* + | OwnerTo + | SetSchema + | SetOptions + | RenameTo + | RenameAttribute + | RenameValue + | AddValue + ) + +RenameAttribute = + 'rename' 'attribute' NameRef 'to' Name + +RenameValue = + 'rename' 'value' Literal 'to' Literal + +AlterTypeAction = + AddAttribute +| DropAttribute +| AlterAttribute + +AddAttribute = + 'add' 'attribute' Name Type Collate? (Cascade | Restrict)? + +DropAttribute = + 'drop' 'attribute' IfExists? (Cascade | Restrict)? + +AlterAttribute = + 'alter' 'attribute' (Cascade | Restrict)? + +AddValue = + 'add' 'value' IfNotExists? Literal (('before' | 'after') Literal)? AlterUser = 'alter' 'user' RoleRef