@@ -889,9 +889,17 @@ impl<'a> Parser<'a> {
889889 /// Parses an array expression `[ex1, ex2, ..]`
890890 /// if `named` is `true`, came from an expression like `ARRAY[ex1, ex2]`
891891 pub fn parse_array_expr ( & mut self , named : bool ) -> Result < Expr , ParserError > {
892- let exprs = self . parse_comma_separated ( Parser :: parse_expr) ?;
893- self . expect_token ( & Token :: RBracket ) ?;
894- Ok ( Expr :: Array ( Array { elem : exprs, named } ) )
892+ if self . peek_token ( ) == Token :: RBracket {
893+ let _ = self . next_token ( ) ;
894+ Ok ( Expr :: Array ( Array {
895+ elem : vec ! [ ] ,
896+ named,
897+ } ) )
898+ } else {
899+ let exprs = self . parse_comma_separated ( Parser :: parse_expr) ?;
900+ self . expect_token ( & Token :: RBracket ) ?;
901+ Ok ( Expr :: Array ( Array { elem : exprs, named } ) )
902+ }
895903 }
896904
897905 /// Parses an array subquery `ARRAY(SELECT 1 UNION SELECT 2)`
@@ -1205,6 +1213,28 @@ impl<'a> Parser<'a> {
12051213 )
12061214 }
12071215 }
1216+ Keyword :: AT => {
1217+ // if self.parse_keyword(Keyword::TIME) {
1218+ // self.expect_keyword(Keyword::ZONE)?;
1219+ if self . parse_keywords ( & [ Keyword :: TIME , Keyword :: ZONE ] ) {
1220+ let time_zone = self . next_token ( ) ;
1221+ match time_zone {
1222+ Token :: SingleQuotedString ( time_zone) => {
1223+ log:: trace!( "Peek token: {:?}" , self . peek_token( ) ) ;
1224+ Ok ( Expr :: AtTimeZone {
1225+ timestamp : Box :: new ( expr) ,
1226+ time_zone,
1227+ } )
1228+ }
1229+ tok => self . expected (
1230+ "Expected Token::SingleQuotedString after AT TIME ZONE" ,
1231+ tok,
1232+ ) ,
1233+ }
1234+ } else {
1235+ self . expected ( "Expected Token::Word after AT" , tok)
1236+ }
1237+ }
12081238 Keyword :: NOT | Keyword :: IN | Keyword :: BETWEEN => {
12091239 self . prev_token ( ) ;
12101240 let negated = self . parse_keyword ( Keyword :: NOT ) ;
@@ -1333,15 +1363,32 @@ impl<'a> Parser<'a> {
13331363 const UNARY_NOT_PREC : u8 = 15 ;
13341364 const BETWEEN_PREC : u8 = 20 ;
13351365 const PLUS_MINUS_PREC : u8 = 30 ;
1366+ const TIME_ZONE_PREC : u8 = 20 ;
13361367
13371368 /// Get the precedence of the next token
13381369 pub fn get_next_precedence ( & self ) -> Result < u8 , ParserError > {
13391370 let token = self . peek_token ( ) ;
13401371 debug ! ( "get_next_precedence() {:?}" , token) ;
1372+ let token_0 = self . peek_nth_token ( 0 ) ;
1373+ let token_1 = self . peek_nth_token ( 1 ) ;
1374+ let token_2 = self . peek_nth_token ( 2 ) ;
1375+ debug ! ( "0: {token_0} 1: {token_1} 2: {token_2}" ) ;
13411376 match token {
13421377 Token :: Word ( w) if w. keyword == Keyword :: OR => Ok ( 5 ) ,
13431378 Token :: Word ( w) if w. keyword == Keyword :: AND => Ok ( 10 ) ,
13441379 Token :: Word ( w) if w. keyword == Keyword :: XOR => Ok ( 24 ) ,
1380+
1381+ Token :: Word ( w) if w. keyword == Keyword :: AT => {
1382+ match ( self . peek_nth_token ( 1 ) , self . peek_nth_token ( 2 ) ) {
1383+ ( Token :: Word ( w) , Token :: Word ( w2) )
1384+ if w. keyword == Keyword :: TIME && w2. keyword == Keyword :: ZONE =>
1385+ {
1386+ Ok ( Self :: TIME_ZONE_PREC )
1387+ }
1388+ _ => Ok ( 0 ) ,
1389+ }
1390+ }
1391+
13451392 Token :: Word ( w) if w. keyword == Keyword :: NOT => match self . peek_nth_token ( 1 ) {
13461393 // The precedence of NOT varies depending on keyword that
13471394 // follows it. If it is followed by IN, BETWEEN, or LIKE,
0 commit comments