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 41f7359f2 GH-3317: Fix bytes written by VariantBuilder.appendFloat 
(#3334)
41f7359f2 is described below

commit 41f7359f208b063e2366338a2cf553e9e5ffb27f
Author: Arnav Balyan <[email protected]>
AuthorDate: Mon Sep 29 11:43:22 2025 +0530

    GH-3317: Fix bytes written by VariantBuilder.appendFloat (#3334)
---
 .../org/apache/parquet/variant/VariantBuilder.java |  2 +-
 .../parquet/variant/TestVariantScalarBuilder.java  | 38 ++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git 
a/parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java 
b/parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java
index 1cf3aa3a3..acf6cc951 100644
--- 
a/parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java
+++ 
b/parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java
@@ -358,7 +358,7 @@ public class VariantBuilder {
     onAppend();
     checkCapacity(1 /* header size */ + 4);
     writeBuffer[writePos] = VariantUtil.HEADER_FLOAT;
-    VariantUtil.writeLong(writeBuffer, writePos + 1, Float.floatToIntBits(f), 
8);
+    VariantUtil.writeLong(writeBuffer, writePos + 1, Float.floatToIntBits(f), 
4);
     writePos += 5;
   }
 
diff --git 
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java
 
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java
index e6e3d322e..430e4f813 100644
--- 
a/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java
+++ 
b/parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java
@@ -18,6 +18,7 @@
  */
 package org.apache.parquet.variant;
 
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -181,6 +182,43 @@ public class TestVariantScalarBuilder {
     });
   }
 
+  @Test
+  public void testFloatBuilderDoesNotWriteTooManyBytes() throws Exception {
+    VariantBuilder vb = new VariantBuilder();
+
+    Field writeBufferField = 
VariantBuilder.class.getDeclaredField("writeBuffer");
+    writeBufferField.setAccessible(true);
+    Field writePosField = VariantBuilder.class.getDeclaredField("writePos");
+    writePosField.setAccessible(true);
+
+    byte[] buffer = (byte[]) writeBufferField.get(vb);
+    for (int i = 0; i < 20; i++) {
+      buffer[i] = (byte) 0xFF;
+    }
+
+    float testFloat = 1.23456f;
+    vb.appendFloat(testFloat);
+
+    int writePos = (Integer) writePosField.get(vb);
+    Assert.assertEquals("writePos should be exactly 5 after appendFloat", 5, 
writePos);
+
+    int modifiedBytes = 0;
+    for (int i = 0; i < 10; i++) {
+      if (buffer[i] != (byte) 0xFF) {
+        modifiedBytes++;
+      }
+    }
+    Assert.assertEquals("appendFloat should write exactly 5 bytes (1 header + 
4 data)", 5, modifiedBytes);
+
+    for (int i = 5; i < 10; i++) {
+      Assert.assertEquals(
+          "Byte at position " + i + " should not be modified by appendFloat", 
(byte) 0xFF, buffer[i]);
+    }
+
+    Variant variant = vb.build();
+    Assert.assertEquals("Float value should be preserved correctly", 
testFloat, variant.getFloat(), 0.0f);
+  }
+
   @Test
   public void testDoubleBuilder() {
     Arrays.asList(Double.MIN_VALUE, 0d, -0d, Double.MAX_VALUE).forEach(d -> {

Reply via email to