diff --git a/src/ast/mod.rs b/src/ast/mod.rs index e1646349..d8359136 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -6654,7 +6654,7 @@ pub enum Action { Replicate, ResolveAll, Role { - role: Ident, + role: ObjectName, }, Select { columns: Option>, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 058423f1..a876d90e 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -14357,7 +14357,7 @@ impl<'a> Parser<'a> { } else if self.parse_keyword(Keyword::REPLICATE) { Ok(Action::Replicate) } else if self.parse_keyword(Keyword::ROLE) { - let role = self.parse_identifier()?; + let role = self.parse_object_name(false)?; Ok(Action::Role { role }) } else if self.parse_keyword(Keyword::SELECT) { Ok(Action::Select { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 074d9eab..add54a71 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -9549,6 +9549,8 @@ fn parse_grant() { verified_stmt("GRANT SELECT ON FUTURE SEQUENCES IN SCHEMA db1.sc1 TO ROLE role1"); verified_stmt("GRANT USAGE ON PROCEDURE db1.sc1.foo(INT) TO ROLE role1"); 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"); } #[test] diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index a7a63315..daa711d4 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -4500,4 +4500,7 @@ fn test_snowflake_identifier_function() { .is_err(), true ); + + snowflake().verified_stmt("GRANT ROLE IDENTIFIER('AAA') TO USER IDENTIFIER('AAA')"); + snowflake().verified_stmt("REVOKE ROLE IDENTIFIER('AAA') FROM USER IDENTIFIER('AAA')"); }