Skip to content

Commit

Permalink
Make scalar and array handling for array_has consistent (#13683)
Browse files Browse the repository at this point in the history
* Make scalar and array handling for array_has consistent

* Ignore null elements for scalars and arrays

* Upate comment
  • Loading branch information
Kimahriman authored Jan 22, 2025
1 parent 2938fb1 commit 3efcd6a
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 9 deletions.
8 changes: 2 additions & 6 deletions datafusion/functions-nested/src/array_has.rs
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,7 @@ fn array_has_dispatch_for_array<O: OffsetSizeTrait>(
let is_nested = arr.data_type().is_nested();
let needle_row = Scalar::new(needle.slice(i, 1));
let eq_array = compare_with_eq(&arr, &needle_row, is_nested)?;
let is_contained = eq_array.true_count() > 0;
boolean_builder.append_value(is_contained)
boolean_builder.append_value(eq_array.true_count() > 0);
}

Ok(Arc::new(boolean_builder.finish()))
Expand Down Expand Up @@ -238,10 +237,7 @@ fn array_has_dispatch_for_scalar<O: OffsetSizeTrait>(
continue;
}
let sliced_array = eq_array.slice(start, length);
// For nested list, check number of nulls
if sliced_array.null_count() != length {
final_contained[i] = Some(sliced_array.true_count() > 0);
}
final_contained[i] = Some(sliced_array.true_count() > 0);
}

Ok(Arc::new(BooleanArray::from(final_contained)))
Expand Down
33 changes: 30 additions & 3 deletions datafusion/sqllogictest/test_files/array.slt
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,16 @@ AS VALUES
(arrow_cast(make_array([[1], [2]], [[2], [3]]), 'FixedSizeList(2, List(List(Int64)))'), arrow_cast(make_array([1], [2]), 'FixedSizeList(2, List(Int64))'))
;

statement ok
CREATE TABLE array_has_table_null
AS VALUES
(make_array(1, 2), 1),
(make_array(1, NULL), 1),
(make_array(3, 4, 5), 2),
(make_array(3, NULL, 5), 2),
(make_array(NULL, NULL, NULL), 2)
;

statement ok
CREATE TABLE array_distinct_table_1D
AS VALUES
Expand Down Expand Up @@ -5260,6 +5270,13 @@ select array_has([], null),
----
NULL NULL NULL

# Always return false if not contained even if list has null elements
query BB
select array_has([1, null, 2], 3),
array_has([null, null, null], 3);
----
false false

#TODO: array_has_all and array_has_any cannot handle NULL
#query BBBB
#select array_has_any([], null),
Expand Down Expand Up @@ -5338,6 +5355,16 @@ from array_has_table_1D;
true true true
false false false

query B
select array_has(column1, column2)
from array_has_table_null;
----
true
true
false
false
false

query B
select array_has(column1, column2)
from fixed_size_array_has_table_1D;
Expand Down Expand Up @@ -5574,9 +5601,9 @@ false false false true
true false true false
true false false true
false true false false
NULL NULL false false
false false NULL false
false false false NULL
false false false false
false false false false
false false false false

query BBBBBBBBBBBBB
select array_has_all(make_array(1,2,3), make_array(1,3)),
Expand Down

0 comments on commit 3efcd6a

Please sign in to comment.