Skip to content

Commit 8d1802c

Browse files
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.
1 parent 96156cc commit 8d1802c

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
.buildpath
88
.checkstyle
99
.classpath
10+
.cursor/
1011
.factorypath
1112
.idea/
1213
.project
1314
.settings/
15+
.vscode/
1416
/*-build/
1517
/.mvn/.develocity/
1618
/apache-arrow-java-*

vector/src/main/codegen/templates/DenseUnionWriter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ public DenseUnionWriter(DenseUnionVector vector, NullableStructWriterFactory nul
5555
public void setPosition(int index) {
5656
super.setPosition(index);
5757
for (BaseWriter writer : writers) {
58-
writer.setPosition(index);
58+
if (writer != null) {
59+
writer.setPosition(index);
60+
}
5961
}
6062
}
6163

vector/src/test/java/org/apache/arrow/vector/complex/writer/TestComplexWriter.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,4 +2530,47 @@ public void extensionWriterReader() throws Exception {
25302530
}
25312531
}
25322532
}
2533+
2534+
@Test
2535+
void testListOfDenseUnionWriterNPE() {
2536+
// Regression test for https://github.com/apache/arrow-java/issues/399
2537+
try (ListVector listVector = ListVector.empty("list", allocator)) {
2538+
listVector.addOrGetVector(FieldType.nullable(MinorType.DENSEUNION.getType()));
2539+
UnionListWriter listWriter = listVector.getWriter();
2540+
2541+
listWriter.startList();
2542+
listWriter.endList();
2543+
}
2544+
}
2545+
2546+
@Test
2547+
void testListOfDenseUnionWriterWithData() {
2548+
try (ListVector listVector = ListVector.empty("list", allocator)) {
2549+
listVector.addOrGetVector(FieldType.nullable(MinorType.DENSEUNION.getType()));
2550+
2551+
UnionListWriter listWriter = listVector.getWriter();
2552+
listWriter.startList();
2553+
listWriter.writeInt(100);
2554+
listWriter.writeBigInt(200L);
2555+
listWriter.endList();
2556+
2557+
listWriter.startList();
2558+
listWriter.writeFloat4(3.14f);
2559+
listWriter.endList();
2560+
2561+
listVector.setValueCount(2);
2562+
2563+
assertEquals(2, listVector.getValueCount());
2564+
2565+
List<?> value0 = (List<?>) listVector.getObject(0);
2566+
List<?> value1 = (List<?>) listVector.getObject(1);
2567+
2568+
assertEquals(2, value0.size());
2569+
assertEquals(100, value0.get(0));
2570+
assertEquals(200L, value0.get(1));
2571+
2572+
assertEquals(1, value1.size());
2573+
assertEquals(3.14f, value1.get(0));
2574+
}
2575+
}
25332576
}

0 commit comments

Comments
 (0)