Skip to content

Commit e0979e8

Browse files
Allocate default-sized offset buffer to avoid validate-then-write regression
(valueCount + 1) * OFFSET_WIDTH produces a 4-byte buffer for valueCount=0, which is too small when validateFull() triggers getFieldBuffers() before the vector is populated — subsequent setVector() writes at index 4+ fail. Use max(required, INITIAL_VALUE_ALLOCATION * OFFSET_WIDTH) to match the default allocateNew() size. Use allocator.buffer() directly instead of allocateOffsetBuffer() to avoid mutating offsetAllocationSizeInBytes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Change-Id: Iccb00d4775b196f7978b34cbc98234f50ede370a
1 parent 0d89f0a commit e0979e8

2 files changed

Lines changed: 10 additions & 2 deletions

File tree

‎vector/src/main/java/org/apache/arrow/vector/complex/LargeListVector.java‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,11 @@ public List<ArrowBuf> getFieldBuffers() {
280280
if (offsetBuffer.capacity() == 0 && offsetBuffer.writerIndex() > 0) {
281281
long writerIdx = offsetBuffer.writerIndex();
282282
offsetBuffer.getReferenceManager().release();
283-
offsetBuffer = allocateOffsetBuffer((long) (valueCount + 1) * OFFSET_WIDTH);
283+
long allocSize =
284+
Math.max((long) (valueCount + 1) * OFFSET_WIDTH, INITIAL_VALUE_ALLOCATION * OFFSET_WIDTH);
285+
offsetBuffer = allocator.buffer(allocSize);
286+
offsetBuffer.setZero(0, offsetBuffer.capacity());
287+
offsetBuffer.readerIndex(0);
284288
offsetBuffer.writerIndex(writerIdx);
285289
}
286290
result.add(offsetBuffer);

‎vector/src/main/java/org/apache/arrow/vector/complex/ListVector.java‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,11 @@ public List<ArrowBuf> getFieldBuffers() {
238238
if (offsetBuffer.capacity() == 0 && offsetBuffer.writerIndex() > 0) {
239239
long writerIdx = offsetBuffer.writerIndex();
240240
offsetBuffer.getReferenceManager().release();
241-
offsetBuffer = allocateOffsetBuffer((long) (valueCount + 1) * OFFSET_WIDTH);
241+
long allocSize =
242+
Math.max((long) (valueCount + 1) * OFFSET_WIDTH, INITIAL_VALUE_ALLOCATION * OFFSET_WIDTH);
243+
offsetBuffer = allocator.buffer(allocSize);
244+
offsetBuffer.setZero(0, offsetBuffer.capacity());
245+
offsetBuffer.readerIndex(0);
242246
offsetBuffer.writerIndex(writerIdx);
243247
}
244248
result.add(offsetBuffer);

0 commit comments

Comments
 (0)