Skip to content

Commit fa8c767

Browse files
committed
GH-1125: Preserve reads before value count finalization
1 parent d9c7896 commit fa8c767

5 files changed

Lines changed: 17 additions & 5 deletions

File tree

vector/src/main/java/org/apache/arrow/vector/complex/impl/UnionLargeListReader.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ public boolean isSet() {
5454
@Override
5555
public void setPosition(int index) {
5656
int valueCount = vector.getValueCount();
57-
if (valueCount == 0 && index == 0) {
57+
if (valueCount == 0
58+
&& index == 0
59+
&& vector.getOffsetBuffer().capacity() < 2L * OFFSET_WIDTH) {
5860
setEmptyPosition(index);
5961
return;
6062
}

vector/src/main/java/org/apache/arrow/vector/complex/impl/UnionLargeListViewReader.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ public boolean isSet() {
5656
@Override
5757
public void setPosition(int index) {
5858
int valueCount = vector.getValueCount();
59-
if (valueCount == 0 && index == 0) {
59+
if (valueCount == 0
60+
&& index == 0
61+
&& (vector.getOffsetBuffer().capacity() < LargeListViewVector.OFFSET_WIDTH
62+
|| vector.getSizeBuffer().capacity() < LargeListViewVector.SIZE_WIDTH)) {
6063
setEmptyPosition(index);
6164
return;
6265
}

vector/src/main/java/org/apache/arrow/vector/complex/impl/UnionListReader.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ public boolean isSet() {
5353
@Override
5454
public void setPosition(int index) {
5555
int valueCount = vector.getValueCount();
56-
if (valueCount == 0 && index == 0) {
56+
if (valueCount == 0
57+
&& index == 0
58+
&& vector.getOffsetBuffer().capacity() < 2L * OFFSET_WIDTH) {
5759
setEmptyPosition(index);
5860
return;
5961
}

vector/src/main/java/org/apache/arrow/vector/complex/impl/UnionListReaderPositionValidator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ private UnionListReaderPositionValidator() {}
3030

3131
/** Check if the given index is within the current value count of the vector. */
3232
static void checkIndex(int index, int valueCount) {
33-
if (index < 0 || index >= valueCount) {
33+
// Writers may populate the buffers before the caller finalizes valueCount. Preserve the
34+
// historical ability to read those buffers while still rejecting negative positions.
35+
if (index < 0 || (valueCount > 0 && index >= valueCount)) {
3436
throw new IndexOutOfBoundsException(
3537
String.format("index: %s, expected range [0, %s)", index, valueCount));
3638
}

vector/src/main/java/org/apache/arrow/vector/complex/impl/UnionListViewReader.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ public boolean isSet() {
5454
@Override
5555
public void setPosition(int index) {
5656
int valueCount = vector.getValueCount();
57-
if (valueCount == 0 && index == 0) {
57+
if (valueCount == 0
58+
&& index == 0
59+
&& (vector.getOffsetBuffer().capacity() < ListViewVector.OFFSET_WIDTH
60+
|| vector.getSizeBuffer().capacity() < ListViewVector.SIZE_WIDTH)) {
5861
setEmptyPosition(index);
5962
return;
6063
}

0 commit comments

Comments
 (0)