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));
+    }
 }

Reply via email to