This is an automated email from the ASF dual-hosted git repository.

tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new c2b0aa5fae fix(select): handle `NullArray` in `nullif` (#4635)
c2b0aa5fae is described below

commit c2b0aa5fae68eedfadd9285a0b4d76e48dc29a6d
Author: Tomoaki Kawada <[email protected]>
AuthorDate: Thu Aug 3 19:15:44 2023 +0900

    fix(select): handle `NullArray` in `nullif` (#4635)
    
    * test(select): add a test case passing `NullArray` to `nullif`
    
    * fix(select): handle `NullArray` in `nullif`
    
    * test(select): remove `as_null_array` calls
    
    `dyn Array + '_` implements `PartialEq<impl Array>`, so the unwrapped
    result of `nullif` can be compared against `NullArray` without
    downcasting it first.
    
    Co-authored-by: Raphael Taylor-Davies 
<[email protected]>
    
    ---------
    
    Co-authored-by: Raphael Taylor-Davies 
<[email protected]>
---
 arrow-select/src/nullif.rs | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/arrow-select/src/nullif.rs b/arrow-select/src/nullif.rs
index ab68e8c2f0..f0bcb73ccc 100644
--- a/arrow-select/src/nullif.rs
+++ b/arrow-select/src/nullif.rs
@@ -18,7 +18,7 @@
 use arrow_array::{make_array, Array, ArrayRef, BooleanArray};
 use arrow_buffer::buffer::{bitwise_bin_op_helper, bitwise_unary_op_helper};
 use arrow_buffer::{BooleanBuffer, NullBuffer};
-use arrow_schema::ArrowError;
+use arrow_schema::{ArrowError, DataType};
 
 /// Copies original array, setting validity bit to false if a secondary 
comparison
 /// boolean array is set to true
@@ -35,7 +35,7 @@ pub fn nullif(left: &dyn Array, right: &BooleanArray) -> 
Result<ArrayRef, ArrowE
     }
     let len = left_data.len();
 
-    if len == 0 {
+    if len == 0 || left_data.data_type() == &DataType::Null {
         return Ok(make_array(left_data));
     }
 
@@ -102,7 +102,7 @@ mod tests {
     use arrow_array::builder::{BooleanBuilder, Int32Builder, StructBuilder};
     use arrow_array::cast::AsArray;
     use arrow_array::types::Int32Type;
-    use arrow_array::{Int32Array, StringArray, StructArray};
+    use arrow_array::{Int32Array, NullArray, StringArray, StructArray};
     use arrow_data::ArrayData;
     use arrow_schema::{DataType, Field, Fields};
     use rand::{thread_rng, Rng};
@@ -128,6 +128,26 @@ mod tests {
         assert_eq!(&expected, res);
     }
 
+    #[test]
+    fn test_nullif_null_array() {
+        assert_eq!(
+            nullif(&NullArray::new(0), &BooleanArray::new_null(0))
+                .unwrap()
+                .as_ref(),
+            &NullArray::new(0)
+        );
+
+        assert_eq!(
+            nullif(
+                &NullArray::new(3),
+                &BooleanArray::from(vec![Some(false), Some(true), None]),
+            )
+            .unwrap()
+            .as_ref(),
+            &NullArray::new(3)
+        );
+    }
+
     #[test]
     fn test_nullif_int_array_offset() {
         let a = Int32Array::from(vec![None, Some(15), Some(8), Some(1), 
Some(9)]);

Reply via email to