You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@parquet.apache.org by ga...@apache.org on 2025/09/29 06:13:26 UTC

(parquet-java) branch master updated: GH-3317: Fix bytes written by VariantBuilder.appendFloat (#3334)

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 <60...@users.noreply.github.com>
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 -> {