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 1922a57d59 [57_maintenance] fix: account for offset when building 
RunArray from ArrayData (#11800)
1922a57d59 is described below

commit 1922a57d5939a9964b29351cc09de8093e3533cf
Author: Jeffrey Vo <[email protected]>
AuthorDate: Fri Oct 23 00:17:09 2026 +0900

    [57_maintenance] fix: account for offset when building RunArray from 
ArrayData (#11800)
    
    - Backport https://github.com/apache/arrow-rs/pull/11660
    - For inclusion in https://github.com/apache/arrow-rs/issues/11666
    
    Cherry-pick of
    
https://github.com/apache/arrow-rs/commit/ee9f2a38f640f7147b2e849ea4fafa7f4333a45a
---
 arrow-array/src/array/run_array.rs | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/arrow-array/src/array/run_array.rs 
b/arrow-array/src/array/run_array.rs
index 3e722b7226..17852fa1fe 100644
--- a/arrow-array/src/array/run_array.rs
+++ b/arrow-array/src/array/run_array.rs
@@ -18,7 +18,7 @@
 use std::any::Any;
 use std::sync::Arc;
 
-use arrow_buffer::{ArrowNativeType, BooleanBufferBuilder, NullBuffer, 
RunEndBuffer};
+use arrow_buffer::{ArrowNativeType, BooleanBufferBuilder, NullBuffer, 
RunEndBuffer, ScalarBuffer};
 use arrow_data::{ArrayData, ArrayDataBuilder};
 use arrow_schema::{ArrowError, DataType, Field};
 
@@ -227,7 +227,7 @@ impl<R: RunEndIndexType> From<ArrayData> for RunArray<R> {
         let child = &data.child_data()[0];
         assert_eq!(child.data_type(), &R::DATA_TYPE, "Incorrect run ends 
type");
         let run_ends = unsafe {
-            let scalar = child.buffers()[0].clone().into();
+            let scalar = ScalarBuffer::new(child.buffers()[0].clone(), 
child.offset(), child.len());
             RunEndBuffer::new_unchecked(scalar, data.offset(), data.len())
         };
 
@@ -628,6 +628,7 @@ mod tests {
     use rand::seq::SliceRandom;
 
     use super::*;
+    use crate::Float32Array;
     use crate::builder::PrimitiveRunBuilder;
     use crate::cast::AsArray;
     use crate::types::{Int8Type, UInt32Type};
@@ -1130,4 +1131,32 @@ mod tests {
 
         assert_eq!(array_i16_1, array_i16_2);
     }
+
+    #[test]
+    fn test_from_array_data_offset() {
+        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(2)
+            .offset(2)
+            .add_buffer(vec![-10_i32, -20, 1_i32, 4, 0, 100].into())
+            .build()
+            .unwrap();
+        let values = Float32Array::from(vec![1.5, 2.5]);
+
+        let data = ArrayDataBuilder::new(dt)
+            .len(3)
+            .child_data(vec![runs, values.to_data()])
+            .build()
+            .unwrap();
+        let array = RunArray::<Int32Type>::from(data);
+        let array = array.downcast::<Float32Array>().unwrap();
+
+        assert_eq!(array.value(0), 1.5);
+        assert_eq!(array.value(1), 2.5);
+        assert_eq!(array.value(2), 2.5);
+    }
 }

Reply via email to