@@ -3715,29 +3715,26 @@ impl<'a> Parser<'a> {
3715
3715
})
3716
3716
}
3717
3717
3718
+ // Parser is either looking at a : or a bracket expression.
3718
3719
fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
3719
3720
let mut path = Vec::new();
3720
- let has_colon = self.peek_token_ref().token == Token::Colon ;
3721
+ let mut has_colon = false ;
3721
3722
loop {
3722
3723
match self.next_token().token {
3723
3724
Token::Colon if path.is_empty() => {
3724
- path.push(self.parse_json_path_object_key()?);
3725
+ has_colon = true;
3726
+ if *self.peek_token_ref() == Token::LBracket {
3727
+ path.push(self.parse_json_path_bracket_element()?);
3728
+ } else {
3729
+ path.push(self.parse_json_path_object_key()?);
3730
+ }
3725
3731
}
3726
3732
Token::Period if !path.is_empty() => {
3727
3733
path.push(self.parse_json_path_object_key()?);
3728
3734
}
3729
3735
Token::LBracket => {
3730
- if self.peek_token_ref().token == Token::Mul
3731
- && self.dialect.supports_semi_structured_array_all_elements()
3732
- {
3733
- self.expect_token(&Token::Mul)?;
3734
- path.push(JsonPathElem::AllElements);
3735
- } else {
3736
- let key = self.parse_expr()?;
3737
- path.push(JsonPathElem::Bracket { key });
3738
- }
3739
-
3740
- self.expect_token(&Token::RBracket)?;
3736
+ self.prev_token();
3737
+ path.push(self.parse_json_path_bracket_element()?);
3741
3738
}
3742
3739
_ => {
3743
3740
self.prev_token();
@@ -3750,6 +3747,22 @@ impl<'a> Parser<'a> {
3750
3747
Ok(JsonPath { has_colon, path })
3751
3748
}
3752
3749
3750
+ /// Parses a single bracketed element in a JSON path expression, including both brackets.
3751
+ fn parse_json_path_bracket_element(&mut self) -> Result<JsonPathElem, ParserError> {
3752
+ self.expect_token(&Token::LBracket)?;
3753
+ let elem = if *self.peek_token_ref() == Token::Mul
3754
+ && self.dialect.supports_semi_structured_array_all_elements()
3755
+ {
3756
+ self.expect_token(&Token::Mul)?;
3757
+ JsonPathElem::AllElements
3758
+ } else {
3759
+ let key = self.parse_expr()?;
3760
+ JsonPathElem::Bracket { key }
3761
+ };
3762
+ self.expect_token(&Token::RBracket)?;
3763
+ Ok(elem)
3764
+ }
3765
+
3753
3766
/// Parses the parens following the `[ NOT ] IN` operator.
3754
3767
pub fn parse_in(&mut self, expr: Expr, negated: bool) -> Result<Expr, ParserError> {
3755
3768
// BigQuery allows `IN UNNEST(array_expression)`
0 commit comments