From 9ea0325749913093a907a78dbba8c739fc42a697 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Wed, 11 Nov 2026 22:49:50 +0100 Subject: [PATCH] PostgreSQL: Support `TEXT SEARCH TEMPLATE` members in `ALTER EXTENSION` --- fuzz/fuzz_seeds/postgres_alter_extension.sql | 1 + src/ast/ddl.rs | 5 +++++ src/parser/mod.rs | 4 ++++ tests/sqlparser_postgres.rs | 2 ++ 4 files changed, 12 insertions(+) diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index 82276d2e49..1b8532c1de 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -17,3 +17,4 @@ ALTER EXTENSION citext DROP CONVERSION public.conv; ALTER EXTENSION citext ADD TEXT SEARCH CONFIGURATION public.cfg; ALTER EXTENSION citext ADD TEXT SEARCH DICTIONARY public.dict; ALTER EXTENSION citext DROP TEXT SEARCH PARSER public.pgrm; +ALTER EXTENSION citext ADD TEXT SEARCH TEMPLATE public.tpl; diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index bbe8880b73..72f233b936 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4961,6 +4961,8 @@ pub enum AlterExtensionMember { TextSearchDictionary(ObjectName), /// `TEXT SEARCH PARSER object_name` TextSearchParser(ObjectName), + /// `TEXT SEARCH TEMPLATE object_name` + TextSearchTemplate(ObjectName), /// `VIEW object_name` View(ObjectName), } @@ -5014,6 +5016,9 @@ impl fmt::Display for AlterExtensionMember { write!(f, "TEXT SEARCH DICTIONARY {name}") } AlterExtensionMember::TextSearchParser(name) => write!(f, "TEXT SEARCH PARSER {name}"), + AlterExtensionMember::TextSearchTemplate(name) => { + write!(f, "TEXT SEARCH TEMPLATE {name}") + } AlterExtensionMember::View(name) => write!(f, "VIEW {name}"), } } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 3ac5adb95b..9adf373585 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12595,6 +12595,10 @@ impl<'a> Parser<'a> { Ok(AlterExtensionMember::TextSearchParser( self.parse_object_name(false)?, )) + } else if self.parse_keywords(&[Keyword::TEXT, Keyword::SEARCH, Keyword::TEMPLATE]) { + Ok(AlterExtensionMember::TextSearchTemplate( + self.parse_object_name(false)?, + )) } else if self.parse_keyword(Keyword::VIEW) { Ok(AlterExtensionMember::View(self.parse_object_name(false)?)) } else { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 617cec1ae4..f1a52892c1 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} TEXT SEARCH CONFIGURATION cfg"), format!("ALTER EXTENSION ext_name {action} TEXT SEARCH DICTIONARY dict"), format!("ALTER EXTENSION ext_name {action} TEXT SEARCH PARSER pgrm"), + format!("ALTER EXTENSION ext_name {action} TEXT SEARCH TEMPLATE tpl"), format!("ALTER EXTENSION ext_name {action} VIEW v"), ]; for sql in sqls { @@ -13739,6 +13740,7 @@ fn parse_alter_extension_add_member() { "TEXT SEARCH CONFIGURATION", "TEXT SEARCH DICTIONARY", "TEXT SEARCH PARSER", + "TEXT SEARCH TEMPLATE", "VIEW", ] { let sql = format!("ALTER EXTENSION ext_name ADD {member}");