diff --git a/java/c/src/main/java/org/apache/arrow/c/ArrowSchema.java b/java/c/src/main/java/org/apache/arrow/c/ArrowSchema.java index 06e401627ef01..ad9f16ae9ceed 100644 --- a/java/c/src/main/java/org/apache/arrow/c/ArrowSchema.java +++ b/java/c/src/main/java/org/apache/arrow/c/ArrowSchema.java @@ -52,6 +52,7 @@ */ public class ArrowSchema implements BaseStruct { private static final int SIZE_OF = 72; + private static final int INDEX_RELEASE_CALLBACK = 56; private ArrowBuf data; @@ -103,7 +104,9 @@ public static ArrowSchema wrap(long memoryAddress) { * @return A new ArrowSchema instance */ public static ArrowSchema allocateNew(BufferAllocator allocator) { - return new ArrowSchema(allocator.buffer(ArrowSchema.SIZE_OF)); + ArrowSchema schema = new ArrowSchema(allocator.buffer(ArrowSchema.SIZE_OF)); + schema.markReleased(); + return schema; } ArrowSchema(ArrowBuf data) { @@ -111,6 +114,11 @@ public static ArrowSchema allocateNew(BufferAllocator allocator) { this.data = data; } + /** Mark the schema as released. */ + public void markReleased() { + directBuffer().putLong(INDEX_RELEASE_CALLBACK, NULL); + } + @Override public long memoryAddress() { checkNotNull(data, "ArrowSchema is already closed"); diff --git a/java/c/src/test/java/org/apache/arrow/c/ArrowArrayUtilityTest.java b/java/c/src/test/java/org/apache/arrow/c/ArrowArrayUtilityTest.java index 1d4cb411fab45..511358a5e62fa 100644 --- a/java/c/src/test/java/org/apache/arrow/c/ArrowArrayUtilityTest.java +++ b/java/c/src/test/java/org/apache/arrow/c/ArrowArrayUtilityTest.java @@ -50,6 +50,13 @@ void afterEach() { allocator.close(); } + @Test + void arraySchemaInit() { + ArrowSchema schema = ArrowSchema.allocateNew(allocator); + assertThat(schema.snapshot().release).isEqualTo(0); + schema.close(); + } + // ------------------------------------------------------------ // BufferImportTypeVisitor