This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/main by this push:
new 597c90344e fix: Support `interleave_struct` to handle empty fields
(#8563)
597c90344e is described below
commit 597c90344e62b9240a7b7ac675f846974750113a
Author: Alex Huang <[email protected]>
AuthorDate: Sat Oct 11 16:13:16 2025 +0300
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
---
arrow-select/src/interleave.rs | 41 +++++++++++++++++++++++++++++------------
1 file changed, 29 insertions(+), 12 deletions(-)
diff --git a/arrow-select/src/interleave.rs b/arrow-select/src/interleave.rs
index d5496d9828..1453995a0a 100644
--- a/arrow-select/src/interleave.rs
+++ b/arrow-select/src/interleave.rs
@@ -286,21 +286,29 @@ fn interleave_struct(
) -> Result<ArrayRef, ArrowError> {
let interleaved = Interleave::<'_, StructArray>::new(values, indices);
- let mut struct_fields_array = vec![];
-
- for i in 0..fields.len() {
- let field_values: Vec<&dyn Array> = interleaved
- .arrays
- .iter()
- .map(|x| x.column(i).as_ref())
- .collect();
- let interleaved = interleave(&field_values, indices)?;
- struct_fields_array.push(interleaved);
+ if fields.is_empty() {
+ let array = StructArray::try_new_with_length(
+ fields.clone(),
+ vec![],
+ interleaved.nulls,
+ indices.len(),
+ )?;
+ return Ok(Arc::new(array));
}
- let struct_array =
- StructArray::try_new(fields.clone(), struct_fields_array,
interleaved.nulls)?;
+ let struct_fields_array: Result<Vec<_>, _> = (0..fields.len())
+ .map(|i| {
+ let field_values: Vec<&dyn Array> = interleaved
+ .arrays
+ .iter()
+ .map(|x| x.column(i).as_ref())
+ .collect();
+ interleave(&field_values, indices)
+ })
+ .collect();
+ let struct_array =
+ StructArray::try_new(fields.clone(), struct_fields_array?,
interleaved.nulls)?;
Ok(Arc::new(struct_array))
}
@@ -1165,4 +1173,13 @@ mod tests {
}
assert_eq!(actual, expected);
}
+
+ #[test]
+ fn test_struct_no_fields() {
+ let fields = Fields::empty();
+ let a = StructArray::try_new_with_length(fields.clone(), vec![], None,
10).unwrap();
+ let v = interleave(&[&a], &[(0, 0)]).unwrap();
+ assert_eq!(v.len(), 1);
+ assert_eq!(v.data_type(), &DataType::Struct(fields));
+ }
}