@@ -41,8 +41,8 @@ use datafusion::{
4141 logical_plan:: {
4242 build_join_schema, build_table_udf_schema, exprlist_to_fields, normalize_cols,
4343 plan:: { Aggregate , Extension , Filter , Join , Projection , Sort , TableUDFs , Window } ,
44- CrossJoin , DFField , DFSchema , DFSchemaRef , Distinct , EmptyRelation , Expr , Like , Limit ,
45- LogicalPlan , LogicalPlanBuilder , TableScan , Union ,
44+ replace_col_to_expr , CrossJoin , DFField , DFSchema , DFSchemaRef , Distinct , EmptyRelation ,
45+ Expr , Like , Limit , LogicalPlan , LogicalPlanBuilder , TableScan , Union ,
4646 } ,
4747 physical_plan:: planner:: DefaultPhysicalPlanner ,
4848 scalar:: ScalarValue ,
@@ -1671,8 +1671,10 @@ impl LanguageToLogicalPlanConverter {
16711671 match_expr_list_node ! ( node_by_id, to_expr, params[ 2 ] , WrappedSelectGroupExpr ) ;
16721672 let aggr_expr =
16731673 match_expr_list_node ! ( node_by_id, to_expr, params[ 3 ] , WrappedSelectAggrExpr ) ;
1674- let from = Arc :: new ( self . to_logical_plan ( params[ 4 ] ) ?) ;
1675- let joins = match_list_node ! ( node_by_id, params[ 5 ] , WrappedSelectJoins )
1674+ let window_expr =
1675+ match_expr_list_node ! ( node_by_id, to_expr, params[ 4 ] , WrappedSelectWindowExpr ) ;
1676+ let from = Arc :: new ( self . to_logical_plan ( params[ 5 ] ) ?) ;
1677+ let joins = match_list_node ! ( node_by_id, params[ 6 ] , WrappedSelectJoins )
16761678 . into_iter ( )
16771679 . map ( |j| {
16781680 if let LogicalPlanLanguage :: WrappedSelectJoin ( params) = j {
@@ -1688,28 +1690,49 @@ impl LanguageToLogicalPlanConverter {
16881690 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
16891691
16901692 let filter_expr =
1691- match_expr_list_node ! ( node_by_id, to_expr, params[ 6 ] , WrappedSelectFilterExpr ) ;
1693+ match_expr_list_node ! ( node_by_id, to_expr, params[ 7 ] , WrappedSelectFilterExpr ) ;
16921694 let having_expr =
1693- match_expr_list_node ! ( node_by_id, to_expr, params[ 7 ] , WrappedSelectHavingExpr ) ;
1694- let limit = match_data_node ! ( node_by_id, params[ 8 ] , WrappedSelectLimit ) ;
1695- let offset = match_data_node ! ( node_by_id, params[ 9 ] , WrappedSelectOffset ) ;
1695+ match_expr_list_node ! ( node_by_id, to_expr, params[ 8 ] , WrappedSelectHavingExpr ) ;
1696+ let limit = match_data_node ! ( node_by_id, params[ 9 ] , WrappedSelectLimit ) ;
1697+ let offset = match_data_node ! ( node_by_id, params[ 10 ] , WrappedSelectOffset ) ;
16961698 let order_expr =
1697- match_expr_list_node ! ( node_by_id, to_expr, params[ 10 ] , WrappedSelectOrderExpr ) ;
1698- let alias = match_data_node ! ( node_by_id, params[ 11 ] , WrappedSelectAlias ) ;
1699- let ungrouped = match_data_node ! ( node_by_id, params[ 12 ] , WrappedSelectUngrouped ) ;
1699+ match_expr_list_node ! ( node_by_id, to_expr, params[ 11 ] , WrappedSelectOrderExpr ) ;
1700+ let alias = match_data_node ! ( node_by_id, params[ 12 ] , WrappedSelectAlias ) ;
1701+ let ungrouped = match_data_node ! ( node_by_id, params[ 13 ] , WrappedSelectUngrouped ) ;
17001702
17011703 let group_expr = normalize_cols ( group_expr, & from) ?;
17021704 let aggr_expr = normalize_cols ( aggr_expr, & from) ?;
17031705 let projection_expr = normalize_cols ( projection_expr, & from) ?;
1704- let all_expr = match select_type {
1706+ let all_expr_without_window = match select_type {
17051707 WrappedSelectType :: Projection => projection_expr. clone ( ) ,
17061708 WrappedSelectType :: Aggregate => {
17071709 group_expr. iter ( ) . chain ( aggr_expr. iter ( ) ) . cloned ( ) . collect ( )
17081710 }
17091711 } ;
1712+ let without_window_fields =
1713+ exprlist_to_fields ( all_expr_without_window. iter ( ) , from. schema ( ) ) ?;
1714+ let replace_map = all_expr_without_window
1715+ . iter ( )
1716+ . zip ( without_window_fields. iter ( ) )
1717+ . map ( |( e, f) | ( f. qualified_column ( ) , e. clone ( ) ) )
1718+ . collect :: < Vec < _ > > ( ) ;
1719+ let replace_map = replace_map
1720+ . iter ( )
1721+ . map ( |( c, e) | ( c, e) )
1722+ . collect :: < HashMap < _ , _ > > ( ) ;
1723+ let window_expr_rebased = window_expr
1724+ . iter ( )
1725+ . map ( |e| replace_col_to_expr ( e. clone ( ) , & replace_map) )
1726+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
17101727 let schema = DFSchema :: new_with_metadata (
17111728 // TODO support joins schema
1712- exprlist_to_fields ( all_expr. iter ( ) , from. schema ( ) ) ?,
1729+ without_window_fields
1730+ . into_iter ( )
1731+ . chain (
1732+ exprlist_to_fields ( window_expr_rebased. iter ( ) , from. schema ( ) ) ?
1733+ . into_iter ( ) ,
1734+ )
1735+ . collect ( ) ,
17131736 HashMap :: new ( ) ,
17141737 ) ?;
17151738
@@ -1725,6 +1748,7 @@ impl LanguageToLogicalPlanConverter {
17251748 projection_expr,
17261749 group_expr,
17271750 aggr_expr,
1751+ window_expr_rebased,
17281752 from,
17291753 joins,
17301754 filter_expr,
0 commit comments