This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch 57_maintenance
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/57_maintenance by this push:
     new b0d0466736 [57_maintenance] fix(arrow-data): account for FixedSizeList 
parent offset in MutableArrayData (#11809)
b0d0466736 is described below

commit b0d0466736f62f4fde6404757b01f2bda17342ef
Author: Jeffrey Vo <[email protected]>
AuthorDate: Fri Oct 23 00:20:46 2026 +0900

    [57_maintenance] fix(arrow-data): account for FixedSizeList parent offset 
in MutableArrayData (#11809)
    
    - Backport https://github.com/apache/arrow-rs/pull/11636
    - For inclusion in https://github.com/apache/arrow-rs/issues/11666
    
    Cherry-pick of
    
https://github.com/apache/arrow-rs/commit/9827aaad30258bf348a0d4f2b792505d6d24a88f
    
    Co-authored-by: Chang Yong Lik <[email protected]>
---
 arrow-data/src/data.rs                      | 25 +++++++++++++++++++++++++
 arrow-data/src/transform/fixed_size_list.rs | 18 ++++++++++++++----
 2 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/arrow-data/src/data.rs b/arrow-data/src/data.rs
index 981f0e696f..9d98f75643 100644
--- a/arrow-data/src/data.rs
+++ b/arrow-data/src/data.rs
@@ -2191,6 +2191,8 @@ impl From<ArrayData> for ArrayDataBuilder {
 
 #[cfg(test)]
 mod tests {
+    use crate::transform::MutableArrayData;
+
     use super::*;
     use arrow_schema::{Field, Fields};
 
@@ -2258,6 +2260,29 @@ mod tests {
         assert_eq!(child_arr_data, arr_data.child_data()[0]);
     }
 
+    #[test]
+    fn test_extend_fixed_size_list_accounts_for_parent_offset() {
+        let field = Arc::new(Field::new("item", DataType::Int32, false));
+        let child = ArrayData::builder(DataType::Int32)
+            .len(6)
+            .add_buffer(Buffer::from_slice_ref([0, 1, 2, 3, 4, 5]))
+            .build()
+            .unwrap();
+
+        let data = ArrayData::builder(DataType::FixedSizeList(field, 2))
+            .len(2)
+            .offset(1)
+            .add_child_data(child)
+            .build()
+            .unwrap();
+
+        let mut mutable = MutableArrayData::new(vec![&data], false, 
data.len());
+        mutable.extend(0, 0, data.len());
+        let output = mutable.freeze();
+
+        assert_eq!(output.child_data()[0].buffer::<i32>(0), &[2, 3, 4, 5]);
+    }
+
     #[test]
     fn test_null_count() {
         let mut bit_v: [u8; 2] = [0; 2];
diff --git a/arrow-data/src/transform/fixed_size_list.rs 
b/arrow-data/src/transform/fixed_size_list.rs
index ada1a2f763..78d6415c8a 100644
--- a/arrow-data/src/transform/fixed_size_list.rs
+++ b/arrow-data/src/transform/fixed_size_list.rs
@@ -25,13 +25,23 @@ pub(super) fn build_extend(array: &ArrayData) -> Extend<'_> 
{
         DataType::FixedSizeList(_, i) => *i as usize,
         _ => unreachable!(),
     };
+    let offset = array.offset();
 
     Box::new(
         move |mutable: &mut _MutableArrayData, index: usize, start: usize, 
len: usize| {
-            mutable
-                .child_data
-                .iter_mut()
-                .for_each(|child| child.extend(index, start * size, (start + 
len) * size))
+            let start = start
+                .checked_add(offset)
+                .expect("fixed size list range overflows usize");
+            let end = start
+                .checked_add(len)
+                .expect("fixed size list range overflows usize");
+            let (child_start, child_end) = start
+                .checked_mul(size)
+                .zip(end.checked_mul(size))
+                .expect("fixed size list range overflows usize");
+            for child in &mut mutable.child_data {
+                child.extend(index, child_start, child_end);
+            }
         },
     )
 }

Reply via email to