@@ -666,21 +666,33 @@ impl<'a> Parser<'a> {
666666 . iter ( )
667667 . any ( |d| word. keyword == * d)
668668 {
669- let ident = self . parse_identifier ( ) ?;
669+ let trim_where = self . parse_trim_where ( ) ?;
670670 let sub_expr = self . parse_expr ( ) ?;
671671 self . expect_keyword ( Keyword :: FROM ) ?;
672- where_expr = Some ( ( ident , sub_expr) )
672+ where_expr = Some ( ( trim_where , Box :: new ( sub_expr) ) ) ;
673673 }
674674 }
675675 let expr = self . parse_expr ( ) ?;
676676 self . expect_token ( & Token :: RParen ) ?;
677677
678678 Ok ( Expr :: Trim {
679679 expr : Box :: new ( expr) ,
680- trim_where : where_expr. map ( | ( ident , expr ) | ( Box :: new ( ident ) , Box :: new ( expr ) ) ) ,
680+ trim_where : where_expr,
681681 } )
682682 }
683683
684+ pub fn parse_trim_where ( & mut self ) -> Result < TrimWhereField , ParserError > {
685+ match self . next_token ( ) {
686+ Token :: Word ( w) => match w. keyword {
687+ Keyword :: BOTH => Ok ( TrimWhereField :: Both ) ,
688+ Keyword :: LEADING => Ok ( TrimWhereField :: Leading ) ,
689+ Keyword :: TRAILING => Ok ( TrimWhereField :: Trailing ) ,
690+ _ => self . expected ( "trim_where field" , Token :: Word ( w) ) ?,
691+ } ,
692+ unexpected => self . expected ( "trim_where field" , unexpected) ,
693+ }
694+ }
695+
684696 /// Parse a SQL LISTAGG expression, e.g. `LISTAGG(...) WITHIN GROUP (ORDER BY ...)`.
685697 pub fn parse_listagg_expr ( & mut self ) -> Result < Expr , ParserError > {
686698 self . expect_token ( & Token :: LParen ) ?;
0 commit comments