Skip to content

Commit 96cede2

Browse files
authored
support LargeList in array_ndims (#8716)
1 parent d4b96a8 commit 96cede2

File tree

3 files changed

+77
-13
lines changed

3 files changed

+77
-13
lines changed

datafusion/common/src/utils.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -469,10 +469,11 @@ pub fn coerced_type_with_base_type_only(
469469

470470
/// Compute the number of dimensions in a list data type.
471471
pub fn list_ndims(data_type: &DataType) -> u64 {
472-
if let DataType::List(field) = data_type {
473-
1 + list_ndims(field.data_type())
474-
} else {
475-
0
472+
match data_type {
473+
DataType::List(field) | DataType::LargeList(field) => {
474+
1 + list_ndims(field.data_type())
475+
}
476+
_ => 0,
476477
}
477478
}
478479

datafusion/physical-expr/src/array_expressions.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2250,11 +2250,13 @@ pub fn array_ndims(args: &[ArrayRef]) -> Result<ArrayRef> {
22502250
return exec_err!("array_ndims needs one argument");
22512251
}
22522252

2253-
if let Some(list_array) = args[0].as_list_opt::<i32>() {
2254-
let ndims = datafusion_common::utils::list_ndims(list_array.data_type());
2253+
fn general_list_ndims<O: OffsetSizeTrait>(
2254+
array: &GenericListArray<O>,
2255+
) -> Result<ArrayRef> {
2256+
let mut data = Vec::new();
2257+
let ndims = datafusion_common::utils::list_ndims(array.data_type());
22552258

2256-
let mut data = vec![];
2257-
for arr in list_array.iter() {
2259+
for arr in array.iter() {
22582260
if arr.is_some() {
22592261
data.push(Some(ndims))
22602262
} else {
@@ -2263,8 +2265,18 @@ pub fn array_ndims(args: &[ArrayRef]) -> Result<ArrayRef> {
22632265
}
22642266

22652267
Ok(Arc::new(UInt64Array::from(data)) as ArrayRef)
2266-
} else {
2267-
Ok(Arc::new(UInt64Array::from(vec![0; args[0].len()])) as ArrayRef)
2268+
}
2269+
2270+
match args[0].data_type() {
2271+
DataType::List(_) => {
2272+
let array = as_list_array(&args[0])?;
2273+
general_list_ndims::<i32>(array)
2274+
}
2275+
DataType::LargeList(_) => {
2276+
let array = as_large_list_array(&args[0])?;
2277+
general_list_ndims::<i64>(array)
2278+
}
2279+
_ => Ok(Arc::new(UInt64Array::from(vec![0; args[0].len()])) as ArrayRef),
22682280
}
22692281
}
22702282

datafusion/sqllogictest/test_files/array.slt

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3504,7 +3504,7 @@ NULL [3] [4]
35043504
# array_ndims scalar function #1
35053505

35063506
query III
3507-
select
3507+
select
35083508
array_ndims(1),
35093509
array_ndims(null),
35103510
array_ndims([2, 3]);
@@ -3520,8 +3520,17 @@ AS VALUES
35203520
(3, [6], [[9]], [[[[[10]]]]])
35213521
;
35223522

3523+
statement ok
3524+
CREATE TABLE large_array_ndims_table
3525+
AS SELECT
3526+
column1,
3527+
arrow_cast(column2, 'LargeList(Int64)') as column2,
3528+
arrow_cast(column3, 'LargeList(List(Int64))') as column3,
3529+
arrow_cast(column4, 'LargeList(List(List(List(List(Int64)))))') as column4
3530+
FROM array_ndims_table;
3531+
35233532
query IIII
3524-
select
3533+
select
35253534
array_ndims(column1),
35263535
array_ndims(column2),
35273536
array_ndims(column3),
@@ -3533,9 +3542,25 @@ from array_ndims_table;
35333542
0 1 2 5
35343543
0 1 2 5
35353544

3545+
query IIII
3546+
select
3547+
array_ndims(column1),
3548+
array_ndims(column2),
3549+
array_ndims(column3),
3550+
array_ndims(column4)
3551+
from large_array_ndims_table;
3552+
----
3553+
0 1 2 5
3554+
0 1 2 5
3555+
0 1 2 5
3556+
0 1 2 5
3557+
35363558
statement ok
35373559
drop table array_ndims_table;
35383560

3561+
statement ok
3562+
drop table large_array_ndims_table
3563+
35393564
query I
35403565
select array_ndims(arrow_cast([null], 'List(List(List(Int64)))'));
35413566
----
@@ -3553,14 +3578,29 @@ select array_ndims(make_array()), array_ndims(make_array(make_array()))
35533578
----
35543579
1 2
35553580

3581+
query II
3582+
select array_ndims(arrow_cast(make_array(), 'LargeList(Null)')), array_ndims(arrow_cast(make_array(make_array()), 'LargeList(List(Null))'))
3583+
----
3584+
1 2
3585+
35563586
# list_ndims scalar function #4 (function alias `array_ndims`)
35573587
query III
35583588
select list_ndims(make_array(1, 2, 3)), list_ndims(make_array([1, 2], [3, 4])), list_ndims(make_array([[[[1], [2]]]]));
35593589
----
35603590
1 2 5
35613591

3592+
query III
3593+
select list_ndims(arrow_cast(make_array(1, 2, 3), 'LargeList(Int64)')), list_ndims(arrow_cast(make_array([1, 2], [3, 4]), 'LargeList(List(Int64))')), list_ndims(arrow_cast(make_array([[[[1], [2]]]]), 'LargeList(List(List(List(List(Int64)))))'));
3594+
----
3595+
1 2 5
3596+
35623597
query II
3563-
select array_ndims(make_array()), array_ndims(make_array(make_array()))
3598+
select list_ndims(make_array()), list_ndims(make_array(make_array()))
3599+
----
3600+
1 2
3601+
3602+
query II
3603+
select list_ndims(arrow_cast(make_array(), 'LargeList(Null)')), list_ndims(arrow_cast(make_array(make_array()), 'LargeList(List(Null))'))
35643604
----
35653605
1 2
35663606

@@ -3576,6 +3616,17 @@ NULL 1 1
35763616
2 NULL 1
35773617
2 1 NULL
35783618

3619+
query III
3620+
select array_ndims(column1), array_ndims(column2), array_ndims(column3) from large_arrays;
3621+
----
3622+
2 1 1
3623+
2 1 1
3624+
2 1 1
3625+
2 1 1
3626+
NULL 1 1
3627+
2 NULL 1
3628+
2 1 NULL
3629+
35793630
## array_has/array_has_all/array_has_any
35803631

35813632
query BBBBBBBBBBBB

0 commit comments

Comments
 (0)