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)]);