From 6923ebe30c6f22842597f4f46ce050562246c906 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 11 Nov 2026 22:57:32 +0100 Subject: [PATCH] PostgreSQL: Support `TABLESPACE` 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 | 2 ++ 4 files changed, 8 insertions(+) diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index 2632b41897..593de1f0f1 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -25,3 +25,4 @@ 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; +ALTER EXTENSION citext ADD TABLESPACE ts; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index 53c4085c4a..c1fe3cd604 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4973,6 +4973,8 @@ pub enum AlterExtensionMember { Subscription(Ident), /// `TABLE object_name` Table(ObjectName), + /// `TABLESPACE object_name` + TableSpace(Ident), /// `TEXT SEARCH CONFIGURATION object_name` TextSearchConfiguration(ObjectName), /// `TEXT SEARCH DICTIONARY object_name` @@ -5034,6 +5036,7 @@ impl fmt::Display for AlterExtensionMember { AlterExtensionMember::Statistics(name) => write!(f, "STATISTICS {name}"), AlterExtensionMember::Subscription(name) => write!(f, "SUBSCRIPTION {name}"), AlterExtensionMember::Table(name) => write!(f, "TABLE {name}"), + AlterExtensionMember::TableSpace(name) => write!(f, "TABLESPACE {name}"), AlterExtensionMember::TextSearchConfiguration(name) => { write!(f, "TEXT SEARCH CONFIGURATION {name}") } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 487887b8d9..19eec492a9 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12599,6 +12599,8 @@ impl<'a> Parser<'a> { 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_keyword(Keyword::TABLESPACE) { + Ok(AlterExtensionMember::TableSpace(self.parse_identifier()?)) } else if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH, Keyword::CONFIGURATION]) { Ok(AlterExtensionMember::TextSearchConfiguration( self.parse_object_name(false)?, diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 4da405bbfe..b8d2598472 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13551,6 +13551,7 @@ fn alter_extension_member_round_trip_forms(action: &str) { 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} TABLESPACE ts"), format!("ALTER EXTENSION ext_name {action} TEXT SEARCH CONFIGURATION cfg"), format!("ALTER EXTENSION ext_name {action} TEXT SEARCH DICTIONARY dict"), format!("ALTER EXTENSION ext_name {action} TEXT SEARCH PARSER pgrm"), @@ -13751,6 +13752,7 @@ fn parse_alter_extension_add_member() { "STATISTICS", "SUBSCRIPTION", "TABLE", + "TABLESPACE", "TEXT SEARCH CONFIGURATION", "TEXT SEARCH DICTIONARY", "TEXT SEARCH PARSER",