From 77be0ea36bb1834f43f40602a5e14446207bc714 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 11 Nov 2026 22:38:24 +0100 Subject: [PATCH] PostgreSQL: Support `SCHEMA` 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 | 6 ++++++ 4 files changed, 12 insertions(+) diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index 8012f233a3..b26abe129e 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -6,3 +6,4 @@ ALTER EXTENSION citext DROP VIEW public.v; ALTER EXTENSION citext ADD MATERIALIZED VIEW public.mv; ALTER EXTENSION citext DROP FOREIGN TABLE public.ft; ALTER EXTENSION citext ADD SEQUENCE public.seq; +ALTER EXTENSION citext DROP SCHEMA other; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index 2d400597f3..784490dee7 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4930,6 +4930,8 @@ pub enum AlterExtensionMember { ForeignTable(ObjectName), /// `MATERIALIZED VIEW object_name` MaterializedView(ObjectName), + /// `SCHEMA object_name` + Schema(Ident), /// `SEQUENCE object_name` Sequence(ObjectName), /// `TABLE object_name` @@ -4962,6 +4964,7 @@ impl fmt::Display for AlterExtensionMember { match self { AlterExtensionMember::ForeignTable(name) => write!(f, "FOREIGN TABLE {name}"), AlterExtensionMember::MaterializedView(name) => write!(f, "MATERIALIZED VIEW {name}"), + AlterExtensionMember::Schema(name) => write!(f, "SCHEMA {name}"), AlterExtensionMember::Sequence(name) => write!(f, "SEQUENCE {name}"), AlterExtensionMember::Table(name) => write!(f, "TABLE {name}"), AlterExtensionMember::View(name) => write!(f, "VIEW {name}"), diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ae58ce6e9b..9720dc1661 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12547,6 +12547,8 @@ impl<'a> Parser<'a> { Ok(AlterExtensionMember::MaterializedView( self.parse_object_name(false)?, )) + } else if self.parse_keyword(Keyword::SCHEMA) { + Ok(AlterExtensionMember::Schema(self.parse_identifier()?)) } else if self.parse_keyword(Keyword::SEQUENCE) { Ok(AlterExtensionMember::Sequence( self.parse_object_name(false)?, diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 3e2c6f3129..ef4f9ff253 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13531,6 +13531,7 @@ fn alter_extension_member_round_trip_forms(action: &str) { format!("ALTER EXTENSION ext_name {action} FOREIGN TABLE ft"), format!("ALTER EXTENSION ext_name {action} FOREIGN TABLE schema.ft"), format!("ALTER EXTENSION ext_name {action} MATERIALIZED VIEW mv"), + format!("ALTER EXTENSION ext_name {action} SCHEMA schema_name"), format!("ALTER EXTENSION ext_name {action} SEQUENCE seq"), format!("ALTER EXTENSION ext_name {action} TABLE t"), format!("ALTER EXTENSION ext_name {action} TABLE schema.t"), @@ -13671,6 +13672,10 @@ fn parse_alter_extension_add_member() { "ALTER EXTENSION ext_name ADD FOO bar", "Expected: member object type after ADD or DROP, found: FOO", ), + ( + "ALTER EXTENSION ext_name ADD SCHEMA a.b", + "Expected: end of statement, found: .", + ), ] { assert_eq!( pg_and_generic().parse_sql_statements(sql).unwrap_err(), @@ -13682,6 +13687,7 @@ fn parse_alter_extension_add_member() { for member in [ "FOREIGN TABLE", "MATERIALIZED VIEW", + "SCHEMA", "SEQUENCE", "TABLE", "VIEW",