1818use crate :: logical_plan:: consumer:: SubstraitConsumer ;
1919use datafusion:: common:: { Column , JoinType , NullEquality , not_impl_err, plan_err} ;
2020use datafusion:: logical_expr:: requalify_sides_if_needed;
21- use datafusion:: logical_expr:: utils:: split_conjunction ;
21+ use datafusion:: logical_expr:: utils:: split_conjunction_owned ;
2222use datafusion:: logical_expr:: {
2323 BinaryExpr , Expr , LogicalPlan , LogicalPlanBuilder , Operator ,
2424} ;
@@ -57,7 +57,7 @@ pub async fn from_join_rel(
5757 // - If an Eq or IsNotDistinctFrom op is encountered, add the left column, right column and is_null_equal_nulls to `join_ons` vector
5858 // - Otherwise we add the expression to join_filter (use conjunction if filter already exists)
5959 let ( join_ons, null_equality, join_filter) =
60- split_eq_and_noneq_join_predicate_with_nulls_equality ( & on) ;
60+ split_eq_and_noneq_join_predicate_with_nulls_equality ( on) ;
6161 let ( left_cols, right_cols) : ( Vec < _ > , Vec < _ > ) =
6262 itertools:: multiunzip ( join_ons) ;
6363 left. join_detailed (
@@ -84,9 +84,9 @@ pub async fn from_join_rel(
8484}
8585
8686fn split_eq_and_noneq_join_predicate_with_nulls_equality (
87- filter : & Expr ,
87+ filter : Expr ,
8888) -> ( Vec < ( Column , Column ) > , NullEquality , Option < Expr > ) {
89- let exprs = split_conjunction ( filter) ;
89+ let exprs = split_conjunction_owned ( filter) ;
9090
9191 let mut eq_keys: Vec < ( Column , Column ) > = vec ! [ ] ;
9292 let mut indistinct_keys: Vec < ( Column , Column ) > = vec ! [ ] ;
@@ -98,29 +98,33 @@ fn split_eq_and_noneq_join_predicate_with_nulls_equality(
9898 left,
9999 op : op @ ( Operator :: Eq | Operator :: IsNotDistinctFrom ) ,
100100 right,
101- } ) => match ( left. as_ref ( ) , right. as_ref ( ) ) {
101+ } ) => match ( * left, * right) {
102102 ( Expr :: Column ( l) , Expr :: Column ( r) ) => match op {
103- Operator :: Eq => eq_keys. push ( ( l. clone ( ) , r. clone ( ) ) ) ,
104- Operator :: IsNotDistinctFrom => {
105- indistinct_keys. push ( ( l. clone ( ) , r. clone ( ) ) )
106- }
103+ Operator :: Eq => eq_keys. push ( ( l, r) ) ,
104+ Operator :: IsNotDistinctFrom => indistinct_keys. push ( ( l, r) ) ,
107105 _ => unreachable ! ( ) ,
108106 } ,
109- _ => accum_filters. push ( expr. clone ( ) ) ,
107+ ( left, right) => {
108+ accum_filters. push ( Expr :: BinaryExpr ( BinaryExpr {
109+ left : Box :: new ( left) ,
110+ op,
111+ right : Box :: new ( right) ,
112+ } ) ) ;
113+ }
110114 } ,
111- _ => accum_filters. push ( expr. clone ( ) ) ,
115+ _ => accum_filters. push ( expr) ,
112116 }
113117 }
114118
115119 let ( join_keys, null_equality) =
116120 match ( eq_keys. is_empty ( ) , indistinct_keys. is_empty ( ) ) {
117121 // Mixed: use eq_keys as equijoin keys, demote indistinct keys to filter
118122 ( false , false ) => {
119- for ( l, r) in & indistinct_keys {
123+ for ( l, r) in indistinct_keys {
120124 accum_filters. push ( Expr :: BinaryExpr ( BinaryExpr {
121- left : Box :: new ( Expr :: Column ( l. clone ( ) ) ) ,
125+ left : Box :: new ( Expr :: Column ( l) ) ,
122126 op : Operator :: IsNotDistinctFrom ,
123- right : Box :: new ( Expr :: Column ( r. clone ( ) ) ) ,
127+ right : Box :: new ( Expr :: Column ( r) ) ,
124128 } ) ) ;
125129 }
126130 ( eq_keys, NullEquality :: NullEqualsNothing )
@@ -175,7 +179,7 @@ mod tests {
175179 } ) ;
176180
177181 let ( keys, null_eq, filter) =
178- split_eq_and_noneq_join_predicate_with_nulls_equality ( & expr) ;
182+ split_eq_and_noneq_join_predicate_with_nulls_equality ( expr) ;
179183
180184 assert_eq ! ( keys. len( ) , 1 ) ;
181185 assert_eq ! ( null_eq, NullEquality :: NullEqualsNothing ) ;
@@ -192,7 +196,7 @@ mod tests {
192196 } ) ;
193197
194198 let ( keys, null_eq, filter) =
195- split_eq_and_noneq_join_predicate_with_nulls_equality ( & expr) ;
199+ split_eq_and_noneq_join_predicate_with_nulls_equality ( expr) ;
196200
197201 assert_eq ! ( keys. len( ) , 1 ) ;
198202 assert_eq ! ( null_eq, NullEquality :: NullEqualsNull ) ;
@@ -217,7 +221,7 @@ mod tests {
217221 } ) ) ;
218222
219223 let ( keys, null_eq, filter) =
220- split_eq_and_noneq_join_predicate_with_nulls_equality ( & expr) ;
224+ split_eq_and_noneq_join_predicate_with_nulls_equality ( expr) ;
221225
222226 // Only the Eq key should be an equijoin key.
223227 assert_eq ! ( keys. len( ) , 1 ) ;
@@ -251,7 +255,7 @@ mod tests {
251255 } ) ;
252256
253257 let ( keys, _, filter) =
254- split_eq_and_noneq_join_predicate_with_nulls_equality ( & expr) ;
258+ split_eq_and_noneq_join_predicate_with_nulls_equality ( expr) ;
255259
256260 assert ! ( keys. is_empty( ) ) ;
257261 assert ! ( filter. is_some( ) ) ;
0 commit comments