diff --git a/HIVE-8008.patch2 b/HIVE-8008.patch2 new file mode 100644 index 0000000000000000000000000000000000000000..dacc09a34739e6f8d891ac5af05c9d6b0649d35d --- /dev/null +++ b/HIVE-8008.patch2 @@ -0,0 +1,25 @@ +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 00ea481..ad48f69 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/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..68d274ae525deba4405062e015a6a11e1c971c47 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,10 +68,16 @@ 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 increases 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()); Assert.assertEquals("5", HiveDecimal.enforcePrecisionScale(new BigDecimal("5"), 3, 2).toString()); + } @Test