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/30 05:58:41 UTC

(parquet-java) branch master updated: GH-3316: Fix representation type for VariantBuilder decimal (#3335)

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 <60...@users.noreply.github.com>
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();