From 38553b1a17378cc889873df693101a2e6df894e4 Mon Sep 17 00:00:00 2001 From: Robert Kruszewski Date: Wed, 19 Aug 2026 11:44:01 +0100 Subject: [PATCH 1/2] Reject non zero offset Signed-off-by: Robert Kruszewski --- .../org/apache/arrow/c/ArrayImporter.java | 5 +++++ c/src/main/java/org/apache/arrow/c/Data.java | 3 ++- .../org/apache/arrow/c/RoundtripTest.java | 21 +++++++++++++++++++ docs/source/cdata.rst | 5 +++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/c/src/main/java/org/apache/arrow/c/ArrayImporter.java b/c/src/main/java/org/apache/arrow/c/ArrayImporter.java index f31a8a1faa..18ae7591b1 100644 --- a/c/src/main/java/org/apache/arrow/c/ArrayImporter.java +++ b/c/src/main/java/org/apache/arrow/c/ArrayImporter.java @@ -83,6 +83,11 @@ private void importChild(ArrayImporter parent, ArrowArray src) { } private void doImport(ArrowArray.Snapshot snapshot) { + checkState( + snapshot.offset == 0, + "ArrowArray struct has non-zero offset (%s), which is not supported", + snapshot.offset); + // First import children (required for reconstituting parent array data) long[] children = NativeUtil.toJavaArray(snapshot.children, checkedCastToInt(snapshot.n_children)); diff --git a/c/src/main/java/org/apache/arrow/c/Data.java b/c/src/main/java/org/apache/arrow/c/Data.java index f9d2ee4542..d870b5884d 100644 --- a/c/src/main/java/org/apache/arrow/c/Data.java +++ b/c/src/main/java/org/apache/arrow/c/Data.java @@ -35,7 +35,8 @@ /** * Functions for working with the C data interface. * - *

This API is EXPERIMENTAL. Note that currently only 64bit systems are supported. + *

This API is EXPERIMENTAL. Note that currently only 64bit systems are supported. Importing + * {@link ArrowArray ArrowArrays} with a non-zero offset is not supported. */ public final class Data { diff --git a/c/src/test/java/org/apache/arrow/c/RoundtripTest.java b/c/src/test/java/org/apache/arrow/c/RoundtripTest.java index f6ff88571e..efdf580aeb 100644 --- a/c/src/test/java/org/apache/arrow/c/RoundtripTest.java +++ b/c/src/test/java/org/apache/arrow/c/RoundtripTest.java @@ -1051,6 +1051,27 @@ public void testImportReleasedArray() { } } + @Test + public void testImportArrayWithNonZeroOffset() { + try (IntVector source = new IntVector("source", allocator); + IntVector destination = new IntVector("destination", allocator); + ArrowArray array = ArrowArray.allocateNew(allocator)) { + setVector(source, 1, 2, 3); + Data.exportVector(allocator, source, null, array); + + ArrowArray.Snapshot snapshot = array.snapshot(); + snapshot.offset = 1; + array.save(snapshot); + + Exception e = + assertThrows( + IllegalStateException.class, + () -> Data.importIntoVector(allocator, array, destination, null)); + assertEquals( + "ArrowArray struct has non-zero offset (1), which is not supported", e.getMessage()); + } + } + @Test public void testArrayStructReuse() { // Consumer allocates empty structures diff --git a/docs/source/cdata.rst b/docs/source/cdata.rst index 7b2924d259..d2b5ab0cc3 100644 --- a/docs/source/cdata.rst +++ b/docs/source/cdata.rst @@ -22,6 +22,11 @@ C Data Interface Arrow supports exchanging data without copying or serialization within the same process through :external+arrow:ref:`c-data-interface`, even between different language runtimes. +.. note:: + + The Arrow Java C Data Interface implementation does not support importing arrays with + a non-zero offset. + Java to Python -------------- From d897b9162c84bc1fcfffc2ff9bf5806931be9976 Mon Sep 17 00:00:00 2001 From: Robert Kruszewski Date: Wed, 19 Aug 2026 14:22:46 +0100 Subject: [PATCH 2/2] move --- c/src/main/java/org/apache/arrow/c/ArrayImporter.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/c/src/main/java/org/apache/arrow/c/ArrayImporter.java b/c/src/main/java/org/apache/arrow/c/ArrayImporter.java index 18ae7591b1..7c1cfca4f7 100644 --- a/c/src/main/java/org/apache/arrow/c/ArrayImporter.java +++ b/c/src/main/java/org/apache/arrow/c/ArrayImporter.java @@ -53,6 +53,10 @@ final class ArrayImporter { void importArray(ArrowArray src) { ArrowArray.Snapshot snapshot = src.snapshot(); checkState(snapshot.release != NULL, "Cannot import released ArrowArray"); + checkState( + snapshot.offset == 0, + "ArrowArray struct has non-zero offset (%s), which is not supported", + snapshot.offset); // Move imported array ArrowArray ownedArray = ArrowArray.allocateNew(allocator); @@ -83,11 +87,6 @@ private void importChild(ArrayImporter parent, ArrowArray src) { } private void doImport(ArrowArray.Snapshot snapshot) { - checkState( - snapshot.offset == 0, - "ArrowArray struct has non-zero offset (%s), which is not supported", - snapshot.offset); - // First import children (required for reconstituting parent array data) long[] children = NativeUtil.toJavaArray(snapshot.children, checkedCastToInt(snapshot.n_children));