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 1cf3aa3a3a..acf6cc951f 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 void appendFloat(float f) { 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 e6e3d322e9..430e4f8131 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 void testFloatBuilder() { }); } + @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 -> {