@@ -23,11 +23,12 @@ use std::sync::Arc;
2323use crate :: optimizer:: ApplyOrder ;
2424use crate :: { OptimizerConfig , OptimizerRule } ;
2525
26+ use crate :: utils:: NamePreserver ;
2627use arrow:: datatypes:: {
2728 DataType , TimeUnit , MAX_DECIMAL_FOR_EACH_PRECISION , MIN_DECIMAL_FOR_EACH_PRECISION ,
2829} ;
2930use arrow:: temporal_conversions:: { MICROSECONDS , MILLISECONDS , NANOSECONDS } ;
30- use datafusion_common:: tree_node:: { Transformed , TreeNodeRewriter } ;
31+ use datafusion_common:: tree_node:: { Transformed , TreeNode , TreeNodeRewriter } ;
3132use datafusion_common:: { internal_err, DFSchema , DFSchemaRef , Result , ScalarValue } ;
3233use datafusion_expr:: expr:: { BinaryExpr , Cast , InList , TryCast } ;
3334use datafusion_expr:: expr_rewriter:: rewrite_preserving_name;
@@ -85,12 +86,32 @@ impl UnwrapCastInComparison {
8586impl OptimizerRule for UnwrapCastInComparison {
8687 fn try_optimize (
8788 & self ,
88- plan : & LogicalPlan ,
89+ _plan : & LogicalPlan ,
8990 _config : & dyn OptimizerConfig ,
9091 ) -> Result < Option < LogicalPlan > > {
92+ internal_err ! ( "Should have called UnwrapCastInComparison::rewrite" )
93+ }
94+
95+ fn name ( & self ) -> & str {
96+ "unwrap_cast_in_comparison"
97+ }
98+
99+ fn apply_order ( & self ) -> Option < ApplyOrder > {
100+ Some ( ApplyOrder :: BottomUp )
101+ }
102+
103+ fn supports_rewrite ( & self ) -> bool {
104+ true
105+ }
106+
107+ fn rewrite (
108+ & self ,
109+ plan : LogicalPlan ,
110+ _config : & dyn OptimizerConfig ,
111+ ) -> Result < Transformed < LogicalPlan > > {
91112 let mut schema = merge_schema ( plan. inputs ( ) ) ;
92113
93- if let LogicalPlan :: TableScan ( ts) = plan {
114+ if let LogicalPlan :: TableScan ( ts) = & plan {
94115 let source_schema = DFSchema :: try_from_qualified_schema (
95116 ts. table_name . clone ( ) ,
96117 & ts. source . schema ( ) ,
@@ -104,22 +125,12 @@ impl OptimizerRule for UnwrapCastInComparison {
104125 schema : Arc :: new ( schema) ,
105126 } ;
106127
107- let new_exprs = plan
108- . expressions ( )
109- . into_iter ( )
110- . map ( |expr| rewrite_preserving_name ( expr, & mut expr_rewriter) )
111- . collect :: < Result < Vec < _ > > > ( ) ?;
112-
113- let inputs = plan. inputs ( ) . into_iter ( ) . cloned ( ) . collect ( ) ;
114- plan. with_new_exprs ( new_exprs, inputs) . map ( Some )
115- }
116-
117- fn name ( & self ) -> & str {
118- "unwrap_cast_in_comparison"
119- }
120-
121- fn apply_order ( & self ) -> Option < ApplyOrder > {
122- Some ( ApplyOrder :: BottomUp )
128+ let name_preserver = NamePreserver :: new ( & plan) ;
129+ plan. map_expressions ( |expr| {
130+ let original_name = name_preserver. save ( & expr) ?;
131+ expr. rewrite ( & mut expr_rewriter) ?
132+ . map_data ( |expr| original_name. restore ( expr) )
133+ } )
123134 }
124135}
125136
0 commit comments