@@ -14061,6 +14061,8 @@ impl<'a> Parser<'a> {
1406114061 Keyword::INTEGRATION,
1406214062 Keyword::USER,
1406314063 Keyword::CONNECTION,
14064+ Keyword::PROCEDURE,
14065+ Keyword::FUNCTION,
1406414066 ]);
1406514067 let objects =
1406614068 self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
@@ -14073,6 +14075,13 @@ impl<'a> Parser<'a> {
1407314075 Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
1407414076 Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
1407514077 Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
14078+ kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
14079+ if let Some(name) = objects?.first() {
14080+ self.parse_grant_procedure_or_function(name, &kw)?
14081+ } else {
14082+ self.expected("procedure or function name", self.peek_token())?
14083+ }
14084+ }
1407614085 Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
1407714086 _ => unreachable!(),
1407814087 }
@@ -14084,6 +14093,31 @@ impl<'a> Parser<'a> {
1408414093 Ok((privileges, objects))
1408514094 }
1408614095
14096+ fn parse_grant_procedure_or_function(
14097+ &mut self,
14098+ name: &ObjectName,
14099+ kw: &Option<Keyword>,
14100+ ) -> Result<Option<GrantObjects>, ParserError> {
14101+ let arg_types = if self.consume_token(&Token::LParen) {
14102+ let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
14103+ self.expect_token(&Token::RParen)?;
14104+ list
14105+ } else {
14106+ vec![]
14107+ };
14108+ match kw {
14109+ Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
14110+ name: name.clone(),
14111+ arg_types,
14112+ })),
14113+ Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
14114+ name: name.clone(),
14115+ arg_types,
14116+ })),
14117+ _ => self.expected("procedure or function keywords", self.peek_token())?,
14118+ }
14119+ }
14120+
1408714121 pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
1408814122 fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
1408914123 let columns = parser.parse_parenthesized_column_list(Optional, false)?;
0 commit comments