Skip to content

Commit 3efcd6a

Browse files
authored
Make scalar and array handling for array_has consistent (#13683)
* Make scalar and array handling for array_has consistent * Ignore null elements for scalars and arrays * Upate comment
1 parent 2938fb1 commit 3efcd6a

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

datafusion/functions-nested/src/array_has.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,7 @@ fn array_has_dispatch_for_array<O: OffsetSizeTrait>(
204204
let is_nested = arr.data_type().is_nested();
205205
let needle_row = Scalar::new(needle.slice(i, 1));
206206
let eq_array = compare_with_eq(&arr, &needle_row, is_nested)?;
207-
let is_contained = eq_array.true_count() > 0;
208-
boolean_builder.append_value(is_contained)
207+
boolean_builder.append_value(eq_array.true_count() > 0);
209208
}
210209

211210
Ok(Arc::new(boolean_builder.finish()))
@@ -238,10 +237,7 @@ fn array_has_dispatch_for_scalar<O: OffsetSizeTrait>(
238237
continue;
239238
}
240239
let sliced_array = eq_array.slice(start, length);
241-
// For nested list, check number of nulls
242-
if sliced_array.null_count() != length {
243-
final_contained[i] = Some(sliced_array.true_count() > 0);
244-
}
240+
final_contained[i] = Some(sliced_array.true_count() > 0);
245241
}
246242

247243
Ok(Arc::new(BooleanArray::from(final_contained)))

datafusion/sqllogictest/test_files/array.slt

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,16 @@ AS VALUES
352352
(arrow_cast(make_array([[1], [2]], [[2], [3]]), 'FixedSizeList(2, List(List(Int64)))'), arrow_cast(make_array([1], [2]), 'FixedSizeList(2, List(Int64))'))
353353
;
354354

355+
statement ok
356+
CREATE TABLE array_has_table_null
357+
AS VALUES
358+
(make_array(1, 2), 1),
359+
(make_array(1, NULL), 1),
360+
(make_array(3, 4, 5), 2),
361+
(make_array(3, NULL, 5), 2),
362+
(make_array(NULL, NULL, NULL), 2)
363+
;
364+
355365
statement ok
356366
CREATE TABLE array_distinct_table_1D
357367
AS VALUES
@@ -5260,6 +5270,13 @@ select array_has([], null),
52605270
----
52615271
NULL NULL NULL
52625272

5273+
# Always return false if not contained even if list has null elements
5274+
query BB
5275+
select array_has([1, null, 2], 3),
5276+
array_has([null, null, null], 3);
5277+
----
5278+
false false
5279+
52635280
#TODO: array_has_all and array_has_any cannot handle NULL
52645281
#query BBBB
52655282
#select array_has_any([], null),
@@ -5338,6 +5355,16 @@ from array_has_table_1D;
53385355
true true true
53395356
false false false
53405357

5358+
query B
5359+
select array_has(column1, column2)
5360+
from array_has_table_null;
5361+
----
5362+
true
5363+
true
5364+
false
5365+
false
5366+
false
5367+
53415368
query B
53425369
select array_has(column1, column2)
53435370
from fixed_size_array_has_table_1D;
@@ -5574,9 +5601,9 @@ false false false true
55745601
true false true false
55755602
true false false true
55765603
false true false false
5577-
NULL NULL false false
5578-
false false NULL false
5579-
false false false NULL
5604+
false false false false
5605+
false false false false
5606+
false false false false
55805607

55815608
query BBBBBBBBBBBBB
55825609
select array_has_all(make_array(1,2,3), make_array(1,3)),

0 commit comments

Comments
 (0)