@@ -1802,10 +1802,17 @@ impl<'a> Parser<'a> {
18021802 & mut self ,
18031803 reserved_kwds : & [ Keyword ] ,
18041804 ) -> Result < Option < TableAlias > , ParserError > {
1805+ let orig_index = self . index ;
18051806 match self . parse_optional_alias ( reserved_kwds) ? {
18061807 Some ( name) => {
1807- let columns = self . parse_parenthesized_column_list ( Optional ) ?;
1808- Ok ( Some ( TableAlias { name, columns } ) )
1808+ if let Ok ( columns) = self . parse_parenthesized_column_list ( Optional ) {
1809+ Ok ( Some ( TableAlias { name, columns } ) )
1810+ } else {
1811+ // if column list doesn't parse correctly, reset back to
1812+ // original state
1813+ self . index = orig_index;
1814+ Ok ( None )
1815+ }
18091816 }
18101817 None => Ok ( None ) ,
18111818 }
@@ -2176,6 +2183,16 @@ impl<'a> Parser<'a> {
21762183 relation : self . parse_table_factor ( ) ?,
21772184 join_operator : JoinOperator :: OuterApply ,
21782185 }
2186+ } else if self . parse_keyword ( Keyword :: PIVOT ) {
2187+ Join {
2188+ relation : self . parse_pivot_body ( ) ?,
2189+ join_operator : JoinOperator :: Pivot ,
2190+ }
2191+ } else if self . parse_keyword ( Keyword :: UNPIVOT ) {
2192+ Join {
2193+ relation : self . parse_pivot_body ( ) ?,
2194+ join_operator : JoinOperator :: Unpivot ,
2195+ }
21792196 } else {
21802197 let natural = self . parse_keyword ( Keyword :: NATURAL ) ;
21812198 let peek_keyword = if let Token :: Word ( w) = self . peek_token ( ) {
@@ -2315,6 +2332,7 @@ impl<'a> Parser<'a> {
23152332 // `(mytable AS alias)`
23162333 alias. replace ( outer_alias) ;
23172334 }
2335+ TableFactor :: Pivot { .. } => unreachable ! ( ) ,
23182336 TableFactor :: NestedJoin ( _) => unreachable ! ( ) ,
23192337 } ;
23202338 }
@@ -2354,6 +2372,23 @@ impl<'a> Parser<'a> {
23542372 }
23552373 }
23562374
2375+ pub fn parse_pivot_body ( & mut self ) -> Result < TableFactor , ParserError > {
2376+ self . expect_token ( & Token :: LParen ) ?;
2377+ let expr = self . parse_expr ( ) ?;
2378+ self . expect_keyword ( Keyword :: FOR ) ?;
2379+ let val = self . parse_identifier ( ) ?;
2380+ self . expect_keyword ( Keyword :: IN ) ?;
2381+ self . expect_token ( & Token :: LParen ) ?;
2382+ let pivot_vals = self . parse_comma_separated ( Parser :: parse_expr) ?;
2383+ self . expect_token ( & Token :: RParen ) ?;
2384+ self . expect_token ( & Token :: RParen ) ?;
2385+ Ok ( TableFactor :: Pivot {
2386+ expr,
2387+ val,
2388+ pivot_vals,
2389+ } )
2390+ }
2391+
23572392 pub fn parse_derived_table_factor (
23582393 & mut self ,
23592394 lateral : IsLateral ,
0 commit comments