@@ -33,8 +33,11 @@ use crate::file_scan_config::FileScanConfig;
3333use datafusion_common:: config:: ConfigOptions ;
3434use datafusion_common:: { Constraints , Result , Statistics } ;
3535use datafusion_execution:: { SendableRecordBatchStream , TaskContext } ;
36- use datafusion_physical_expr:: { EquivalenceProperties , Partitioning , PhysicalExpr } ;
36+ use datafusion_physical_expr:: {
37+ conjunction, EquivalenceProperties , Partitioning , PhysicalExpr ,
38+ } ;
3739use datafusion_physical_expr_common:: sort_expr:: LexOrdering ;
40+ use datafusion_physical_plan:: filter:: collect_columns_from_predicate;
3841use datafusion_physical_plan:: filter_pushdown:: {
3942 ChildPushdownResult , FilterPushdownPropagation ,
4043} ;
@@ -328,6 +331,9 @@ impl ExecutionPlan for DataSourceExec {
328331 new_node. data_source = data_source;
329332 new_node. cache =
330333 Self :: compute_properties ( Arc :: clone ( & new_node. data_source ) ) ;
334+ // Add the missing filters' equivalence info when filters pushdown is applied
335+ let filter = conjunction ( res. filters . collect_supported ( ) ) ;
336+ new_node = new_node. add_filter_equivalence_info ( filter) ?;
331337 Ok ( FilterPushdownPropagation {
332338 filters : res. filters ,
333339 updated_node : Some ( Arc :: new ( new_node) ) ,
@@ -374,6 +380,20 @@ impl DataSourceExec {
374380 self
375381 }
376382
383+ /// Add filters' equivalence info
384+ fn add_filter_equivalence_info (
385+ mut self ,
386+ filter : Arc < dyn PhysicalExpr > ,
387+ ) -> Result < Self > {
388+ let ( equal_pairs, _) = collect_columns_from_predicate ( & filter) ;
389+ for ( lhs, rhs) in equal_pairs {
390+ self . cache
391+ . eq_properties
392+ . add_equal_conditions ( & Arc :: clone ( lhs) , & Arc :: clone ( rhs) ) ?
393+ }
394+ Ok ( self )
395+ }
396+
377397 fn compute_properties ( data_source : Arc < dyn DataSource > ) -> PlanProperties {
378398 PlanProperties :: new (
379399 data_source. eq_properties ( ) ,
0 commit comments