@@ -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,7 +13385,7 @@ 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()?;
@@ -13460,7 +13464,7 @@ impl<'a> Parser<'a> {
1346013464 Ok(values)
1346113465 }
1346213466
13463- pub fn parse_grant_revoke_privileges_objects (
13467+ pub fn parse_grant_deny_revoke_privileges_objects (
1346413468 &mut self,
1346513469 ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
1346613470 let privileges = if self.parse_keyword(Keyword::ALL) {
@@ -13510,7 +13514,6 @@ impl<'a> Parser<'a> {
1351013514 let object_type = self.parse_one_of_keywords(&[
1351113515 Keyword::SEQUENCE,
1351213516 Keyword::DATABASE,
13513- Keyword::DATABASE,
1351413517 Keyword::SCHEMA,
1351513518 Keyword::TABLE,
1351613519 Keyword::VIEW,
@@ -13803,9 +13806,40 @@ impl<'a> Parser<'a> {
1380313806 }
1380413807 }
1380513808
13809+ /// Parse [`Statement::Deny`]
13810+ pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
13811+ self.expect_keyword(Keyword::DENY)?;
13812+
13813+ let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
13814+ let objects = match objects {
13815+ Some(o) => o,
13816+ None => {
13817+ return parser_err!(
13818+ "DENY statements must specify an object",
13819+ self.peek_token().span.start
13820+ )
13821+ }
13822+ };
13823+
13824+ self.expect_keyword_is(Keyword::TO)?;
13825+ let grantees = self.parse_grantees()?;
13826+ let cascade = self.parse_cascade_option();
13827+ let granted_by = self
13828+ .parse_keywords(&[Keyword::AS])
13829+ .then(|| self.parse_identifier().unwrap());
13830+
13831+ Ok(Statement::Deny(DenyStatement {
13832+ privileges,
13833+ objects,
13834+ grantees,
13835+ cascade,
13836+ granted_by,
13837+ }))
13838+ }
13839+
1380613840 /// Parse a REVOKE statement
1380713841 pub fn parse_revoke(&mut self) -> Result<Statement, ParserError> {
13808- let (privileges, objects) = self.parse_grant_revoke_privileges_objects ()?;
13842+ let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects ()?;
1380913843
1381013844 self.expect_keyword_is(Keyword::FROM)?;
1381113845 let grantees = self.parse_grantees()?;
0 commit comments