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;