diff --git a/src/ast/mod.rs b/src/ast/mod.rs index d83591364..18c80aa01 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -6771,6 +6771,7 @@ pub enum ActionCreateObjectType { OrganiationListing, ReplicationGroup, Role, + Schema, Share, User, Warehouse, @@ -6792,6 +6793,7 @@ impl fmt::Display for ActionCreateObjectType { ActionCreateObjectType::OrganiationListing => write!(f, "ORGANIZATION LISTING"), ActionCreateObjectType::ReplicationGroup => write!(f, "REPLICATION GROUP"), ActionCreateObjectType::Role => write!(f, "ROLE"), + ActionCreateObjectType::Schema => write!(f, "SCHEMA"), ActionCreateObjectType::Share => write!(f, "SHARE"), ActionCreateObjectType::User => write!(f, "USER"), ActionCreateObjectType::Warehouse => write!(f, "WAREHOUSE"), @@ -7029,6 +7031,8 @@ pub enum GrantObjects { AllMaterializedViewsInSchema { schemas: Vec }, /// Grant privileges on `ALL EXTERNAL TABLES IN SCHEMA [, ...]` AllExternalTablesInSchema { schemas: Vec }, + /// Grant privileges on `ALL FUNCTIONS IN SCHEMA [, ...]` + AllFunctionsInSchema { schemas: Vec }, /// Grant privileges on `FUTURE SCHEMAS IN DATABASE [, ...]` FutureSchemasInDatabase { databases: Vec }, /// Grant privileges on `FUTURE TABLES IN SCHEMA [, ...]` @@ -7149,6 +7153,13 @@ impl fmt::Display for GrantObjects { display_comma_separated(schemas) ) } + GrantObjects::AllFunctionsInSchema { schemas } => { + write!( + f, + "ALL FUNCTIONS IN SCHEMA {}", + display_comma_separated(schemas) + ) + } GrantObjects::FutureSchemasInDatabase { databases } => { write!( f, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index a876d90e5..bf0380a9d 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -14108,6 +14108,15 @@ impl<'a> Parser<'a> { Some(GrantObjects::AllMaterializedViewsInSchema { schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?, }) + } else if self.parse_keywords(&[ + Keyword::ALL, + Keyword::FUNCTIONS, + Keyword::IN, + Keyword::SCHEMA, + ]) { + Some(GrantObjects::AllFunctionsInSchema { + schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?, + }) } else if self.parse_keywords(&[ Keyword::FUTURE, Keyword::SCHEMAS, @@ -14414,6 +14423,8 @@ impl<'a> Parser<'a> { Some(ActionCreateObjectType::Integration) } else if self.parse_keyword(Keyword::ROLE) { Some(ActionCreateObjectType::Role) + } else if self.parse_keyword(Keyword::SCHEMA) { + Some(ActionCreateObjectType::Schema) } else if self.parse_keyword(Keyword::SHARE) { Some(ActionCreateObjectType::Share) } else if self.parse_keyword(Keyword::USER) { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index add54a71a..3a14028f0 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -9528,6 +9528,7 @@ fn parse_grant() { verified_stmt("GRANT SELECT ON ALL VIEWS IN SCHEMA db1.sc1 TO ROLE role1"); verified_stmt("GRANT SELECT ON ALL MATERIALIZED VIEWS IN SCHEMA db1.sc1 TO ROLE role1"); verified_stmt("GRANT SELECT ON ALL EXTERNAL TABLES IN SCHEMA db1.sc1 TO ROLE role1"); + verified_stmt("GRANT USAGE ON ALL FUNCTIONS IN SCHEMA db1.sc1 TO ROLE role1"); verified_stmt("GRANT USAGE ON SCHEMA sc1 TO a:b"); verified_stmt("GRANT USAGE ON SCHEMA sc1 TO GROUP group1"); verified_stmt("GRANT OWNERSHIP ON ALL TABLES IN SCHEMA DEV_STAS_ROGOZHIN TO ROLE ANALYST"); @@ -9551,6 +9552,7 @@ fn parse_grant() { verified_stmt("GRANT USAGE ON FUNCTION db1.sc1.foo(INT) TO ROLE role1"); verified_stmt("GRANT ROLE role1 TO ROLE role2"); verified_stmt("GRANT ROLE role1 TO USER user"); + verified_stmt("GRANT CREATE SCHEMA ON DATABASE db1 TO ROLE role1"); } #[test]