This is an automated email from the ASF dual-hosted git repository. lzljs3620320 pushed a commit to branch release-1.3 in repository https://gitbox.apache.org/repos/asf/paimon.git
commit edda9f04127924aba3e7f4572d3e2ee6889a40fa Author: ji chen <[email protected]> AuthorDate: Sun Oct 26 14:02:49 2025 +0800 [arrow] Fix java.lang.IllegalArgumentException in ArrowFormatCWriter. (#6459) --- .../main/java/org/apache/paimon/arrow/ArrowUtils.java | 6 ++++-- .../paimon/arrow/vector/ArrowFormatCWriter.java | 3 ++- .../paimon/arrow/vector/ArrowFormatWriterTest.java | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowUtils.java b/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowUtils.java index 7e487e54fb..cf80b9d21f 100644 --- a/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowUtils.java +++ b/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowUtils.java @@ -208,8 +208,10 @@ public class ArrowUtils { } public static ArrowCStruct serializeToCStruct( - VectorSchemaRoot vsr, ArrowArray array, ArrowSchema schema) { - BufferAllocator bufferAllocator = vsr.getVector(0).getAllocator(); + VectorSchemaRoot vsr, + ArrowArray array, + ArrowSchema schema, + BufferAllocator bufferAllocator) { Data.exportVectorSchemaRoot(bufferAllocator, vsr, null, array, schema); return ArrowCStruct.of(array, schema); } diff --git a/paimon-arrow/src/main/java/org/apache/paimon/arrow/vector/ArrowFormatCWriter.java b/paimon-arrow/src/main/java/org/apache/paimon/arrow/vector/ArrowFormatCWriter.java index afa58250c3..09fe6e712b 100644 --- a/paimon-arrow/src/main/java/org/apache/paimon/arrow/vector/ArrowFormatCWriter.java +++ b/paimon-arrow/src/main/java/org/apache/paimon/arrow/vector/ArrowFormatCWriter.java @@ -69,7 +69,8 @@ public class ArrowFormatCWriter implements AutoCloseable { public ArrowCStruct toCStruct() { VectorSchemaRoot vectorSchemaRoot = realWriter.getVectorSchemaRoot(); - return ArrowUtils.serializeToCStruct(vectorSchemaRoot, array, schema); + return ArrowUtils.serializeToCStruct( + vectorSchemaRoot, array, schema, realWriter.getAllocator()); } public void flush() { diff --git a/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java b/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java index d7ee8ca1a5..76df181683 100644 --- a/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java +++ b/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java @@ -276,6 +276,25 @@ public class ArrowFormatWriterTest { } } + @Test + public void testArrowFormatCWriterWithEmptySchema() { + RowType emptyschema = new RowType(new ArrayList<>()); + + try (RootAllocator rootAllocator = new RootAllocator(); + BufferAllocator allocator = + rootAllocator.newChildAllocator("paimonWriter", 0, Long.MAX_VALUE); + ArrowFormatCWriter writer = + new ArrowFormatCWriter(emptyschema, 4096, true, allocator)) { + for (int i = 0; i < 100; i++) { + writer.write(GenericRow.of()); + } + writer.flush(); + ArrowCStruct cStruct = writer.toCStruct(); + Assertions.assertThat(cStruct).isNotNull(); + writer.release(); + } + } + private void writeAndCheck(ArrowFormatCWriter writer) { List<InternalRow> list = new ArrayList<>(); List<InternalRow.FieldGetter> fieldGetters = new ArrayList<>();
