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

Reply via email to