From 9b82f5e81e11fcf02435a6b85523cf3ae42265cb Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 11 Nov 2026 22:56:30 +0100 Subject: [PATCH] PostgreSQL: Support `SUBSCRIPTION` members in `ALTER EXTENSION` --- fuzz/fuzz_seeds/postgres_alter_extension.sql | 1 + src/ast/ddl.rs | 3 +++ src/keywords.rs | 1 + src/parser/mod.rs | 2 ++ tests/sqlparser_postgres.rs | 2 ++ 5 files changed, 9 insertions(+) diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index f488e93162..2632b41897 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -24,3 +24,4 @@ ALTER EXTENSION citext DROP INDEX public.idx; ALTER EXTENSION citext ADD PUBLICATION pub; ALTER EXTENSION citext ADD ROLE role_name; ALTER EXTENSION citext DROP STATISTICS public.st; +ALTER EXTENSION citext DROP SUBSCRIPTION sub; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index 561edf20d4..53c4085c4a 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4969,6 +4969,8 @@ pub enum AlterExtensionMember { Server(Ident), /// `STATISTICS object_name` Statistics(ObjectName), + /// `SUBSCRIPTION object_name` + Subscription(Ident), /// `TABLE object_name` Table(ObjectName), /// `TEXT SEARCH CONFIGURATION object_name` @@ -5030,6 +5032,7 @@ impl fmt::Display for AlterExtensionMember { AlterExtensionMember::Sequence(name) => write!(f, "SEQUENCE {name}"), AlterExtensionMember::Server(name) => write!(f, "SERVER {name}"), AlterExtensionMember::Statistics(name) => write!(f, "STATISTICS {name}"), + AlterExtensionMember::Subscription(name) => write!(f, "SUBSCRIPTION {name}"), AlterExtensionMember::Table(name) => write!(f, "TABLE {name}"), AlterExtensionMember::TextSearchConfiguration(name) => { write!(f, "TEXT SEARCH CONFIGURATION {name}") diff --git a/src/keywords.rs b/src/keywords.rs index 9e6cf5562b..3dfc04f476 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -1056,6 +1056,7 @@ define_keywords!( STYPE, SUBMULTISET, SUBSCRIPT, + SUBSCRIPTION, SUBSTR, SUBSTRING, SUBSTRING_REGEX, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 07c1ec0427..487887b8d9 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12595,6 +12595,8 @@ impl<'a> Parser<'a> { Ok(AlterExtensionMember::Statistics( self.parse_object_name(false)?, )) + } else if self.parse_keyword(Keyword::SUBSCRIPTION) { + Ok(AlterExtensionMember::Subscription(self.parse_identifier()?)) } else if self.parse_keyword(Keyword::TABLE) { Ok(AlterExtensionMember::Table(self.parse_object_name(false)?)) } else if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH, Keyword::CONFIGURATION]) { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 52872f1a6d..4da405bbfe 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13548,6 +13548,7 @@ fn alter_extension_member_round_trip_forms(action: &str) { format!("ALTER EXTENSION ext_name {action} SEQUENCE seq"), format!("ALTER EXTENSION ext_name {action} SERVER srv"), format!("ALTER EXTENSION ext_name {action} STATISTICS stats"), + format!("ALTER EXTENSION ext_name {action} SUBSCRIPTION sub"), format!("ALTER EXTENSION ext_name {action} TABLE t"), format!("ALTER EXTENSION ext_name {action} TABLE schema.t"), format!("ALTER EXTENSION ext_name {action} TEXT SEARCH CONFIGURATION cfg"), @@ -13748,6 +13749,7 @@ fn parse_alter_extension_add_member() { "SEQUENCE", "SERVER", "STATISTICS", + "SUBSCRIPTION", "TABLE", "TEXT SEARCH CONFIGURATION", "TEXT SEARCH DICTIONARY",