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