@@ -583,6 +583,10 @@ impl<'a> Parser<'a> {
583583 Keyword::SHOW => self.parse_show(),
584584 Keyword::USE => self.parse_use(),
585585 Keyword::GRANT => self.parse_grant(),
586+ Keyword::DENY => {
587+ self.prev_token();
588+ self.parse_deny()
589+ }
586590 Keyword::REVOKE => self.parse_revoke(),
587591 Keyword::START => self.parse_start_transaction(),
588592 Keyword::BEGIN => self.parse_begin(),
@@ -13381,23 +13385,32 @@ impl<'a> Parser<'a> {
1338113385
1338213386 /// Parse a GRANT statement.
1338313387 pub fn parse_grant(&mut self) -> Result<Statement, ParserError> {
13384- let (privileges, objects) = self.parse_grant_revoke_privileges_objects ()?;
13388+ let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects ()?;
1338513389
1338613390 self.expect_keyword_is(Keyword::TO)?;
1338713391 let grantees = self.parse_grantees()?;
1338813392
1338913393 let with_grant_option =
1339013394 self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
1339113395
13392- let granted_by = self
13393- .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
13394- .then(|| self.parse_identifier().unwrap());
13396+ let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
13397+ Some(self.parse_identifier()?)
13398+ } else {
13399+ None
13400+ };
13401+
13402+ let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
13403+ Some(self.parse_identifier()?)
13404+ } else {
13405+ None
13406+ };
1339513407
1339613408 Ok(Statement::Grant {
1339713409 privileges,
1339813410 objects,
1339913411 grantees,
1340013412 with_grant_option,
13413+ as_grantor,
1340113414 granted_by,
1340213415 })
1340313416 }
@@ -13406,7 +13419,7 @@ impl<'a> Parser<'a> {
1340613419 let mut values = vec![];
1340713420 let mut grantee_type = GranteesType::None;
1340813421 loop {
13409- grantee_type = if self.parse_keyword(Keyword::ROLE) {
13422+ let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
1341013423 GranteesType::Role
1341113424 } else if self.parse_keyword(Keyword::USER) {
1341213425 GranteesType::User
@@ -13423,9 +13436,19 @@ impl<'a> Parser<'a> {
1342313436 } else if self.parse_keyword(Keyword::APPLICATION) {
1342413437 GranteesType::Application
1342513438 } else {
13426- grantee_type // keep from previous iteraton, if not specified
13439+ grantee_type.clone() // keep from previous iteraton, if not specified
1342713440 };
1342813441
13442+ if self
13443+ .dialect
13444+ .get_reserved_grantees_types()
13445+ .contains(&new_grantee_type)
13446+ {
13447+ self.prev_token();
13448+ } else {
13449+ grantee_type = new_grantee_type;
13450+ }
13451+
1342913452 let grantee = if grantee_type == GranteesType::Public {
1343013453 Grantee {
1343113454 grantee_type: grantee_type.clone(),
@@ -13460,7 +13483,7 @@ impl<'a> Parser<'a> {
1346013483 Ok(values)
1346113484 }
1346213485
13463- pub fn parse_grant_revoke_privileges_objects (
13486+ pub fn parse_grant_deny_revoke_privileges_objects (
1346413487 &mut self,
1346513488 ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
1346613489 let privileges = if self.parse_keyword(Keyword::ALL) {
@@ -13510,7 +13533,6 @@ impl<'a> Parser<'a> {
1351013533 let object_type = self.parse_one_of_keywords(&[
1351113534 Keyword::SEQUENCE,
1351213535 Keyword::DATABASE,
13513- Keyword::DATABASE,
1351413536 Keyword::SCHEMA,
1351513537 Keyword::TABLE,
1351613538 Keyword::VIEW,
@@ -13605,6 +13627,9 @@ impl<'a> Parser<'a> {
1360513627 Ok(Action::Create { obj_type })
1360613628 } else if self.parse_keyword(Keyword::DELETE) {
1360713629 Ok(Action::Delete)
13630+ } else if self.parse_keyword(Keyword::EXEC) {
13631+ let obj_type = self.maybe_parse_action_execute_obj_type();
13632+ Ok(Action::Exec { obj_type })
1360813633 } else if self.parse_keyword(Keyword::EXECUTE) {
1360913634 let obj_type = self.maybe_parse_action_execute_obj_type();
1361013635 Ok(Action::Execute { obj_type })
@@ -13803,16 +13828,51 @@ impl<'a> Parser<'a> {
1380313828 }
1380413829 }
1380513830
13831+ /// Parse [`Statement::Deny`]
13832+ pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
13833+ self.expect_keyword(Keyword::DENY)?;
13834+
13835+ let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
13836+ let objects = match objects {
13837+ Some(o) => o,
13838+ None => {
13839+ return parser_err!(
13840+ "DENY statements must specify an object",
13841+ self.peek_token().span.start
13842+ )
13843+ }
13844+ };
13845+
13846+ self.expect_keyword_is(Keyword::TO)?;
13847+ let grantees = self.parse_grantees()?;
13848+ let cascade = self.parse_cascade_option();
13849+ let granted_by = if self.parse_keywords(&[Keyword::AS]) {
13850+ Some(self.parse_identifier()?)
13851+ } else {
13852+ None
13853+ };
13854+
13855+ Ok(Statement::Deny(DenyStatement {
13856+ privileges,
13857+ objects,
13858+ grantees,
13859+ cascade,
13860+ granted_by,
13861+ }))
13862+ }
13863+
1380613864 /// Parse a REVOKE statement
1380713865 pub fn parse_revoke(&mut self) -> Result<Statement, ParserError> {
13808- let (privileges, objects) = self.parse_grant_revoke_privileges_objects ()?;
13866+ let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects ()?;
1380913867
1381013868 self.expect_keyword_is(Keyword::FROM)?;
1381113869 let grantees = self.parse_grantees()?;
1381213870
13813- let granted_by = self
13814- .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
13815- .then(|| self.parse_identifier().unwrap());
13871+ let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
13872+ Some(self.parse_identifier()?)
13873+ } else {
13874+ None
13875+ };
1381613876
1381713877 let cascade = self.parse_cascade_option();
1381813878
0 commit comments