From ce23b1d660e89dc88fe0b16590b2afb750ff1c4e Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 11 Nov 2026 23:09:34 +0100 Subject: [PATCH] PostgreSQL: Support `TYPE` members in `ALTER EXTENSION` --- fuzz/fuzz_seeds/postgres_alter_extension.sql | 1 + src/ast/ddl.rs | 3 +++ src/parser/mod.rs | 2 ++ tests/sqlparser_postgres.rs | 5 +++++ 4 files changed, 11 insertions(+) diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index 789d62a20c..94794655bc 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -36,3 +36,4 @@ ALTER EXTENSION citext DROP OPERATOR CLASS oc USING btree; ALTER EXTENSION citext DROP OPERATOR FAMILY of USING btree; ALTER EXTENSION citext ADD CAST (int AS text); ALTER EXTENSION citext ADD TRANSFORM FOR int LANGUAGE plpgsql; +ALTER EXTENSION citext DROP TYPE public.ty; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index ed94e4320b..75ce3c306d 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -5021,6 +5021,8 @@ pub enum AlterExtensionMember { /// Language name. language: Ident, }, + /// `TYPE object_name` + Type(DataType), /// `VIEW object_name` View(ObjectName), } @@ -5104,6 +5106,7 @@ impl fmt::Display for AlterExtensionMember { type_name, language, } => write!(f, "TRANSFORM FOR {type_name} LANGUAGE {language}"), + AlterExtensionMember::Type(data_type) => write!(f, "TYPE {data_type}"), AlterExtensionMember::View(name) => write!(f, "VIEW {name}"), } } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index d058fac244..78a5e5815d 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12652,6 +12652,8 @@ impl<'a> Parser<'a> { type_name, language, }) + } else if self.parse_keyword(Keyword::TYPE) { + Ok(AlterExtensionMember::Type(self.parse_data_type()?)) } else if self.parse_keyword(Keyword::VIEW) { Ok(AlterExtensionMember::View(self.parse_object_name(false)?)) } else { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index c9b9bc27f8..b813de3ccf 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13584,6 +13584,7 @@ fn alter_extension_member_round_trip_forms(action: &str) { format!("ALTER EXTENSION ext_name {action} TEXT SEARCH PARSER pgrm"), format!("ALTER EXTENSION ext_name {action} TEXT SEARCH TEMPLATE tpl"), format!("ALTER EXTENSION ext_name {action} TRANSFORM FOR my_type LANGUAGE plpgsql"), + format!("ALTER EXTENSION ext_name {action} TYPE my_type"), format!("ALTER EXTENSION ext_name {action} VIEW v"), ]; for sql in sqls { @@ -13911,6 +13912,10 @@ fn parse_alter_extension_add_member() { "ALTER EXTENSION ext_name ADD TRANSFORM FOR my_type LANGUAGE", "Expected: identifier, found: EOF", ), + ( + "ALTER EXTENSION ext_name ADD TYPE", + "Expected: a data type name, found: EOF", + ), ] { assert_eq!( pg_and_generic().parse_sql_statements(sql).unwrap_err(),