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

paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-nanoarrow.git


The following commit(s) were added to refs/heads/main by this push:
     new a1e259a0 fix: Correctly subscript ViewArrayAs with offset (#883)
a1e259a0 is described below

commit a1e259a0663f9e30e5eb6fd562675a29cb0d51eb
Author: Oliver Borchert <[email protected]>
AuthorDate: Sun May 17 04:09:38 2026 +0200

    fix: Correctly subscript ViewArrayAs with offset (#883)
    
    # Motivation
    
    There is currently a bug in `ViewArrayAs`: when using subscripting, it
    ignores the underlying array's offset, potentially yielding incorrect
    values.
---
 src/nanoarrow/hpp/view.hpp     |  2 +-
 src/nanoarrow/hpp/view_test.cc | 30 ++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/nanoarrow/hpp/view.hpp b/src/nanoarrow/hpp/view.hpp
index 0e38b353..342fb1e2 100644
--- a/src/nanoarrow/hpp/view.hpp
+++ b/src/nanoarrow/hpp/view.hpp
@@ -175,7 +175,7 @@ class ViewArrayAs {
   using const_iterator = typename 
internal::RandomAccessRange<Get>::const_iterator;
   const_iterator begin() const { return range_.begin(); }
   const_iterator end() const { return range_.end(); }
-  value_type operator[](int64_t i) const { return range_.get(i); }
+  value_type operator[](int64_t i) const { return range_.get(range_.offset + 
i); }
 };
 
 /// \brief A range-for compatible wrapper for ArrowArray of binary or utf8
diff --git a/src/nanoarrow/hpp/view_test.cc b/src/nanoarrow/hpp/view_test.cc
index 282b21e1..d420269e 100644
--- a/src/nanoarrow/hpp/view_test.cc
+++ b/src/nanoarrow/hpp/view_test.cc
@@ -223,6 +223,36 @@ TEST(NanoarrowHppTest, NanoarrowHppViewArrayOffsetTest) {
               testing::ElementsAre(2, 3));
 }
 
+TEST(NanoarrowHppTest, NanoarrowHppViewArrayAsSubscriptOffsetTest) {
+  nanoarrow::UniqueSchema schema{};
+  ArrowSchemaInit(schema.get());
+  ASSERT_EQ(ArrowSchemaSetType(schema.get(), NANOARROW_TYPE_INT32), 
NANOARROW_OK);
+
+  nanoarrow::UniqueArray array{};
+  ASSERT_EQ(ArrowArrayInitFromSchema(array.get(), schema.get(), nullptr), 
NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayStartAppending(array.get()), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendInt(array.get(), 10), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendInt(array.get(), 11), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendInt(array.get(), 12), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayAppendInt(array.get(), 13), NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayFinishBuildingDefault(array.get(), nullptr), 
NANOARROW_OK);
+  array->offset = 2;
+  array->length = 2;
+
+  nanoarrow::ViewArrayAs<int32_t> view(array.get());
+  EXPECT_EQ(*view[0], 12);
+  EXPECT_EQ(*view[1], 13);
+
+  nanoarrow::UniqueArrayView array_view{};
+  ASSERT_EQ(ArrowArrayViewInitFromSchema(array_view.get(), schema.get(), 
nullptr),
+            NANOARROW_OK);
+  ASSERT_EQ(ArrowArrayViewSetArray(array_view.get(), array.get(), nullptr), 
NANOARROW_OK);
+
+  nanoarrow::ViewArrayAs<int32_t> view_from_array_view(array_view.get());
+  EXPECT_EQ(*view_from_array_view[0], 12);
+  EXPECT_EQ(*view_from_array_view[1], 13);
+}
+
 TEST(NanoarrowHppTest, NanoarrowHppViewArrayAsBytesOffsetTest) {
   using namespace nanoarrow::literals;
 

Reply via email to