Skip to content

Commit 597c903

Browse files
authored
fix: Support interleave_struct to handle empty fields (#8563)
# Which issue does this PR close? - Closes #8533 # Rationale for this change # What changes are included in this PR? # Are these changes tested? Yes # Are there any user-facing changes? No
1 parent 7e5076f commit 597c903

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

arrow-select/src/interleave.rs

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -286,21 +286,29 @@ fn interleave_struct(
286286
) -> Result<ArrayRef, ArrowError> {
287287
let interleaved = Interleave::<'_, StructArray>::new(values, indices);
288288

289-
let mut struct_fields_array = vec![];
290-
291-
for i in 0..fields.len() {
292-
let field_values: Vec<&dyn Array> = interleaved
293-
.arrays
294-
.iter()
295-
.map(|x| x.column(i).as_ref())
296-
.collect();
297-
let interleaved = interleave(&field_values, indices)?;
298-
struct_fields_array.push(interleaved);
289+
if fields.is_empty() {
290+
let array = StructArray::try_new_with_length(
291+
fields.clone(),
292+
vec![],
293+
interleaved.nulls,
294+
indices.len(),
295+
)?;
296+
return Ok(Arc::new(array));
299297
}
300298

301-
let struct_array =
302-
StructArray::try_new(fields.clone(), struct_fields_array, interleaved.nulls)?;
299+
let struct_fields_array: Result<Vec<_>, _> = (0..fields.len())
300+
.map(|i| {
301+
let field_values: Vec<&dyn Array> = interleaved
302+
.arrays
303+
.iter()
304+
.map(|x| x.column(i).as_ref())
305+
.collect();
306+
interleave(&field_values, indices)
307+
})
308+
.collect();
303309

310+
let struct_array =
311+
StructArray::try_new(fields.clone(), struct_fields_array?, interleaved.nulls)?;
304312
Ok(Arc::new(struct_array))
305313
}
306314

@@ -1165,4 +1173,13 @@ mod tests {
11651173
}
11661174
assert_eq!(actual, expected);
11671175
}
1176+
1177+
#[test]
1178+
fn test_struct_no_fields() {
1179+
let fields = Fields::empty();
1180+
let a = StructArray::try_new_with_length(fields.clone(), vec![], None, 10).unwrap();
1181+
let v = interleave(&[&a], &[(0, 0)]).unwrap();
1182+
assert_eq!(v.len(), 1);
1183+
assert_eq!(v.data_type(), &DataType::Struct(fields));
1184+
}
11681185
}

0 commit comments

Comments
 (0)