@@ -3632,7 +3632,8 @@ impl<'a> Parser<'a> {
36323632 expr: Box::new(expr),
36333633 })
36343634 } else if Token::LBracket == *tok && self.dialect.supports_partiql()
3635- || (dialect_of!(self is SnowflakeDialect | GenericDialect) && Token::Colon == *tok)
3635+ || (dialect_of!(self is SnowflakeDialect | GenericDialect | DatabricksDialect)
3636+ && Token::Colon == *tok)
36363637 {
36373638 self.prev_token();
36383639 self.parse_json_access(expr)
@@ -3779,21 +3780,26 @@ impl<'a> Parser<'a> {
37793780 })
37803781 }
37813782
3783+ // Parser is either looking at a : or a bracket expression.
37823784 fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
37833785 let mut path = Vec::new();
3786+ let mut has_colon = false;
37843787 loop {
37853788 match self.next_token().token {
37863789 Token::Colon if path.is_empty() => {
3787- path.push(self.parse_json_path_object_key()?);
3790+ has_colon = true;
3791+ if *self.peek_token_ref() == Token::LBracket {
3792+ path.push(self.parse_json_path_bracket_element()?);
3793+ } else {
3794+ path.push(self.parse_json_path_object_key()?);
3795+ }
37883796 }
37893797 Token::Period if !path.is_empty() => {
37903798 path.push(self.parse_json_path_object_key()?);
37913799 }
37923800 Token::LBracket => {
3793- let key = self.parse_expr()?;
3794- self.expect_token(&Token::RBracket)?;
3795-
3796- path.push(JsonPathElem::Bracket { key });
3801+ self.prev_token();
3802+ path.push(self.parse_json_path_bracket_element()?);
37973803 }
37983804 _ => {
37993805 self.prev_token();
@@ -3803,7 +3809,23 @@ impl<'a> Parser<'a> {
38033809 }
38043810
38053811 debug_assert!(!path.is_empty());
3806- Ok(JsonPath { path })
3812+ Ok(JsonPath { has_colon, path })
3813+ }
3814+
3815+ /// Parses a single bracketed element in a JSON path expression, including both brackets.
3816+ fn parse_json_path_bracket_element(&mut self) -> Result<JsonPathElem, ParserError> {
3817+ self.expect_token(&Token::LBracket)?;
3818+ let elem = if *self.peek_token_ref() == Token::Mul
3819+ && self.dialect.supports_semi_structured_array_all_elements()
3820+ {
3821+ self.expect_token(&Token::Mul)?;
3822+ JsonPathElem::AllElements
3823+ } else {
3824+ let key = self.parse_expr()?;
3825+ JsonPathElem::Bracket { key }
3826+ };
3827+ self.expect_token(&Token::RBracket)?;
3828+ Ok(elem)
38073829 }
38083830
38093831 /// Parses the parens following the `[ NOT ] IN` operator.
0 commit comments