Skip to content

Commit a50a525

Browse files
authored
fix: cast inner fsl to list in flatten (#15898)
1 parent 1e756b3 commit a50a525

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

datafusion/functions-nested/src/flatten.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,11 @@ pub fn flatten_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
145145

146146
match array.data_type() {
147147
List(_) => {
148-
let (field, offsets, values, nulls) =
148+
let (_field, offsets, values, nulls) =
149149
as_list_array(&array)?.clone().into_parts();
150+
let values = cast_fsl_to_list(values)?;
150151

151-
match field.data_type() {
152+
match values.data_type() {
152153
List(_) => {
153154
let (inner_field, inner_offsets, inner_values, _) =
154155
as_list_array(&values)?.clone().into_parts();
@@ -169,10 +170,11 @@ pub fn flatten_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
169170
}
170171
}
171172
LargeList(_) => {
172-
let (field, offsets, values, nulls) =
173+
let (_field, offsets, values, nulls) =
173174
as_large_list_array(&array)?.clone().into_parts();
175+
let values = cast_fsl_to_list(values)?;
174176

175-
match field.data_type() {
177+
match values.data_type() {
176178
List(_) => {
177179
let (inner_field, inner_offsets, inner_values, _) =
178180
as_list_array(&values)?.clone().into_parts();
@@ -234,3 +236,12 @@ fn get_large_offsets_for_flatten<O: OffsetSizeTrait, P: OffsetSizeTrait>(
234236
.collect();
235237
OffsetBuffer::new(offsets.into())
236238
}
239+
240+
fn cast_fsl_to_list(array: ArrayRef) -> Result<ArrayRef> {
241+
match array.data_type() {
242+
FixedSizeList(field, _) => {
243+
Ok(arrow::compute::cast(&array, &List(Arc::clone(field)))?)
244+
}
245+
_ => Ok(array),
246+
}
247+
}

0 commit comments

Comments
 (0)