Skip to content

Commit 04e2f19

Browse files
authored
GH-3316: Fix representation type for VariantBuilder decimal (#3335)
1 parent 68fa731 commit 04e2f19

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

parquet-variant/src/main/java/org/apache/parquet/variant/VariantBuilder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,14 +227,13 @@ public void appendDouble(double d) {
227227
public void appendDecimal(BigDecimal d) {
228228
onAppend();
229229
BigInteger unscaled = d.unscaledValue();
230-
if (d.scale() <= VariantUtil.MAX_DECIMAL4_PRECISION && d.precision() <= VariantUtil.MAX_DECIMAL4_PRECISION) {
230+
if (d.precision() <= VariantUtil.MAX_DECIMAL4_PRECISION) {
231231
checkCapacity(2 /* header and scale size */ + 4);
232232
writeBuffer[writePos] = VariantUtil.HEADER_DECIMAL4;
233233
writeBuffer[writePos + 1] = (byte) d.scale();
234234
VariantUtil.writeLong(writeBuffer, writePos + 2, unscaled.intValueExact(), 4);
235235
writePos += 6;
236-
} else if (d.scale() <= VariantUtil.MAX_DECIMAL8_PRECISION
237-
&& d.precision() <= VariantUtil.MAX_DECIMAL8_PRECISION) {
236+
} else if (d.precision() <= VariantUtil.MAX_DECIMAL8_PRECISION) {
238237
checkCapacity(2 /* header and scale size */ + 8);
239238
writeBuffer[writePos] = VariantUtil.HEADER_DECIMAL8;
240239
writeBuffer[writePos + 1] = (byte) d.scale();

parquet-variant/src/test/java/org/apache/parquet/variant/TestVariantScalarBuilder.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,42 @@ public void testDecimalBuilder() {
282282
}
283283
}
284284

285+
@Test
286+
public void testDecimalBuilderUsesOnlyPrecision() {
287+
288+
BigDecimal smallPrecisionLargeScale = new BigDecimal("1").scaleByPowerOfTen(-20);
289+
VariantBuilder vb1 = new VariantBuilder();
290+
vb1.appendDecimal(smallPrecisionLargeScale);
291+
VariantTestUtil.testVariant(vb1.build(), v -> {
292+
VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.DECIMAL4);
293+
Assert.assertEquals(smallPrecisionLargeScale, v.getDecimal());
294+
});
295+
296+
BigDecimal mediumPrecisionLargeScale = new BigDecimal("1234567890").scaleByPowerOfTen(-25);
297+
VariantBuilder vb2 = new VariantBuilder();
298+
vb2.appendDecimal(mediumPrecisionLargeScale);
299+
VariantTestUtil.testVariant(vb2.build(), v -> {
300+
VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.DECIMAL8);
301+
Assert.assertEquals(mediumPrecisionLargeScale, v.getDecimal());
302+
});
303+
304+
BigDecimal maxDecimal4Precision = new BigDecimal("123456789").scaleByPowerOfTen(-18);
305+
VariantBuilder vb3 = new VariantBuilder();
306+
vb3.appendDecimal(maxDecimal4Precision);
307+
VariantTestUtil.testVariant(vb3.build(), v -> {
308+
VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.DECIMAL4);
309+
Assert.assertEquals(maxDecimal4Precision, v.getDecimal());
310+
});
311+
312+
BigDecimal maxDecimal8Precision = new BigDecimal("123456789012345678").scaleByPowerOfTen(-19);
313+
VariantBuilder vb4 = new VariantBuilder();
314+
vb4.appendDecimal(maxDecimal8Precision);
315+
VariantTestUtil.testVariant(vb4.build(), v -> {
316+
VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.DECIMAL8);
317+
Assert.assertEquals(maxDecimal8Precision, v.getDecimal());
318+
});
319+
}
320+
285321
@Test
286322
public void testDateBuilder() {
287323
VariantBuilder vb = new VariantBuilder();

0 commit comments

Comments
 (0)