diff --git a/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java b/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java index 00ea481c2eed84de12815eedb079e965aa2ee701..ad48f69c6fc72e09fd0ce03e50a658d8a3e4a342 100644 --- a/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java +++ b/common/src/java/org/apache/hadoop/hive/common/type/HiveDecimal.java @@ -254,16 +254,16 @@ public static BigDecimal enforcePrecisionScale(BigDecimal bd, int maxPrecision, return null; } + if (bd.scale() > maxScale) { + bd = bd.setScale(maxScale, RoundingMode.HALF_UP); + } + int maxIntDigits = maxPrecision - maxScale; int intDigits = bd.precision() - bd.scale(); if (intDigits > maxIntDigits) { return null; } - if (bd.scale() > maxScale) { - bd = bd.setScale(maxScale, RoundingMode.HALF_UP); - } - return bd; } } diff --git a/common/src/test/org/apache/hadoop/hive/common/type/TestHiveDecimal.java b/common/src/test/org/apache/hadoop/hive/common/type/TestHiveDecimal.java index 769410d474fdc0ecbd63c7fe8944b2f6d23d5e5a..46a73f2eba706bf413dde31a26e302b3e4c7bd65 100644 --- a/common/src/test/org/apache/hadoop/hive/common/type/TestHiveDecimal.java +++ b/common/src/test/org/apache/hadoop/hive/common/type/TestHiveDecimal.java @@ -68,6 +68,13 @@ public void testPrecisionScaleEnforcement() { Assert.assertEquals("0.02", HiveDecimal.enforcePrecisionScale(new BigDecimal("0.015"), 3, 2).toString()); Assert.assertEquals("0.01", HiveDecimal.enforcePrecisionScale(new BigDecimal("0.0145"), 3, 2).toString()); + // Rounding numbers that increase int digits + Assert.assertEquals("10", + HiveDecimal.enforcePrecisionScale(new BigDecimal("9.5"), 2, 0).toString()); + Assert.assertNull(HiveDecimal.enforcePrecisionScale(new BigDecimal("9.5"), 1, 0)); + Assert.assertEquals("9", + HiveDecimal.enforcePrecisionScale(new BigDecimal("9.4"), 1, 0).toString()); + // Integers with no scale values are not modified (zeros are not null) Assert.assertEquals("0", HiveDecimal.enforcePrecisionScale(new BigDecimal("0"), 1, 0).toString()); Assert.assertEquals("30", HiveDecimal.enforcePrecisionScale(new BigDecimal("30"), 2, 0).toString());