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 04e2f1952 GH-3316: Fix representation type for VariantBuilder decimal
(#3335)
04e2f1952 is described below
commit 04e2f1952577f66b3d1a07953f52d144c9410bba
Author: Arnav Balyan <[email protected]>
AuthorDate: Tue Sep 30 11:28:37 2025 +0530
GH-3316: Fix representation type for VariantBuilder decimal (#3335)
---
.../org/apache/parquet/variant/VariantBuilder.java | 5 ++-
.../parquet/variant/TestVariantScalarBuilder.java | 36 ++++++++++++++++++++++
2 files changed, 38 insertions(+), 3 deletions(-)
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 acf6cc951..4b8eb6d8c 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
@@ -227,14 +227,13 @@ public class VariantBuilder {
public void appendDecimal(BigDecimal d) {
onAppend();
BigInteger unscaled = d.unscaledValue();
- if (d.scale() <= VariantUtil.MAX_DECIMAL4_PRECISION && d.precision() <=
VariantUtil.MAX_DECIMAL4_PRECISION) {
+ if (d.precision() <= VariantUtil.MAX_DECIMAL4_PRECISION) {
checkCapacity(2 /* header and scale size */ + 4);
writeBuffer[writePos] = VariantUtil.HEADER_DECIMAL4;
writeBuffer[writePos + 1] = (byte) d.scale();
VariantUtil.writeLong(writeBuffer, writePos + 2,
unscaled.intValueExact(), 4);
writePos += 6;
- } else if (d.scale() <= VariantUtil.MAX_DECIMAL8_PRECISION
- && d.precision() <= VariantUtil.MAX_DECIMAL8_PRECISION) {
+ } else if (d.precision() <= VariantUtil.MAX_DECIMAL8_PRECISION) {
checkCapacity(2 /* header and scale size */ + 8);
writeBuffer[writePos] = VariantUtil.HEADER_DECIMAL8;
writeBuffer[writePos + 1] = (byte) d.scale();
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 430e4f813..13ceef86d 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
@@ -282,6 +282,42 @@ public class TestVariantScalarBuilder {
}
}
+ @Test
+ public void testDecimalBuilderUsesOnlyPrecision() {
+
+ BigDecimal smallPrecisionLargeScale = new
BigDecimal("1").scaleByPowerOfTen(-20);
+ VariantBuilder vb1 = new VariantBuilder();
+ vb1.appendDecimal(smallPrecisionLargeScale);
+ VariantTestUtil.testVariant(vb1.build(), v -> {
+ VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE,
Variant.Type.DECIMAL4);
+ Assert.assertEquals(smallPrecisionLargeScale, v.getDecimal());
+ });
+
+ BigDecimal mediumPrecisionLargeScale = new
BigDecimal("1234567890").scaleByPowerOfTen(-25);
+ VariantBuilder vb2 = new VariantBuilder();
+ vb2.appendDecimal(mediumPrecisionLargeScale);
+ VariantTestUtil.testVariant(vb2.build(), v -> {
+ VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE,
Variant.Type.DECIMAL8);
+ Assert.assertEquals(mediumPrecisionLargeScale, v.getDecimal());
+ });
+
+ BigDecimal maxDecimal4Precision = new
BigDecimal("123456789").scaleByPowerOfTen(-18);
+ VariantBuilder vb3 = new VariantBuilder();
+ vb3.appendDecimal(maxDecimal4Precision);
+ VariantTestUtil.testVariant(vb3.build(), v -> {
+ VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE,
Variant.Type.DECIMAL4);
+ Assert.assertEquals(maxDecimal4Precision, v.getDecimal());
+ });
+
+ BigDecimal maxDecimal8Precision = new
BigDecimal("123456789012345678").scaleByPowerOfTen(-19);
+ VariantBuilder vb4 = new VariantBuilder();
+ vb4.appendDecimal(maxDecimal8Precision);
+ VariantTestUtil.testVariant(vb4.build(), v -> {
+ VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE,
Variant.Type.DECIMAL8);
+ Assert.assertEquals(maxDecimal8Precision, v.getDecimal());
+ });
+ }
+
@Test
public void testDateBuilder() {
VariantBuilder vb = new VariantBuilder();