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

Reply via email to