@@ -1789,18 +1789,27 @@ pub(super) fn equal_rows_arr(
17891789
17901790 let mut is_equal = true ;
17911791 for ( col_idx, cmp) in comparators. iter ( ) . enumerate ( ) {
1792- match ( null_equality, cmp ( left_idx, right_idx) ) {
1793- ( NullEquality :: NullEqualsNull , Ordering :: Equal ) => continue ,
1794- ( NullEquality :: NullEqualsNothing , Ordering :: Equal ) => {
1795- if left_arrays. get ( col_idx) . unwrap ( ) . is_null ( left_idx) {
1792+ let left_arr = left_arrays. get ( col_idx) . unwrap ( ) ;
1793+ let right_arr = right_arrays. get ( col_idx) . unwrap ( ) ;
1794+ let left_null = left_arr. data_type ( ) == & DataType :: Null || left_arr. is_null ( left_idx) ;
1795+ let right_null = right_arr. data_type ( ) == & DataType :: Null || right_arr. is_null ( right_idx) ;
1796+
1797+ match ( null_equality, left_null, right_null) {
1798+ ( NullEquality :: NullEqualsNull , true , true ) => continue , // Nulls match
1799+ ( NullEquality :: NullEqualsNothing , true , _) | ( NullEquality :: NullEqualsNothing , _, true ) => {
1800+ is_equal = false ; // Nulls never match
1801+ break ;
1802+ }
1803+ ( _, true , false ) | ( _, false , true ) => {
1804+ is_equal = false ; // Different null states
1805+ break ;
1806+ }
1807+ ( _, false , false ) => {
1808+ if cmp ( left_idx, right_idx) != Ordering :: Equal {
17961809 is_equal = false ;
17971810 break ;
17981811 }
17991812 }
1800- _ => {
1801- is_equal = false ;
1802- break ;
1803- }
18041813 }
18051814 }
18061815
0 commit comments