diff --git a/datafusion/functions-nested/src/array_has.rs b/datafusion/functions-nested/src/array_has.rs index 7f66eba5df08..dec964df2129 100644 --- a/datafusion/functions-nested/src/array_has.rs +++ b/datafusion/functions-nested/src/array_has.rs @@ -21,6 +21,7 @@ use arrow::array::{Array, ArrayRef, BooleanArray, OffsetSizeTrait}; use arrow::datatypes::DataType; use arrow::row::{RowConverter, Rows, SortField}; use arrow_array::{Datum, GenericListArray, Scalar}; +use arrow_buffer::BooleanBuffer; use datafusion_common::cast::as_generic_list_array; use datafusion_common::utils::string_utils::string_array_to_vec; use datafusion_common::{exec_err, Result, ScalarValue}; @@ -200,7 +201,10 @@ fn array_has_dispatch_for_scalar( // If first argument is empty list (second argument is non-null), return false // i.e. array_has([], non-null element) -> false if values.len() == 0 { - return Ok(Arc::new(BooleanArray::from(vec![Some(false)]))); + return Ok(Arc::new(BooleanArray::new( + BooleanBuffer::new_unset(haystack.len()), + None, + ))); } let eq_array = compare_with_eq(values, needle, is_nested)?; let mut final_contained = vec![None; haystack.len()]; diff --git a/datafusion/sqllogictest/test_files/array.slt b/datafusion/sqllogictest/test_files/array.slt index 72b057b44473..b7d60b50586d 100644 --- a/datafusion/sqllogictest/test_files/array.slt +++ b/datafusion/sqllogictest/test_files/array.slt @@ -7086,6 +7086,16 @@ select [1,2,3]::int[], [['1']]::int[][], arrow_typeof([]::text[]); ---- [1, 2, 3] [[1]] List(Field { name: "item", data_type: Utf8, nullable: true, dict_id: 0, dict_is_ordered: false, metadata: {} }) +# test empty arrays return length +# issue: https://github.com/apache/datafusion/pull/12459 +statement ok +create table values_all_empty (a int[]) as values ([]), ([]); + +query B +select array_has(a, 1) from values_all_empty; +---- +false +false ### Delete tables @@ -7259,3 +7269,6 @@ drop table fixed_size_arrays_values_without_nulls; statement ok drop table test_create_array_table; + +statement ok +drop table values_all_empty;