This is an automated email from the ASF dual-hosted git repository.

gabor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/parquet-java.git


The following commit(s) were added to refs/heads/master by this push:
     new 8e740f07c GH-3315: Variant binary read does not take length into 
account (#3333)
8e740f07c is described below

commit 8e740f07c26783d6dec2c4ac2cffa9823fe18036
Author: Jeronimo López <[email protected]>
AuthorDate: Tue Nov 18 10:52:42 2025 +0100

    GH-3315: Variant binary read does not take length into account (#3333)
---
 .../org/apache/parquet/variant/VariantUtil.java    |  4 ++-
 .../parquet/variant/TestVariantObjectBuilder.java  | 36 ++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git 
a/parquet-variant/src/main/java/org/apache/parquet/variant/VariantUtil.java 
b/parquet-variant/src/main/java/org/apache/parquet/variant/VariantUtil.java
index 149d457ad..4744f0c28 100644
--- a/parquet-variant/src/main/java/org/apache/parquet/variant/VariantUtil.java
+++ b/parquet-variant/src/main/java/org/apache/parquet/variant/VariantUtil.java
@@ -612,7 +612,9 @@ class VariantUtil {
     int start = value.position() + 1 + U32_SIZE;
     int length = readUnsigned(value, value.position() + 1, U32_SIZE);
     checkIndex(start + length - 1, value.limit());
-    return slice(value, start);
+    ByteBuffer result = slice(value, start);
+    result.limit(start + length);
+    return result;
   }
 
   static String getString(ByteBuffer value) {
diff --git 
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java
 
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java
index 9ca3d1a28..d657f354b 100644
--- 
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java
+++ 
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantObjectBuilder.java
@@ -18,6 +18,7 @@
  */
 package org.apache.parquet.variant;
 
+import java.nio.ByteBuffer;
 import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -115,6 +116,41 @@ public class TestVariantObjectBuilder {
     });
   }
 
+  @Test
+  public void testMixedBinaryBuilder() {
+    VariantBuilder b = new VariantBuilder();
+    VariantObjectBuilder objBuilder = b.startObject();
+    objBuilder.appendKey("as_binary");
+    objBuilder.appendBinary(ByteBuffer.wrap(new byte[] {0, 1, 2, 3, 4, 5, 6, 
7, 8, 9}));
+    objBuilder.appendKey("in_array");
+    VariantArrayBuilder arrBinary = objBuilder.startArray();
+    arrBinary.appendBinary(ByteBuffer.wrap(new byte[] {}));
+    arrBinary.appendBinary(ByteBuffer.wrap(new byte[] {10, 11, 12, 13, 14, 15, 
16}));
+    arrBinary.appendBinary(ByteBuffer.wrap(new byte[] {17, 18}));
+    objBuilder.endArray();
+    b.endObject();
+
+    VariantTestUtil.testVariant(b.build(), v -> {
+      VariantTestUtil.checkType(v, VariantUtil.OBJECT, Variant.Type.OBJECT);
+      Assert.assertEquals(2, v.numObjectElements());
+      Assert.assertEquals(
+          ByteBuffer.wrap(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}),
+          v.getFieldByKey("as_binary").getBinary());
+      Variant nestedArray = v.getFieldByKey("in_array");
+      VariantTestUtil.checkType(nestedArray, VariantUtil.ARRAY, 
Variant.Type.ARRAY);
+      Assert.assertEquals(3, nestedArray.numArrayElements());
+      Assert.assertEquals(
+          ByteBuffer.wrap(new byte[] {}),
+          nestedArray.getElementAtIndex(0).getBinary());
+      Assert.assertEquals(
+          ByteBuffer.wrap(new byte[] {10, 11, 12, 13, 14, 15, 16}),
+          nestedArray.getElementAtIndex(1).getBinary());
+      Assert.assertEquals(
+          ByteBuffer.wrap(new byte[] {17, 18}),
+          nestedArray.getElementAtIndex(2).getBinary());
+    });
+  }
+
   private void buildNested(int i, VariantObjectBuilder obj) {
     if (i > 0) {
       obj.appendKey("key" + i);

Reply via email to