Skip to content

Commit 8227787

Browse files
committed
update
1 parent d5df847 commit 8227787

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
@@ -244,6 +244,42 @@ public void testDecimalBuilder() {
244244
}
245245
}
246246

247+
@Test
248+
public void testDecimalBuilderUsesOnlyPrecision() {
249+
250+
BigDecimal smallPrecisionLargeScale = new BigDecimal("1").scaleByPowerOfTen(-20);
251+
VariantBuilder vb1 = new VariantBuilder();
252+
vb1.appendDecimal(smallPrecisionLargeScale);
253+
VariantTestUtil.testVariant(vb1.build(), v -> {
254+
VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.DECIMAL4);
255+
Assert.assertEquals(smallPrecisionLargeScale, v.getDecimal());
256+
});
257+
258+
BigDecimal mediumPrecisionLargeScale = new BigDecimal("1234567890").scaleByPowerOfTen(-25);
259+
VariantBuilder vb2 = new VariantBuilder();
260+
vb2.appendDecimal(mediumPrecisionLargeScale);
261+
VariantTestUtil.testVariant(vb2.build(), v -> {
262+
VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.DECIMAL8);
263+
Assert.assertEquals(mediumPrecisionLargeScale, v.getDecimal());
264+
});
265+
266+
BigDecimal maxDecimal4Precision = new BigDecimal("123456789").scaleByPowerOfTen(-18);
267+
VariantBuilder vb3 = new VariantBuilder();
268+
vb3.appendDecimal(maxDecimal4Precision);
269+
VariantTestUtil.testVariant(vb3.build(), v -> {
270+
VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.DECIMAL4);
271+
Assert.assertEquals(maxDecimal4Precision, v.getDecimal());
272+
});
273+
274+
BigDecimal maxDecimal8Precision = new BigDecimal("123456789012345678").scaleByPowerOfTen(-19);
275+
VariantBuilder vb4 = new VariantBuilder();
276+
vb4.appendDecimal(maxDecimal8Precision);
277+
VariantTestUtil.testVariant(vb4.build(), v -> {
278+
VariantTestUtil.checkType(v, VariantUtil.PRIMITIVE, Variant.Type.DECIMAL8);
279+
Assert.assertEquals(maxDecimal8Precision, v.getDecimal());
280+
});
281+
}
282+
247283
@Test
248284
public void testDateBuilder() {
249285
VariantBuilder vb = new VariantBuilder();

0 commit comments

Comments
 (0)