File tree 2 files changed +42
-3
lines changed 2 files changed +42
-3
lines changed Original file line number Diff line number Diff line change @@ -4183,7 +4183,13 @@ impl<'a> Parser<'a> {
4183
4183
pub fn parse_map_key ( & mut self ) -> Result < Expr , ParserError > {
4184
4184
let next_token = self . next_token ( ) ;
4185
4185
match next_token. token {
4186
- Token :: Word ( Word { value, keyword, .. } ) if keyword == Keyword :: NoKeyword => {
4186
+ // handle bigquery offset subscript operator which overlaps with OFFSET operator
4187
+ Token :: Word ( Word { value, keyword, .. } )
4188
+ if ( dialect_of ! ( self is BigQueryDialect ) && keyword == Keyword :: OFFSET ) =>
4189
+ {
4190
+ self . parse_function ( ObjectName ( vec ! [ Ident :: new( value) ] ) )
4191
+ }
4192
+ Token :: Word ( Word { value, keyword, .. } ) if ( keyword == Keyword :: NoKeyword ) => {
4187
4193
if self . peek_token ( ) == Token :: LParen {
4188
4194
return self . parse_function ( ObjectName ( vec ! [ Ident :: new( value) ] ) ) ;
4189
4195
}
Original file line number Diff line number Diff line change 13
13
#[ macro_use]
14
14
mod test_utils;
15
15
16
- use test_utils:: * ;
17
-
18
16
use sqlparser:: ast:: * ;
19
17
use sqlparser:: dialect:: { BigQueryDialect , GenericDialect } ;
18
+ use test_utils:: * ;
20
19
21
20
#[ test]
22
21
fn parse_literal_string ( ) {
@@ -306,3 +305,37 @@ fn bigquery_and_generic() -> TestedDialects {
306
305
dialects : vec ! [ Box :: new( BigQueryDialect { } ) , Box :: new( GenericDialect { } ) ] ,
307
306
}
308
307
}
308
+
309
+ #[ test]
310
+ fn parse_map_access_offset ( ) {
311
+ let sql = "SELECT d[offset(0)]" ;
312
+ let _select = bigquery ( ) . verified_only_select ( sql) ;
313
+ #[ cfg( not( feature = "bigdecimal" ) ) ]
314
+ assert_eq ! (
315
+ _select. projection[ 0 ] ,
316
+ SelectItem :: UnnamedExpr ( Expr :: MapAccess {
317
+ column: Box :: new( Expr :: Identifier ( Ident {
318
+ value: "d" . to_string( ) ,
319
+ quote_style: None ,
320
+ } ) ) ,
321
+ keys: vec![ Expr :: Function ( Function {
322
+ name: ObjectName ( vec![ "offset" . into( ) ] ) ,
323
+ args: vec![ FunctionArg :: Unnamed ( FunctionArgExpr :: Expr ( Expr :: Value (
324
+ Value :: Number ( "0" . into( ) , false )
325
+ ) ) ) , ] ,
326
+ over: None ,
327
+ distinct: false ,
328
+ special: false ,
329
+ } ) ] ,
330
+ } )
331
+ ) ;
332
+
333
+ // test other operators
334
+ for sql in [
335
+ "SELECT d[SAFE_OFFSET(0)]" ,
336
+ "SELECT d[ORDINAL(0)]" ,
337
+ "SELECT d[SAFE_ORDINAL(0)]" ,
338
+ ] {
339
+ bigquery ( ) . verified_only_select ( sql) ;
340
+ }
341
+ }
You can’t perform that action at this time.
0 commit comments