diff --git a/fuzz/fuzz_seeds/postgres_alter_extension.sql b/fuzz/fuzz_seeds/postgres_alter_extension.sql index cd6c59b598..101135d03a 100644 --- a/fuzz/fuzz_seeds/postgres_alter_extension.sql +++ b/fuzz/fuzz_seeds/postgres_alter_extension.sql @@ -28,3 +28,4 @@ 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); +ALTER EXTENSION citext ADD ROUTINE public.r(int); diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs index a7de3fa22e..a6a8dc7f9e 100644 --- a/src/ast/ddl.rs +++ b/src/ast/ddl.rs @@ -4963,6 +4963,8 @@ pub enum AlterExtensionMember { Procedure(FunctionDesc), /// `PUBLICATION object_name` Publication(Ident), + /// `ROUTINE routine_name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ]` + Routine(FunctionDesc), /// `ROLE object_name` Role(Ident), /// `SCHEMA object_name` @@ -5035,6 +5037,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::Routine(function) => write!(f, "ROUTINE {function}"), AlterExtensionMember::Role(name) => write!(f, "ROLE {name}"), AlterExtensionMember::Schema(name) => write!(f, "SCHEMA {name}"), AlterExtensionMember::Sequence(name) => write!(f, "SEQUENCE {name}"), diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 65b1c909ab..014e4f0d32 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -12585,6 +12585,8 @@ impl<'a> Parser<'a> { 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::ROUTINE) { + Ok(AlterExtensionMember::Routine(self.parse_function_desc()?)) } else if self.parse_keyword(Keyword::ROLE) { Ok(AlterExtensionMember::Role(self.parse_identifier()?)) } else if self.parse_keyword(Keyword::SCHEMA) { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 13764e2c9c..923b33daa3 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -13550,6 +13550,8 @@ fn alter_extension_member_round_trip_forms(action: &str) { 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} ROUTINE r"), + format!("ALTER EXTENSION ext_name {action} ROUTINE r()"), 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"), @@ -13752,6 +13754,10 @@ fn parse_alter_extension_add_member() { "ALTER EXTENSION ext_name ADD PROCEDURE 1", "Expected: identifier, found: 1", ), + ( + "ALTER EXTENSION ext_name ADD ROUTINE 1", + "Expected: identifier, found: 1", + ), ] { assert_eq!( pg_and_generic().parse_sql_statements(sql).unwrap_err(),