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));
+ }
+ }
}