@@ -2608,23 +2608,43 @@ impl<'a> Parser<'a> {
26082608 }
26092609
26102610 pub fn parse_map_access ( & mut self , expr : Expr ) -> Result < Expr , ParserError > {
2611- let key = self . parse_map_key ( ) ?;
2612- let tok = self . consume_token ( & Token :: RBracket ) ;
2613- debug ! ( "Tok: {}" , tok) ;
2614- let mut key_parts: Vec < Expr > = vec ! [ key] ;
2615- while self . consume_token ( & Token :: LBracket ) {
2616- let key = self . parse_map_key ( ) ?;
2617- let tok = self . consume_token ( & Token :: RBracket ) ;
2618- debug ! ( "Tok: {}" , tok) ;
2619- key_parts. push ( key) ;
2620- }
2621- match expr {
2622- e @ Expr :: Identifier ( _) | e @ Expr :: CompoundIdentifier ( _) => Ok ( Expr :: MapAccess {
2623- column : Box :: new ( e) ,
2624- keys : key_parts,
2625- } ) ,
2626- _ => Ok ( expr) ,
2611+ let key = self . parse_expr ( ) ?;
2612+ self . expect_token ( & Token :: RBracket ) ?;
2613+
2614+ let mut keys = vec ! [ MapAccessKey {
2615+ key,
2616+ syntax: MapAccessSyntax :: Bracket ,
2617+ } ] ;
2618+ loop {
2619+ let key = match self . peek_token ( ) . token {
2620+ Token :: LBracket => {
2621+ self . next_token ( ) ; // consume `[`
2622+ let key = self . parse_expr ( ) ?;
2623+ self . expect_token ( & Token :: RBracket ) ?;
2624+ MapAccessKey {
2625+ key,
2626+ syntax : MapAccessSyntax :: Bracket ,
2627+ }
2628+ }
2629+ // Access on BigQuery nested and repeated expressions can
2630+ // mix notations in the same expression.
2631+ // https://cloud.google.com/bigquery/docs/nested-repeated#query_nested_and_repeated_columns
2632+ Token :: Period if dialect_of ! ( self is BigQueryDialect ) => {
2633+ self . next_token ( ) ; // consume `.`
2634+ MapAccessKey {
2635+ key : self . parse_expr ( ) ?,
2636+ syntax : MapAccessSyntax :: Period ,
2637+ }
2638+ }
2639+ _ => break ,
2640+ } ;
2641+ keys. push ( key) ;
26272642 }
2643+
2644+ Ok ( Expr :: MapAccess {
2645+ column : Box :: new ( expr) ,
2646+ keys,
2647+ } )
26282648 }
26292649
26302650 /// Parses the parens following the `[ NOT ] IN` operator
@@ -6329,31 +6349,6 @@ impl<'a> Parser<'a> {
63296349 }
63306350 }
63316351
6332- /// Parse a map key string
6333- pub fn parse_map_key ( & mut self ) -> Result < Expr , ParserError > {
6334- let next_token = self . next_token ( ) ;
6335- match next_token. token {
6336- // handle bigquery offset subscript operator which overlaps with OFFSET operator
6337- Token :: Word ( Word { value, keyword, .. } )
6338- if ( dialect_of ! ( self is BigQueryDialect ) && keyword == Keyword :: OFFSET ) =>
6339- {
6340- self . parse_function ( ObjectName ( vec ! [ Ident :: new( value) ] ) )
6341- }
6342- Token :: Word ( Word { value, keyword, .. } ) if ( keyword == Keyword :: NoKeyword ) => {
6343- if self . peek_token ( ) == Token :: LParen {
6344- return self . parse_function ( ObjectName ( vec ! [ Ident :: new( value) ] ) ) ;
6345- }
6346- Ok ( Expr :: Value ( Value :: SingleQuotedString ( value) ) )
6347- }
6348- Token :: SingleQuotedString ( s) => Ok ( Expr :: Value ( Value :: SingleQuotedString ( s) ) ) ,
6349- #[ cfg( not( feature = "bigdecimal" ) ) ]
6350- Token :: Number ( s, _) => Ok ( Expr :: Value ( Value :: Number ( s, false ) ) ) ,
6351- #[ cfg( feature = "bigdecimal" ) ]
6352- Token :: Number ( s, _) => Ok ( Expr :: Value ( Value :: Number ( s. parse ( ) . unwrap ( ) , false ) ) ) ,
6353- _ => self . expected ( "literal string, number or function" , next_token) ,
6354- }
6355- }
6356-
63576352 /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
63586353 pub fn parse_data_type ( & mut self ) -> Result < DataType , ParserError > {
63596354 let ( ty, trailing_bracket) = self . parse_data_type_helper ( ) ?;
0 commit comments