This is an automated email from the ASF dual-hosted git repository.

lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-java.git


The following commit(s) were added to refs/heads/main by this push:
     new 8d1802cef GH-399: Check for null writers in 
DenseUnionWriter#setPosition (#938)
8d1802cef is described below

commit 8d1802cef6bacd27d1cc8a0c2cf3efcddb6bf255
Author: Kaustav Sarkar <[email protected]>
AuthorDate: Mon Dec 29 14:01:10 2025 +0530

    GH-399: Check for null writers in DenseUnionWriter#setPosition (#938)
    
    ## GH-399 Fix setPosition fails with NullPointerException
    
    Fixed a `NullPointerException` in `DenseUnionWriter#setPosition`.
    
    The issue was that `setPosition` tried to update all writers in its
    internal array, even if they hadn't been initialized yet. I added a null
    check so it only updates writers that actually exist.
    
    Also added a regression test (`TestDenseUnionWriterNPE`) to verify the
    fix and updated `.gitignore`.
    
    Closes #399.
---
 .gitignore                                         |  2 +
 .../main/codegen/templates/DenseUnionWriter.java   |  4 +-
 .../vector/complex/writer/TestComplexWriter.java   | 43 ++++++++++++++++++++++
 3 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index b57597af4..17d1d43ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,10 +7,12 @@
 .buildpath
 .checkstyle
 .classpath
+.cursor/
 .factorypath
 .idea/
 .project
 .settings/
+.vscode/
 /*-build/
 /.mvn/.develocity/
 /apache-arrow-java-*
diff --git a/vector/src/main/codegen/templates/DenseUnionWriter.java 
b/vector/src/main/codegen/templates/DenseUnionWriter.java
index 8515b759e..9aeea5b05 100644
--- a/vector/src/main/codegen/templates/DenseUnionWriter.java
+++ b/vector/src/main/codegen/templates/DenseUnionWriter.java
@@ -55,7 +55,9 @@ public class DenseUnionWriter extends AbstractFieldWriter 
implements FieldWriter
   public void setPosition(int index) {
     super.setPosition(index);
     for (BaseWriter writer : writers) {
-      writer.setPosition(index);
+      if (writer != null) {
+        writer.setPosition(index);
+      }
     }
   }
 
diff --git 
a/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java
 
b/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java
index 46c259bda..871a3cc46 100644
--- 
a/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java
+++ 
b/vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java
@@ -2530,4 +2530,47 @@ public class TestComplexWriter {
       }
     }
   }
+
+  @Test
+  void testListOfDenseUnionWriterNPE() {
+    // Regression test for https://github.com/apache/arrow-java/issues/399
+    try (ListVector listVector = ListVector.empty("list", allocator)) {
+      
listVector.addOrGetVector(FieldType.nullable(MinorType.DENSEUNION.getType()));
+      UnionListWriter listWriter = listVector.getWriter();
+
+      listWriter.startList();
+      listWriter.endList();
+    }
+  }
+
+  @Test
+  void testListOfDenseUnionWriterWithData() {
+    try (ListVector listVector = ListVector.empty("list", allocator)) {
+      
listVector.addOrGetVector(FieldType.nullable(MinorType.DENSEUNION.getType()));
+
+      UnionListWriter listWriter = listVector.getWriter();
+      listWriter.startList();
+      listWriter.writeInt(100);
+      listWriter.writeBigInt(200L);
+      listWriter.endList();
+
+      listWriter.startList();
+      listWriter.writeFloat4(3.14f);
+      listWriter.endList();
+
+      listVector.setValueCount(2);
+
+      assertEquals(2, listVector.getValueCount());
+
+      List<?> value0 = (List<?>) listVector.getObject(0);
+      List<?> value1 = (List<?>) listVector.getObject(1);
+
+      assertEquals(2, value0.size());
+      assertEquals(100, value0.get(0));
+      assertEquals(200L, value0.get(1));
+
+      assertEquals(1, value1.size());
+      assertEquals(3.14f, value1.get(0));
+    }
+  }
 }

Reply via email to