From 0744d4fbb8a70a509610cc9eb4e5a87ce663b7a8 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 11 Nov 2026 22:55:39 +0100 Subject: [PATCH] PostgreSQL: Support `STATISTICS` members in `ALTER EXTENSION` --- fuzz/fuzz_seeds/postgres_alter_extension.sql | 1 + src/ast/ddl.rs | 3 +++ src/parser/mod.rs | 4 ++++ tests/sqlparser_postgres.rs | 2 ++ 4 files changed, 10 insertions(+) diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index 50c5de020d..f488e93162 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -23,3 +23,4 @@ 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; +ALTER EXTENSION citext DROP STATISTICS public.st; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index f6b6333222..561edf20d4 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4967,6 +4967,8 @@ pub enum AlterExtensionMember { Sequence(ObjectName), /// `SERVER object_name` Server(Ident), + /// `STATISTICS object_name` + Statistics(ObjectName), /// `TABLE object_name` Table(ObjectName), /// `TEXT SEARCH CONFIGURATION object_name` @@ -5027,6 +5029,7 @@ impl fmt::Display for AlterExtensionMember { AlterExtensionMember::Schema(name) => write!(f, "SCHEMA {name}"), AlterExtensionMember::Sequence(name) => write!(f, "SEQUENCE {name}"), AlterExtensionMember::Server(name) => write!(f, "SERVER {name}"), + AlterExtensionMember::Statistics(name) => write!(f, "STATISTICS {name}"), AlterExtensionMember::Table(name) => write!(f, "TABLE {name}"), AlterExtensionMember::TextSearchConfiguration(name) => { write!(f, "TEXT SEARCH CONFIGURATION {name}") diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 7bc1a857a2..07c1ec0427 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12591,6 +12591,10 @@ impl<'a> Parser<'a> { )) } else if self.parse_keyword(Keyword::SERVER) { Ok(AlterExtensionMember::Server(self.parse_identifier()?)) + } else if self.parse_keyword(Keyword::STATISTICS) { + Ok(AlterExtensionMember::Statistics( + self.parse_object_name(false)?, + )) } 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 618e122bec..52872f1a6d 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13547,6 +13547,7 @@ fn alter_extension_member_round_trip_forms(action: &str) { 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"), + format!("ALTER EXTENSION ext_name {action} STATISTICS stats"), 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"), @@ -13746,6 +13747,7 @@ fn parse_alter_extension_add_member() { "SCHEMA", "SEQUENCE", "SERVER", + "STATISTICS", "TABLE", "TEXT SEARCH CONFIGURATION", "TEXT SEARCH DICTIONARY",