From a719cde075fb2d8eb798a4fff8817ad6a4cb4458 Mon Sep 17 00:00:00 2001 From: Jiayu Liu Date: Wed, 23 Jun 2021 16:46:14 +0800 Subject: [PATCH] fix 592, support alias in window functions --- datafusion/src/sql/planner.rs | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/datafusion/src/sql/planner.rs b/datafusion/src/sql/planner.rs index a2f3240a8a99d..17181230c26cc 100644 --- a/datafusion/src/sql/planner.rs +++ b/datafusion/src/sql/planner.rs @@ -635,21 +635,21 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> { // window function let window_func_exprs = find_window_exprs(&select_exprs_post_aggr); - let (plan, exprs) = if window_func_exprs.is_empty() { - (plan, select_exprs_post_aggr) + let plan = if window_func_exprs.is_empty() { + plan } else { - self.window(plan, window_func_exprs, &select_exprs_post_aggr)? + self.window(plan, window_func_exprs)? }; let plan = if select.distinct { return LogicalPlanBuilder::from(&plan) - .aggregate(exprs, vec![])? + .aggregate(select_exprs_post_aggr, vec![])? .build(); } else { plan }; - self.project(&plan, exprs) + self.project(&plan, select_exprs_post_aggr) } /// Returns the `Expr`'s corresponding to a SQL query's SELECT expressions. @@ -678,12 +678,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> { } /// Wrap a plan in a window - fn window( - &self, - input: LogicalPlan, - window_exprs: Vec, - select_exprs: &[Expr], - ) -> Result<(LogicalPlan, Vec)> { + fn window(&self, input: LogicalPlan, window_exprs: Vec) -> Result { let mut plan = input; let mut groups = group_window_expr_by_sort_keys(&window_exprs)?; // sort by sort_key len descending, so that more deeply sorted plans gets nested further @@ -700,11 +695,8 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> { .window(window_exprs)? .build()?; } - let select_exprs = select_exprs - .iter() - .map(|expr| rebase_expr(expr, &window_exprs, &plan)) - .collect::>>()?; - Ok((plan, select_exprs)) + + Ok(plan) } /// Wrap a plan in an aggregate @@ -2821,6 +2813,16 @@ mod tests { quick_test(sql, expected); } + #[test] + fn empty_over_dup_with_alias() { + let sql = "SELECT order_id oid, MAX(order_id) OVER () max_oid, MAX(order_id) OVER () max_oid_dup from orders"; + let expected = "\ + Projection: #orders.order_id AS oid, #MAX(orders.order_id) AS max_oid, #MAX(orders.order_id) AS max_oid_dup\ + \n WindowAggr: windowExpr=[[MAX(#orders.order_id)]]\ + \n TableScan: orders projection=None"; + quick_test(sql, expected); + } + #[test] fn empty_over_plus() { let sql = "SELECT order_id, MAX(qty * 1.1) OVER () from orders";