From 6546e5564542769185203f5f3d49f1aa1c17b30e Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 11 Nov 2026 23:00:41 +0100 Subject: [PATCH] PostgreSQL: Support `PROCEDURE` 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 | 7 +++++++ 4 files changed, 13 insertions(+) diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index 596c32be97..cd6c59b598 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -27,3 +27,4 @@ ALTER EXTENSION citext DROP STATISTICS public.st; ALTER EXTENSION citext DROP SUBSCRIPTION sub; ALTER EXTENSION citext ADD TABLESPACE ts; ALTER EXTENSION citext ADD FUNCTION public.f(IN a int, text); +ALTER EXTENSION citext DROP PROCEDURE public.p(int); diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index 830d7a8769..a7de3fa22e 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4959,6 +4959,8 @@ pub enum AlterExtensionMember { }, /// `MATERIALIZED VIEW object_name` MaterializedView(ObjectName), + /// `PROCEDURE procedure_name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]` + Procedure(FunctionDesc), /// `PUBLICATION object_name` Publication(Ident), /// `ROLE object_name` @@ -5031,6 +5033,7 @@ impl fmt::Display for AlterExtensionMember { } } AlterExtensionMember::MaterializedView(name) => write!(f, "MATERIALIZED VIEW {name}"), + AlterExtensionMember::Procedure(function) => write!(f, "PROCEDURE {function}"), AlterExtensionMember::Publication(name) => write!(f, "PUBLICATION {name}"), AlterExtensionMember::Role(name) => write!(f, "ROLE {name}"), AlterExtensionMember::Schema(name) => write!(f, "SCHEMA {name}"), diff --git a/src/parser/mod.rs b/src/parser/mod.rs index f321d18457..65b1c909ab 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12581,6 +12581,8 @@ impl<'a> Parser<'a> { Ok(AlterExtensionMember::MaterializedView( self.parse_object_name(false)?, )) + } else if self.parse_keyword(Keyword::PROCEDURE) { + Ok(AlterExtensionMember::Procedure(self.parse_function_desc()?)) } else if self.parse_keyword(Keyword::PUBLICATION) { Ok(AlterExtensionMember::Publication(self.parse_identifier()?)) } else if self.parse_keyword(Keyword::ROLE) { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index c91c42cd90..13764e2c9c 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13546,6 +13546,9 @@ fn alter_extension_member_round_trip_forms(action: &str) { format!("ALTER EXTENSION ext_name {action} LANGUAGE plpgsql"), format!("ALTER EXTENSION ext_name {action} PROCEDURAL LANGUAGE plpgsql"), format!("ALTER EXTENSION ext_name {action} MATERIALIZED VIEW mv"), + format!("ALTER EXTENSION ext_name {action} PROCEDURE p"), + format!("ALTER EXTENSION ext_name {action} PROCEDURE p()"), + format!("ALTER EXTENSION ext_name {action} PROCEDURE p(INT)"), format!("ALTER EXTENSION ext_name {action} PUBLICATION pub"), format!("ALTER EXTENSION ext_name {action} ROLE role_name"), format!("ALTER EXTENSION ext_name {action} SCHEMA schema_name"), @@ -13745,6 +13748,10 @@ fn parse_alter_extension_add_member() { "ALTER EXTENSION ext_name ADD FUNCTION 1", "Expected: identifier, found: 1", ), + ( + "ALTER EXTENSION ext_name ADD PROCEDURE 1", + "Expected: identifier, found: 1", + ), ] { assert_eq!( pg_and_generic().parse_sql_statements(sql).unwrap_err(),