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..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); 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 --------------