diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index ed62affe80..7c3d0680ce 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -12,3 +12,4 @@ ALTER EXTENSION citext ADD ACCESS METHOD btree; ALTER EXTENSION citext DROP EVENT TRIGGER trg; ALTER EXTENSION citext ADD FOREIGN DATA WRAPPER fdw; ALTER EXTENSION citext DROP SERVER srv; +ALTER EXTENSION citext ADD COLLATION public.coll; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index 30b1d279d9..9ca7ed2ffe 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4928,6 +4928,8 @@ pub enum AlterExtensionOperation { pub enum AlterExtensionMember { /// `ACCESS METHOD object_name` AccessMethod(Ident), + /// `COLLATION object_name` + Collation(ObjectName), /// `EVENT TRIGGER object_name` EventTrigger(Ident), /// `FOREIGN DATA WRAPPER object_name` @@ -4978,6 +4980,7 @@ impl fmt::Display for AlterExtensionMember { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { AlterExtensionMember::AccessMethod(name) => write!(f, "ACCESS METHOD {name}"), + AlterExtensionMember::Collation(name) => write!(f, "COLLATION {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 00ff617eeb..31fdf6461a 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12541,6 +12541,10 @@ impl<'a> Parser<'a> { fn parse_alter_extension_member(&mut self) -> Result { if self.parse_keywords(&[Keyword::ACCESS, Keyword::METHOD]) { Ok(AlterExtensionMember::AccessMethod(self.parse_identifier()?)) + } else if self.parse_keyword(Keyword::COLLATION) { + Ok(AlterExtensionMember::Collation( + self.parse_object_name(false)?, + )) } 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 49e28f8799..2a5db79891 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13529,6 +13529,8 @@ fn parse_case_ending_in_end_keyword_is_not_silently_dropped() { fn alter_extension_member_round_trip_forms(action: &str) { let sqls = [ format!("ALTER EXTENSION ext_name {action} ACCESS METHOD btree"), + 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} EVENT TRIGGER trg"), format!("ALTER EXTENSION ext_name {action} FOREIGN DATA WRAPPER fdw"), format!("ALTER EXTENSION ext_name {action} FOREIGN TABLE ft"), @@ -13718,6 +13720,7 @@ fn parse_alter_extension_add_member() { for member in [ "ACCESS METHOD", + "COLLATION", "EVENT TRIGGER", "FOREIGN DATA WRAPPER", "FOREIGN TABLE",