-
Notifications
You must be signed in to change notification settings - Fork 133
GH-1190: Reserve view slots for empty view vector values #1192
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -540,6 +540,60 @@ public void testSizeOfViewBufferElements() { | |
| } | ||
| } | ||
|
|
||
| @ParameterizedTest | ||
| @MethodSource({"vectorCreatorProvider"}) | ||
| public void testSetSafeEmptyValueAtViewBufferBoundary( | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Only covers the empty-value path. setValueCount trailing gap (silent trigger, no empty string written)@ParameterizedTest
@MethodSource({"vectorCreatorProvider"})
public void testSetValueCountFillsEmptiesAtViewBufferBoundary(
Function<BufferAllocator, BaseVariableWidthViewVector> vectorCreator) {
try (final BaseVariableWidthViewVector vector = vectorCreator.apply(allocator)) {
vector.allocateNew();
final int valueCapacity = vector.getValueCapacity();
vector.setSafe(valueCapacity - 1, "x".getBytes(StandardCharsets.UTF_8));
// Leaves index valueCapacity unset: fillEmpties -> handleSafe(_, 0) on a full buffer.
vector.setValueCount(valueCapacity + 1);
assertTrue(vector.getValueCapacity() > valueCapacity);
assertTrue(vector.isNull(valueCapacity));
}
}setNull at the boundary@ParameterizedTest
@MethodSource({"vectorCreatorProvider"})
public void testSetNullAtViewBufferBoundary(
Function<BufferAllocator, BaseVariableWidthViewVector> vectorCreator) {
try (final BaseVariableWidthViewVector vector = vectorCreator.apply(allocator)) {
vector.allocateNew();
final int valueCapacity = vector.getValueCapacity();
for (int i = 0; i <= valueCapacity; i++) {
vector.setNull(i);
}
vector.setValueCount(valueCapacity + 1);
assertTrue(vector.getValueCapacity() > valueCapacity);
assertTrue(vector.isNull(valueCapacity));
}
}
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @mbutrovich added coverage for both additional paths: |
||
| Function<BufferAllocator, BaseVariableWidthViewVector> vectorCreator) { | ||
| try (final BaseVariableWidthViewVector vector = vectorCreator.apply(allocator)) { | ||
| final byte[] emptyValue = new byte[0]; | ||
| vector.allocateNew(); | ||
| final int valueCapacity = vector.getValueCapacity(); | ||
|
|
||
| for (int i = 0; i <= valueCapacity; i++) { | ||
| vector.setSafe(i, emptyValue); | ||
| } | ||
|
|
||
| vector.setValueCount(valueCapacity + 1); | ||
| assertTrue(vector.getValueCapacity() > valueCapacity); | ||
| assertEquals(0, vector.getValueLength(valueCapacity)); | ||
| assertArrayEquals(emptyValue, vector.get(valueCapacity)); | ||
| } | ||
| } | ||
|
|
||
| @ParameterizedTest | ||
| @MethodSource({"vectorCreatorProvider"}) | ||
| public void testSetValueCountFillsEmptiesAtViewBufferBoundary( | ||
| Function<BufferAllocator, BaseVariableWidthViewVector> vectorCreator) { | ||
| try (final BaseVariableWidthViewVector vector = vectorCreator.apply(allocator)) { | ||
| vector.allocateNew(); | ||
| final int valueCapacity = vector.getValueCapacity(); | ||
|
|
||
| vector.setSafe(valueCapacity - 1, "x".getBytes(StandardCharsets.UTF_8)); | ||
| vector.setValueCount(valueCapacity + 1); | ||
|
|
||
| assertTrue(vector.getValueCapacity() > valueCapacity); | ||
| assertTrue(vector.isNull(valueCapacity)); | ||
| } | ||
| } | ||
|
|
||
| @ParameterizedTest | ||
| @MethodSource({"vectorCreatorProvider"}) | ||
| public void testSetNullAtViewBufferBoundary( | ||
| Function<BufferAllocator, BaseVariableWidthViewVector> vectorCreator) { | ||
| try (final BaseVariableWidthViewVector vector = vectorCreator.apply(allocator)) { | ||
| vector.allocateNew(); | ||
| final int valueCapacity = vector.getValueCapacity(); | ||
|
|
||
| for (int i = 0; i <= valueCapacity; i++) { | ||
| vector.setNull(i); | ||
| } | ||
| vector.setValueCount(valueCapacity + 1); | ||
|
|
||
| assertTrue(vector.getValueCapacity() > valueCapacity); | ||
| assertTrue(vector.isNull(valueCapacity)); | ||
| } | ||
| } | ||
|
|
||
| @Test | ||
| public void testNullableVarType1() { | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Correct. Reserves the full slot regardless of payload;
((long) index + 1)avoids overflow.roundUpToMultipleOf16is a no-op here but fine to keep.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for reviewing @mbutrovich . I kept this code path unchanged since it reserves the full view slot regardless of payload size and the cast keeps the sizing expression safe before the multiplication. Let me know if there any other thoughts.