Skip to content

Commit e52d150

Browse files
authored
feat: support LargeList in array_empty (#8321)
* support LargeList in array_empty * update err info
1 parent 513fd05 commit e52d150

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

datafusion/physical-expr/src/array_expressions.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ use arrow_buffer::NullBuffer;
3030

3131
use arrow_schema::FieldRef;
3232
use datafusion_common::cast::{
33-
as_generic_string_array, as_int64_array, as_list_array, as_string_array,
33+
as_generic_list_array, as_generic_string_array, as_int64_array, as_list_array,
34+
as_null_array, as_string_array,
3435
};
3536
use datafusion_common::utils::array_into_list_array;
3637
use datafusion_common::{
@@ -939,12 +940,21 @@ pub fn array_concat(args: &[ArrayRef]) -> Result<ArrayRef> {
939940

940941
/// Array_empty SQL function
941942
pub fn array_empty(args: &[ArrayRef]) -> Result<ArrayRef> {
942-
if args[0].as_any().downcast_ref::<NullArray>().is_some() {
943+
if as_null_array(&args[0]).is_ok() {
943944
// Make sure to return Boolean type.
944945
return Ok(Arc::new(BooleanArray::new_null(args[0].len())));
945946
}
947+
let array_type = args[0].data_type();
946948

947-
let array = as_list_array(&args[0])?;
949+
match array_type {
950+
DataType::List(_) => array_empty_dispatch::<i32>(&args[0]),
951+
DataType::LargeList(_) => array_empty_dispatch::<i64>(&args[0]),
952+
_ => internal_err!("array_empty does not support type '{array_type:?}'."),
953+
}
954+
}
955+
956+
fn array_empty_dispatch<O: OffsetSizeTrait>(array: &ArrayRef) -> Result<ArrayRef> {
957+
let array = as_generic_list_array::<O>(array)?;
948958
let builder = array
949959
.iter()
950960
.map(|arr| arr.map(|arr| arr.len() == arr.null_count()))

datafusion/sqllogictest/test_files/array.slt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3056,18 +3056,33 @@ select empty(make_array(1));
30563056
----
30573057
false
30583058

3059+
query B
3060+
select empty(arrow_cast(make_array(1), 'LargeList(Int64)'));
3061+
----
3062+
false
3063+
30593064
# empty scalar function #2
30603065
query B
30613066
select empty(make_array());
30623067
----
30633068
true
30643069

3070+
query B
3071+
select empty(arrow_cast(make_array(), 'LargeList(Null)'));
3072+
----
3073+
true
3074+
30653075
# empty scalar function #3
30663076
query B
30673077
select empty(make_array(NULL));
30683078
----
30693079
false
30703080

3081+
query B
3082+
select empty(arrow_cast(make_array(NULL), 'LargeList(Null)'));
3083+
----
3084+
false
3085+
30713086
# empty scalar function #4
30723087
query B
30733088
select empty(NULL);
@@ -3086,6 +3101,17 @@ NULL
30863101
false
30873102
false
30883103

3104+
query B
3105+
select empty(arrow_cast(column1, 'LargeList(List(Int64))')) from arrays;
3106+
----
3107+
false
3108+
false
3109+
false
3110+
false
3111+
NULL
3112+
false
3113+
false
3114+
30893115
query ?
30903116
SELECT string_to_array('abcxxxdef', 'xxx')
30913117
----

0 commit comments

Comments
 (0)