From 9b76f712aa42756d52b398d59bc3f1bbfbc3de0e Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 11 Nov 2026 22:54:45 +0100 Subject: [PATCH] PostgreSQL: Support `ROLE` 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 dcc5b31d7f..50c5de020d 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -22,3 +22,4 @@ ALTER EXTENSION citext DROP DATABASE db_name; ALTER EXTENSION citext ADD EXTENSION other_ext; ALTER EXTENSION citext DROP INDEX public.idx; ALTER EXTENSION citext ADD PUBLICATION pub; +ALTER EXTENSION citext ADD ROLE role_name; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index b9150c566d..f6b6333222 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4959,6 +4959,8 @@ pub enum AlterExtensionMember { MaterializedView(ObjectName), /// `PUBLICATION object_name` Publication(Ident), + /// `ROLE object_name` + Role(Ident), /// `SCHEMA object_name` Schema(Ident), /// `SEQUENCE object_name` @@ -5021,6 +5023,7 @@ impl fmt::Display for AlterExtensionMember { } AlterExtensionMember::MaterializedView(name) => write!(f, "MATERIALIZED VIEW {name}"), AlterExtensionMember::Publication(name) => write!(f, "PUBLICATION {name}"), + AlterExtensionMember::Role(name) => write!(f, "ROLE {name}"), AlterExtensionMember::Schema(name) => write!(f, "SCHEMA {name}"), AlterExtensionMember::Sequence(name) => write!(f, "SEQUENCE {name}"), AlterExtensionMember::Server(name) => write!(f, "SERVER {name}"), diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 8a7e5e824a..7bc1a857a2 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12581,6 +12581,8 @@ impl<'a> Parser<'a> { )) } else if self.parse_keyword(Keyword::PUBLICATION) { Ok(AlterExtensionMember::Publication(self.parse_identifier()?)) + } else if self.parse_keyword(Keyword::ROLE) { + Ok(AlterExtensionMember::Role(self.parse_identifier()?)) } else if self.parse_keyword(Keyword::SCHEMA) { Ok(AlterExtensionMember::Schema(self.parse_identifier()?)) } else if self.parse_keyword(Keyword::SEQUENCE) { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index a3dd1a78b3..618e122bec 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13543,6 +13543,7 @@ fn alter_extension_member_round_trip_forms(action: &str) { format!("ALTER EXTENSION ext_name {action} PROCEDURAL LANGUAGE plpgsql"), format!("ALTER EXTENSION ext_name {action} MATERIALIZED VIEW mv"), 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"), format!("ALTER EXTENSION ext_name {action} SEQUENCE seq"), format!("ALTER EXTENSION ext_name {action} SERVER srv"), @@ -13741,6 +13742,7 @@ fn parse_alter_extension_add_member() { "MATERIALIZED VIEW", "PROCEDURAL LANGUAGE", "PUBLICATION", + "ROLE", "SCHEMA", "SEQUENCE", "SERVER",