@@ -11321,45 +11321,58 @@ impl<'a> Parser<'a> {
1132111321 }
1132211322
1132311323 pub fn parse_function_args(&mut self) -> Result<FunctionArg, ParserError> {
11324- if self.peek_nth_token(1) == Token::RArrow {
11325- let name = self.parse_identifier(false)?;
11326-
11327- self.expect_token(&Token::RArrow)?;
11328- let arg = self.parse_wildcard_expr()?.into();
11329-
11330- Ok(FunctionArg::Named {
11331- name,
11332- arg,
11333- operator: FunctionArgOperator::RightArrow,
11334- })
11335- } else if self.dialect.supports_named_fn_args_with_eq_operator()
11336- && self.peek_nth_token(1) == Token::Eq
11337- {
11338- let name = self.parse_identifier(false)?;
11339-
11340- self.expect_token(&Token::Eq)?;
11341- let arg = self.parse_wildcard_expr()?.into();
11342-
11343- Ok(FunctionArg::Named {
11344- name,
11345- arg,
11346- operator: FunctionArgOperator::Equals,
11347- })
11348- } else if dialect_of!(self is DuckDbDialect | GenericDialect)
11349- && self.peek_nth_token(1) == Token::Assignment
11350- {
11351- let name = self.parse_identifier(false)?;
11352-
11353- self.expect_token(&Token::Assignment)?;
11354- let arg = self.parse_expr()?.into();
11355-
11356- Ok(FunctionArg::Named {
11357- name,
11358- arg,
11359- operator: FunctionArgOperator::Assignment,
11360- })
11324+ let arg = if self.dialect.supports_named_fn_args_with_expr_name() {
11325+ self.maybe_parse(|p| {
11326+ let name = p.parse_expr()?;
11327+ let operator = p.parse_function_named_arg_operator()?;
11328+ let arg = p.parse_wildcard_expr()?.into();
11329+ Ok(FunctionArg::ExprNamed {
11330+ name,
11331+ arg,
11332+ operator,
11333+ })
11334+ })?
1136111335 } else {
11362- Ok(FunctionArg::Unnamed(self.parse_wildcard_expr()?.into()))
11336+ self.maybe_parse(|p| {
11337+ let name = p.parse_identifier(false)?;
11338+ let operator = p.parse_function_named_arg_operator()?;
11339+ let arg = p.parse_wildcard_expr()?.into();
11340+ Ok(FunctionArg::Named {
11341+ name,
11342+ arg,
11343+ operator,
11344+ })
11345+ })?
11346+ };
11347+ if let Some(arg) = arg {
11348+ return Ok(arg);
11349+ }
11350+ Ok(FunctionArg::Unnamed(self.parse_wildcard_expr()?.into()))
11351+ }
11352+
11353+ fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
11354+ let tok = self.next_token();
11355+ match tok.token {
11356+ Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
11357+ Ok(FunctionArgOperator::RightArrow)
11358+ }
11359+ Token::Eq if self.dialect.supports_named_fn_args_with_eq_operator() => {
11360+ Ok(FunctionArgOperator::Equals)
11361+ }
11362+ Token::Assignment
11363+ if self
11364+ .dialect
11365+ .supports_named_fn_args_with_assignment_operator() =>
11366+ {
11367+ Ok(FunctionArgOperator::Assignment)
11368+ }
11369+ Token::Colon if self.dialect.supports_named_fn_args_with_colon_operator() => {
11370+ Ok(FunctionArgOperator::Colon)
11371+ }
11372+ _ => {
11373+ self.prev_token();
11374+ self.expected("argument operator", tok)
11375+ }
1136311376 }
1136411377 }
1136511378
@@ -11403,19 +11416,24 @@ impl<'a> Parser<'a> {
1140311416 /// FIRST_VALUE(x IGNORE NULL);
1140411417 /// ```
1140511418 fn parse_function_argument_list(&mut self) -> Result<FunctionArgumentList, ParserError> {
11419+ let mut clauses = vec![];
11420+
11421+ // For MSSQL empty argument list with json-null-clause case, e.g. `JSON_ARRAY(NULL ON NULL)`
11422+ if let Some(null_clause) = self.parse_json_null_clause() {
11423+ clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
11424+ }
11425+
1140611426 if self.consume_token(&Token::RParen) {
1140711427 return Ok(FunctionArgumentList {
1140811428 duplicate_treatment: None,
1140911429 args: vec![],
11410- clauses: vec![] ,
11430+ clauses,
1141111431 });
1141211432 }
1141311433
1141411434 let duplicate_treatment = self.parse_duplicate_treatment()?;
1141511435 let args = self.parse_comma_separated(Parser::parse_function_args)?;
1141611436
11417- let mut clauses = vec![];
11418-
1141911437 if self.dialect.supports_window_function_null_treatment_arg() {
1142011438 if let Some(null_treatment) = self.parse_null_treatment()? {
1142111439 clauses.push(FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment));
@@ -11456,6 +11474,10 @@ impl<'a> Parser<'a> {
1145611474 clauses.push(FunctionArgumentClause::OnOverflow(on_overflow));
1145711475 }
1145811476
11477+ if let Some(null_clause) = self.parse_json_null_clause() {
11478+ clauses.push(FunctionArgumentClause::JsonNullClause(null_clause));
11479+ }
11480+
1145911481 self.expect_token(&Token::RParen)?;
1146011482 Ok(FunctionArgumentList {
1146111483 duplicate_treatment,
@@ -11464,6 +11486,17 @@ impl<'a> Parser<'a> {
1146411486 })
1146511487 }
1146611488
11489+ /// Parses MSSQL's json-null-clause
11490+ fn parse_json_null_clause(&mut self) -> Option<JsonNullClause> {
11491+ if self.parse_keywords(&[Keyword::ABSENT, Keyword::ON, Keyword::NULL]) {
11492+ Some(JsonNullClause::AbsentOnNull)
11493+ } else if self.parse_keywords(&[Keyword::NULL, Keyword::ON, Keyword::NULL]) {
11494+ Some(JsonNullClause::NullOnNull)
11495+ } else {
11496+ None
11497+ }
11498+ }
11499+
1146711500 fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
1146811501 let loc = self.peek_token().location;
1146911502 match (
0 commit comments