Skip to content

Commit c3601a9

Browse files
authored
GH-44344: [Java] fix VectorSchemaRoot.getTransferPair for NullVector (#44631)
### Rationale for this change Do not throw [UnsupportedOperationException("Tried to get allocator from NullVector")](https://github.com/apache/arrow/blob/release-18.0.0-rc0/java/vector/src/main/java/org/apache/arrow/vector/NullVector.java#L160) from [VectorSchemaRoot.slice()](https://github.com/apache/arrow/blob/release-18.0.0-rc0/java/vector/src/main/java/org/apache/arrow/vector/VectorSchemaRoot.java#L341) when slicing a VSR containing a NullVector or ZeroVector. Details in #44344 ### Are these changes tested? Added unit test that would trigger an UnsupportedOperationException on the legacy path. * GitHub Issue: #44344 Authored-by: Maksim Yegorov <[email protected]> Signed-off-by: David Li <[email protected]>
1 parent f3b8d6b commit c3601a9

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

java/vector/src/main/java/org/apache/arrow/vector/NullVector.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,16 @@ public boolean allocateNewSafe() {
155155
@Override
156156
public void reAlloc() {}
157157

158+
/*
159+
* IMPORTANT NOTE
160+
* It's essential that NullVector (and ZeroVector) do not require BufferAllocator for any data storage.
161+
* However, some methods of the parent interface may require passing in a BufferAllocator, even if null.
162+
*
163+
* @return null
164+
*/
158165
@Override
159166
public BufferAllocator getAllocator() {
160-
throw new UnsupportedOperationException("Tried to get allocator from NullVector");
167+
return null;
161168
}
162169

163170
@Override

java/vector/src/main/java/org/apache/arrow/vector/ValueVector.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ public interface ValueVector extends Closeable, Iterable<ValueVector> {
8080
*/
8181
void reAlloc();
8282

83+
/**
84+
* Get the allocator associated with the vector. CAVEAT: Some ValueVector subclasses (e.g.
85+
* NullVector) do not require an allocator for data storage and may return null.
86+
*
87+
* @return Returns nullable allocator.
88+
*/
8389
BufferAllocator getAllocator();
8490

8591
/**

java/vector/src/test/java/org/apache/arrow/vector/TestSplitAndTransfer.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,31 @@ public void testWithEmptyVector() {
198198
toDUV.clear();
199199
}
200200

201+
@Test
202+
public void testWithNullVector() {
203+
int valueCount = 123;
204+
int startIndex = 10;
205+
NullVector fromNullVector = new NullVector("nullVector");
206+
fromNullVector.setValueCount(valueCount);
207+
TransferPair transferPair = fromNullVector.getTransferPair(fromNullVector.getAllocator());
208+
transferPair.splitAndTransfer(startIndex, valueCount - startIndex);
209+
NullVector toNullVector = (NullVector) transferPair.getTo();
210+
211+
assertEquals(valueCount - startIndex, toNullVector.getValueCount());
212+
// no allocations to clear for NullVector
213+
}
214+
215+
@Test
216+
public void testWithZeroVector() {
217+
ZeroVector fromZeroVector = new ZeroVector("zeroVector");
218+
TransferPair transferPair = fromZeroVector.getTransferPair(fromZeroVector.getAllocator());
219+
transferPair.splitAndTransfer(0, 0);
220+
ZeroVector toZeroVector = (ZeroVector) transferPair.getTo();
221+
222+
assertEquals(0, toZeroVector.getValueCount());
223+
// no allocations to clear for ZeroVector
224+
}
225+
201226
@Test /* VarCharVector */
202227
public void test() throws Exception {
203228
try (final VarCharVector varCharVector = new VarCharVector("myvector", allocator)) {

0 commit comments

Comments
 (0)