Skip to content

Commit 56157d2

Browse files
DX-122953 Complete empty large list split transfer
1 parent 1a084bb commit 56157d2

2 files changed

Lines changed: 46 additions & 16 deletions

File tree

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

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -686,24 +686,30 @@ public void splitAndTransfer(int startIndex, int length) {
686686
startIndex,
687687
length,
688688
valueCount);
689-
final long startPoint = offsetBuffer.getLong((long) startIndex * OFFSET_WIDTH);
690-
final long sliceLength =
691-
offsetBuffer.getLong((long) (startIndex + length) * OFFSET_WIDTH) - startPoint;
692689
to.clear();
693-
to.offsetBuffer = to.allocateOffsetBuffer((length + 1) * OFFSET_WIDTH);
694-
/* splitAndTransfer offset buffer */
695-
for (int i = 0; i < length + 1; i++) {
696-
final long relativeOffset =
697-
offsetBuffer.getLong((long) (startIndex + i) * OFFSET_WIDTH) - startPoint;
698-
to.offsetBuffer.setLong((long) i * OFFSET_WIDTH, relativeOffset);
690+
if (length > 0) {
691+
final long startPoint = offsetBuffer.getLong((long) startIndex * OFFSET_WIDTH);
692+
final long sliceLength =
693+
offsetBuffer.getLong((long) (startIndex + length) * OFFSET_WIDTH) - startPoint;
694+
to.offsetBuffer = to.allocateOffsetBuffer((length + 1) * OFFSET_WIDTH);
695+
/* splitAndTransfer offset buffer */
696+
for (int i = 0; i < length + 1; i++) {
697+
final long relativeOffset =
698+
offsetBuffer.getLong((long) (startIndex + i) * OFFSET_WIDTH) - startPoint;
699+
to.offsetBuffer.setLong((long) i * OFFSET_WIDTH, relativeOffset);
700+
}
701+
/* splitAndTransfer validity buffer */
702+
splitAndTransferValidityBuffer(startIndex, length, to);
703+
/* splitAndTransfer data buffer */
704+
dataTransferPair.splitAndTransfer(
705+
checkedCastToInt(startPoint), checkedCastToInt(sliceLength));
706+
to.lastSet = length - 1;
707+
to.setValueCount(length);
708+
} else {
709+
to.ensureEmptyOffsetBufferCapacity(OFFSET_WIDTH);
710+
dataTransferPair.splitAndTransfer(0, 0);
711+
to.setValueCount(0);
699712
}
700-
/* splitAndTransfer validity buffer */
701-
splitAndTransferValidityBuffer(startIndex, length, to);
702-
/* splitAndTransfer data buffer */
703-
dataTransferPair.splitAndTransfer(
704-
checkedCastToInt(startPoint), checkedCastToInt(sliceLength));
705-
to.lastSet = length - 1;
706-
to.setValueCount(length);
707713
}
708714

709715
/*

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.arrow.vector.complex.BaseRepeatedValueVector;
3535
import org.apache.arrow.vector.complex.DenseUnionVector;
3636
import org.apache.arrow.vector.complex.FixedSizeListVector;
37+
import org.apache.arrow.vector.complex.LargeListVector;
3738
import org.apache.arrow.vector.complex.LargeListViewVector;
3839
import org.apache.arrow.vector.complex.ListVector;
3940
import org.apache.arrow.vector.complex.MapVector;
@@ -944,6 +945,29 @@ public void testLargeListViewVectorZeroStartIndexAndLength() {
944945
}
945946
}
946947

948+
@Test
949+
public void testLargeListVectorZeroStartIndexAndLength() {
950+
try (final LargeListVector listVector = LargeListVector.empty("largelist", allocator);
951+
final LargeListVector newListVector = LargeListVector.empty("newList", allocator)) {
952+
953+
listVector.allocateNew();
954+
final int valueCount = 0;
955+
listVector.setValueCount(valueCount);
956+
957+
final TransferPair tp = listVector.makeTransferPair(newListVector);
958+
959+
tp.splitAndTransfer(0, 0);
960+
assertEquals(valueCount, newListVector.getValueCount());
961+
List<ArrowBuf> buffers = newListVector.getFieldBuffers();
962+
ArrowBuf offsetBuffer = buffers.get(1);
963+
assertEquals(LargeListVector.OFFSET_WIDTH, offsetBuffer.readableBytes());
964+
assertTrue(offsetBuffer.capacity() >= LargeListVector.OFFSET_WIDTH);
965+
assertEquals(0L, offsetBuffer.getLong(0));
966+
967+
newListVector.clear();
968+
}
969+
}
970+
947971
@Test
948972
public void testStructVectorZeroStartIndexAndLength() {
949973
Map<String, String> metadata = new HashMap<>();

0 commit comments

Comments
 (0)