@@ -101,7 +101,9 @@ fn split_eq_and_noneq_join_predicate_with_nulls_equality(
101101 } ) => match ( left. as_ref ( ) , right. as_ref ( ) ) {
102102 ( Expr :: Column ( l) , Expr :: Column ( r) ) => match op {
103103 Operator :: Eq => eq_keys. push ( ( l. clone ( ) , r. clone ( ) ) ) ,
104- Operator :: IsNotDistinctFrom => indistinct_keys. push ( ( l. clone ( ) , r. clone ( ) ) ) ,
104+ Operator :: IsNotDistinctFrom => {
105+ indistinct_keys. push ( ( l. clone ( ) , r. clone ( ) ) )
106+ }
105107 _ => unreachable ! ( ) ,
106108 } ,
107109 _ => accum_filters. push ( expr. clone ( ) ) ,
@@ -110,26 +112,26 @@ fn split_eq_and_noneq_join_predicate_with_nulls_equality(
110112 }
111113 }
112114
113- let ( join_keys, null_equality) = match ( eq_keys. is_empty ( ) , indistinct_keys. is_empty ( ) )
114- {
115- // Mixed: use eq_keys as equijoin keys, demote indistinct keys to filter
116- ( false , false ) => {
117- for ( l, r) in & indistinct_keys {
118- accum_filters. push ( Expr :: BinaryExpr ( BinaryExpr {
119- left : Box :: new ( Expr :: Column ( l. clone ( ) ) ) ,
120- op : Operator :: IsNotDistinctFrom ,
121- right : Box :: new ( Expr :: Column ( r. clone ( ) ) ) ,
122- } ) ) ;
115+ let ( join_keys, null_equality) =
116+ match ( eq_keys. is_empty ( ) , indistinct_keys. is_empty ( ) ) {
117+ // Mixed: use eq_keys as equijoin keys, demote indistinct keys to filter
118+ ( false , false ) => {
119+ for ( l, r) in & indistinct_keys {
120+ accum_filters. push ( Expr :: BinaryExpr ( BinaryExpr {
121+ left : Box :: new ( Expr :: Column ( l. clone ( ) ) ) ,
122+ op : Operator :: IsNotDistinctFrom ,
123+ right : Box :: new ( Expr :: Column ( r. clone ( ) ) ) ,
124+ } ) ) ;
125+ }
126+ ( eq_keys, NullEquality :: NullEqualsNothing )
123127 }
124- ( eq_keys, NullEquality :: NullEqualsNothing )
125- }
126- // Only eq keys
127- ( false , true ) => ( eq_keys, NullEquality :: NullEqualsNothing ) ,
128- // Only indistinct keys
129- ( true , false ) => ( indistinct_keys, NullEquality :: NullEqualsNull ) ,
130- // No keys at all
131- ( true , true ) => ( vec ! [ ] , NullEquality :: NullEqualsNothing ) ,
132- } ;
128+ // Only eq keys
129+ ( false , true ) => ( eq_keys, NullEquality :: NullEqualsNothing ) ,
130+ // Only indistinct keys
131+ ( true , false ) => ( indistinct_keys, NullEquality :: NullEqualsNull ) ,
132+ // No keys at all
133+ ( true , true ) => ( vec ! [ ] , NullEquality :: NullEqualsNothing ) ,
134+ } ;
133135
134136 let join_filter = accum_filters. into_iter ( ) . reduce ( Expr :: and) ;
135137 ( join_keys, null_equality, join_filter)
@@ -224,7 +226,8 @@ mod tests {
224226 assert_eq ! ( null_eq, NullEquality :: NullEqualsNothing ) ;
225227
226228 // The IsNotDistinctFrom predicate should be demoted to the filter.
227- let filter = filter. expect ( "filter should contain the demoted indistinct predicate" ) ;
229+ let filter =
230+ filter. expect ( "filter should contain the demoted indistinct predicate" ) ;
228231 match & filter {
229232 Expr :: BinaryExpr ( BinaryExpr { left, op, right } ) => {
230233 assert_eq ! ( * op, Operator :: IsNotDistinctFrom ) ;
0 commit comments