@@ -14029,6 +14029,8 @@ impl<'a> Parser<'a> {
1402914029 Keyword::INTEGRATION,
1403014030 Keyword::USER,
1403114031 Keyword::CONNECTION,
14032+ Keyword::PROCEDURE,
14033+ Keyword::FUNCTION,
1403214034 ]);
1403314035 let objects =
1403414036 self.parse_comma_separated(|p| p.parse_object_name_with_wildcards(false, true));
@@ -14041,6 +14043,13 @@ impl<'a> Parser<'a> {
1404114043 Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
1404214044 Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
1404314045 Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
14046+ kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
14047+ if let Some(name) = objects?.first() {
14048+ self.parse_grant_procedure_or_function(name, &kw)?
14049+ } else {
14050+ self.expected("procedure or function name", self.peek_token())?
14051+ }
14052+ }
1404414053 Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
1404514054 _ => unreachable!(),
1404614055 }
@@ -14052,6 +14061,31 @@ impl<'a> Parser<'a> {
1405214061 Ok((privileges, objects))
1405314062 }
1405414063
14064+ fn parse_grant_procedure_or_function(
14065+ &mut self,
14066+ name: &ObjectName,
14067+ kw: &Option<Keyword>,
14068+ ) -> Result<Option<GrantObjects>, ParserError> {
14069+ let arg_types = if self.consume_token(&Token::LParen) {
14070+ let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
14071+ self.expect_token(&Token::RParen)?;
14072+ list
14073+ } else {
14074+ vec![]
14075+ };
14076+ match kw {
14077+ Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
14078+ name: name.clone(),
14079+ arg_types,
14080+ })),
14081+ Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
14082+ name: name.clone(),
14083+ arg_types,
14084+ })),
14085+ _ => self.expected("procedure or function keywords", self.peek_token())?,
14086+ }
14087+ }
14088+
1405514089 pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
1405614090 fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
1405714091 let columns = parser.parse_parenthesized_column_list(Optional, false)?;
0 commit comments