diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index 1b8532c1de..44eb414408 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -18,3 +18,4 @@ ALTER EXTENSION citext ADD TEXT SEARCH CONFIGURATION public.cfg; ALTER EXTENSION citext ADD TEXT SEARCH DICTIONARY public.dict; ALTER EXTENSION citext DROP TEXT SEARCH PARSER public.pgrm; ALTER EXTENSION citext ADD TEXT SEARCH TEMPLATE public.tpl; +ALTER EXTENSION citext DROP DATABASE db_name; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index 72f233b936..d46b877d91 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4922,6 +4922,10 @@ pub enum AlterExtensionOperation { } /// Member objects that can be added to or removed from an extension. +/// +/// `ADD` and `DROP` also accept `DATABASE`, `ROLE`, `SUBSCRIPTION`, `TABLESPACE`, +/// `PUBLICATION`, `EXTENSION`, `INDEX`, and `STATISTICS` member objects, which +/// PostgreSQL rejects with a semantic error. #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] @@ -4932,6 +4936,8 @@ pub enum AlterExtensionMember { Collation(ObjectName), /// `CONVERSION object_name` Conversion(ObjectName), + /// `DATABASE object_name` + Database(Ident), /// `EVENT TRIGGER object_name` EventTrigger(Ident), /// `FOREIGN DATA WRAPPER object_name` @@ -4992,6 +4998,7 @@ impl fmt::Display for AlterExtensionMember { AlterExtensionMember::AccessMethod(name) => write!(f, "ACCESS METHOD {name}"), AlterExtensionMember::Collation(name) => write!(f, "COLLATION {name}"), AlterExtensionMember::Conversion(name) => write!(f, "CONVERSION {name}"), + AlterExtensionMember::Database(name) => write!(f, "DATABASE {name}"), AlterExtensionMember::EventTrigger(name) => write!(f, "EVENT TRIGGER {name}"), AlterExtensionMember::ForeignDataWrapper(name) => { write!(f, "FOREIGN DATA WRAPPER {name}") diff --git a/src/parser/mod.rs b/src/parser/mod.rs index fa65140131..5d24eedb5d 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12549,6 +12549,8 @@ impl<'a> Parser<'a> { Ok(AlterExtensionMember::Conversion( self.parse_object_name(false)?, )) + } else if self.parse_keyword(Keyword::DATABASE) { + Ok(AlterExtensionMember::Database(self.parse_identifier()?)) } else if self.parse_keywords(&[Keyword::EVENT, Keyword::TRIGGER]) { Ok(AlterExtensionMember::EventTrigger(self.parse_identifier()?)) } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER]) { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index f1a52892c1..4ac59bd631 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13532,6 +13532,7 @@ fn alter_extension_member_round_trip_forms(action: &str) { format!("ALTER EXTENSION ext_name {action} COLLATION en_US"), format!("ALTER EXTENSION ext_name {action} COLLATION schema.en_US"), format!("ALTER EXTENSION ext_name {action} CONVERSION conv"), + format!("ALTER EXTENSION ext_name {action} DATABASE db_name"), format!("ALTER EXTENSION ext_name {action} EVENT TRIGGER trg"), format!("ALTER EXTENSION ext_name {action} FOREIGN DATA WRAPPER fdw"), format!("ALTER EXTENSION ext_name {action} FOREIGN TABLE ft"), @@ -13727,6 +13728,7 @@ fn parse_alter_extension_add_member() { "ACCESS METHOD", "COLLATION", "CONVERSION", + "DATABASE", "EVENT TRIGGER", "FOREIGN DATA WRAPPER", "FOREIGN TABLE",