Skip to content

Commit 8e740f0

Browse files
authored
GH-3315: Variant binary read does not take length into account (#3333)
1 parent dfc025e commit 8e740f0

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

parquet-variant/src/main/java/org/apache/parquet/variant/VariantUtil.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,9 @@ static ByteBuffer getBinary(ByteBuffer value) {
612612
int start = value.position() + 1 + U32_SIZE;
613613
int length = readUnsigned(value, value.position() + 1, U32_SIZE);
614614
checkIndex(start + length - 1, value.limit());
615-
return slice(value, start);
615+
ByteBuffer result = slice(value, start);
616+
result.limit(start + length);
617+
return result;
616618
}
617619

618620
static String getString(ByteBuffer value) {

parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.parquet.variant;
2020

21+
import java.nio.ByteBuffer;
2122
import org.junit.Assert;
2223
import org.junit.Ignore;
2324
import org.junit.Test;
@@ -115,6 +116,41 @@ public void testMixedObjectBuilder() {
115116
});
116117
}
117118

119+
@Test
120+
public void testMixedBinaryBuilder() {
121+
VariantBuilder b = new VariantBuilder();
122+
VariantObjectBuilder objBuilder = b.startObject();
123+
objBuilder.appendKey("as_binary");
124+
objBuilder.appendBinary(ByteBuffer.wrap(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}));
125+
objBuilder.appendKey("in_array");
126+
VariantArrayBuilder arrBinary = objBuilder.startArray();
127+
arrBinary.appendBinary(ByteBuffer.wrap(new byte[] {}));
128+
arrBinary.appendBinary(ByteBuffer.wrap(new byte[] {10, 11, 12, 13, 14, 15, 16}));
129+
arrBinary.appendBinary(ByteBuffer.wrap(new byte[] {17, 18}));
130+
objBuilder.endArray();
131+
b.endObject();
132+
133+
VariantTestUtil.testVariant(b.build(), v -> {
134+
VariantTestUtil.checkType(v, VariantUtil.OBJECT, Variant.Type.OBJECT);
135+
Assert.assertEquals(2, v.numObjectElements());
136+
Assert.assertEquals(
137+
ByteBuffer.wrap(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}),
138+
v.getFieldByKey("as_binary").getBinary());
139+
Variant nestedArray = v.getFieldByKey("in_array");
140+
VariantTestUtil.checkType(nestedArray, VariantUtil.ARRAY, Variant.Type.ARRAY);
141+
Assert.assertEquals(3, nestedArray.numArrayElements());
142+
Assert.assertEquals(
143+
ByteBuffer.wrap(new byte[] {}),
144+
nestedArray.getElementAtIndex(0).getBinary());
145+
Assert.assertEquals(
146+
ByteBuffer.wrap(new byte[] {10, 11, 12, 13, 14, 15, 16}),
147+
nestedArray.getElementAtIndex(1).getBinary());
148+
Assert.assertEquals(
149+
ByteBuffer.wrap(new byte[] {17, 18}),
150+
nestedArray.getElementAtIndex(2).getBinary());
151+
});
152+
}
153+
118154
private void buildNested(int i, VariantObjectBuilder obj) {
119155
if (i > 0) {
120156
obj.appendKey("key" + i);

0 commit comments

Comments
 (0)