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 -> {