This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch 58_maintenance
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/58_maintenance by this push:
new 3e753c5f78 [58_maintenance] fix: account for arraydata offset when
comparing runarrays (#11755)
3e753c5f78 is described below
commit 3e753c5f78effe91d00c62911de93e4e8c19ff7a
Author: Jeffrey Vo <[email protected]>
AuthorDate: Thu Oct 22 04:28:55 2026 +0900
[58_maintenance] fix: account for arraydata offset when comparing runarrays
(#11755)
- Backport https://github.com/apache/arrow-rs/pull/11536
- For inclusion in https://github.com/apache/arrow-rs/issues/11665
Cherry-pick of
https://github.com/apache/arrow-rs/commit/bfdcd26caebd331b928d3530097a97315af1442b
---
arrow-data/src/equal/run.rs | 9 +++++++--
arrow/tests/array_equal.rs | 40 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/arrow-data/src/equal/run.rs b/arrow-data/src/equal/run.rs
index 0032b56d1a..e54d0c8d74 100644
--- a/arrow-data/src/equal/run.rs
+++ b/arrow-data/src/equal/run.rs
@@ -18,6 +18,7 @@
use crate::data::ArrayData;
use arrow_buffer::ArrowNativeType;
use arrow_buffer::RunEndBuffer;
+use arrow_buffer::ScalarBuffer;
use arrow_schema::DataType;
use num_traits::ToPrimitive;
@@ -63,8 +64,12 @@ impl<'a, T: ArrowNativeType + ToPrimitive> RunArrayData<'a,
T> {
// SAFETY: we're reconstructing RunEndBuffer from a known valid
RunArray
let run_ends = unsafe {
RunEndBuffer::<T>::new_unchecked(
- raw_run_ends_buffer.clone().into(),
- run_ends_data.offset() + data.offset() + start,
+ ScalarBuffer::new(
+ raw_run_ends_buffer.clone(),
+ run_ends_data.offset(),
+ run_ends_data.len(),
+ ),
+ data.offset() + start,
len,
)
};
diff --git a/arrow/tests/array_equal.rs b/arrow/tests/array_equal.rs
index c21096c6dc..10ee149d34 100644
--- a/arrow/tests/array_equal.rs
+++ b/arrow/tests/array_equal.rs
@@ -27,7 +27,8 @@ use arrow_array::builder::{
};
use arrow_array::cast::AsArray;
use arrow_array::{
- DictionaryArray, FixedSizeListArray, GenericListViewArray, PrimitiveArray,
StringViewArray,
+ DictionaryArray, FixedSizeListArray, Float32Array, GenericListViewArray,
PrimitiveArray,
+ RunArray, StringViewArray,
};
use arrow_buffer::{Buffer, ToByteSlice};
use arrow_data::{ArrayData, ArrayDataBuilder};
@@ -1443,3 +1444,40 @@ fn test_list_excess_children_equal() {
assert_eq!(b.value_offsets(), &[0, 0, 2]);
assert_eq!(a, b);
}
+
+#[test]
+fn test_from_run_array_array_data_offset() {
+ let a = RunArray::try_new(
+ &Int32Array::from(vec![1, 3]),
+ &Float32Array::from(vec![1.5, 2.5]),
+ )
+ .unwrap()
+ .to_data();
+
+ // ensure if run_ends child has a physical offset, it is respected
+ // we construct & compare with ArrayData as other APIs will usually
normalize
+ // this physical offset to 0
+ let b = {
+ let dt = DataType::RunEndEncoded(
+ Arc::new(Field::new("run_ends", DataType::Int32, false)),
+ Arc::new(Field::new("values", DataType::Float32, true)),
+ );
+
+ let runs = ArrayData::builder(DataType::Int32)
+ .len(3)
+ .offset(1)
+ .add_buffer(vec![-20_i32, 1_i32, 2, 4, 0].into())
+ .build()
+ .unwrap();
+ let values = Float32Array::from(vec![1.5, 2.5, 2.5]);
+
+ ArrayDataBuilder::new(dt)
+ .len(3)
+ .offset(0)
+ .child_data(vec![runs, values.to_data()])
+ .build()
+ .unwrap()
+ };
+
+ assert_eq!(a, b);
+}