@@ -46,7 +46,7 @@ use datafusion::{
46
46
error:: DataFusionError ,
47
47
logical_plan:: {
48
48
build_join_schema, build_table_udf_schema, exprlist_to_fields,
49
- exprlist_to_fields_from_schema, normalize_cols ,
49
+ exprlist_to_fields_from_schema, normalize_col as df_normalize_col ,
50
50
plan:: { Aggregate , Extension , Filter , Join , Projection , Sort , TableUDFs , Window } ,
51
51
replace_col_to_expr, Column , CrossJoin , DFField , DFSchema , DFSchemaRef , Distinct ,
52
52
EmptyRelation , Expr , ExprRewritable , ExprRewriter , GroupingSet , Like , Limit , LogicalPlan ,
@@ -2441,3 +2441,29 @@ fn replace_qualified_col_with_flat_name_if_missing(
2441
2441
} )
2442
2442
. collect :: < Result < Vec < _ > , _ > > ( )
2443
2443
}
2444
+
2445
+ /// Recursively normalize all Column expressions in a list of expression trees
2446
+ fn normalize_cols (
2447
+ exprs : impl IntoIterator < Item = impl Into < Expr > > ,
2448
+ plan : & LogicalPlan ,
2449
+ ) -> Result < Vec < Expr > , CubeError > {
2450
+ exprs
2451
+ . into_iter ( )
2452
+ . map ( |e| normalize_col ( e. into ( ) , plan) )
2453
+ . collect ( )
2454
+ }
2455
+
2456
+ /// Recursively call [`df_normalize_col`] on all Column expressions
2457
+ /// in the `expr` expression tree, realiasing the expressions if the name is different.
2458
+ fn normalize_col ( expr : Expr , plan : & LogicalPlan ) -> Result < Expr , CubeError > {
2459
+ if let Expr :: Alias ( _, _) = expr {
2460
+ return Ok ( df_normalize_col ( expr, plan) ?) ;
2461
+ }
2462
+ let original_expr_name = expr_name ( & expr) ?;
2463
+ let mut normalized_expr = df_normalize_col ( expr, plan) ?;
2464
+ let normalized_expr_name = expr_name ( & normalized_expr) ?;
2465
+ if original_expr_name != normalized_expr_name {
2466
+ normalized_expr = normalized_expr. alias ( & original_expr_name) ;
2467
+ }
2468
+ Ok ( normalized_expr)
2469
+ }
0 commit comments