@@ -62,7 +62,9 @@ use arrow::array::{builder::StringBuilder, RecordBatch};
6262use arrow:: compute:: SortOptions ;
6363use arrow:: datatypes:: { Schema , SchemaRef } ;
6464use datafusion_common:: display:: ToStringifiedPlan ;
65- use datafusion_common:: tree_node:: { TreeNode , TreeNodeRecursion , TreeNodeVisitor } ;
65+ use datafusion_common:: tree_node:: {
66+ Transformed , TransformedResult , TreeNode , TreeNodeRecursion , TreeNodeVisitor ,
67+ } ;
6668use datafusion_common:: {
6769 exec_err, internal_datafusion_err, internal_err, not_impl_err, plan_err, DFSchema ,
6870 ScalarValue ,
@@ -2075,29 +2077,37 @@ fn maybe_fix_physical_column_name(
20752077 expr : Result < Arc < dyn PhysicalExpr > > ,
20762078 input_physical_schema : & SchemaRef ,
20772079) -> Result < Arc < dyn PhysicalExpr > > {
2078- if let Ok ( e) = & expr {
2079- if let Some ( column) = e. as_any ( ) . downcast_ref :: < Column > ( ) {
2080- let physical_field = input_physical_schema. field ( column. index ( ) ) ;
2081- let expr_col_name = column. name ( ) ;
2082- let physical_name = physical_field. name ( ) ;
2083-
2084- if physical_name != expr_col_name {
2085- // handle edge cases where the physical_name contains ':'.
2086- let colon_count = physical_name. matches ( ':' ) . count ( ) ;
2087- let mut splits = expr_col_name. match_indices ( ':' ) ;
2088- let split_pos = splits. nth ( colon_count) ;
2089-
2090- if let Some ( ( idx, _) ) = split_pos {
2091- let base_name = & expr_col_name[ ..idx] ;
2092- if base_name == physical_name {
2093- let updated_column = Column :: new ( physical_name, column. index ( ) ) ;
2094- return Ok ( Arc :: new ( updated_column) ) ;
2080+ expr. and_then ( |e| {
2081+ e. transform_down ( |node| {
2082+ if let Some ( column) = node. as_any ( ) . downcast_ref :: < Column > ( ) {
2083+ let idx = column. index ( ) ;
2084+ let physical_field = input_physical_schema. field ( idx) ;
2085+ let expr_col_name = column. name ( ) ;
2086+ let physical_name = physical_field. name ( ) ;
2087+
2088+ if expr_col_name != physical_name {
2089+ // handle edge cases where the physical_name contains ':'.
2090+ let colon_count = physical_name. matches ( ':' ) . count ( ) ;
2091+ let mut splits = expr_col_name. match_indices ( ':' ) ;
2092+ let split_pos = splits. nth ( colon_count) ;
2093+
2094+ if let Some ( ( i, _) ) = split_pos {
2095+ let base_name = & expr_col_name[ ..i] ;
2096+ if base_name == physical_name {
2097+ let updated_column = Column :: new ( physical_name, idx) ;
2098+ return Ok ( Transformed :: yes ( Arc :: new ( updated_column) ) ) ;
2099+ }
20952100 }
20962101 }
2102+
2103+ // If names already match or fix is not possible, just leave it as it is
2104+ Ok ( Transformed :: no ( node) )
2105+ } else {
2106+ Ok ( Transformed :: no ( node) )
20972107 }
2098- }
2099- }
2100- expr
2108+ } )
2109+ . data ( )
2110+ } )
21012111}
21022112
21032113struct OptimizationInvariantChecker < ' a > {
0 commit comments