[ https://issues.apache.org/jira/browse/HIVE-2693?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13552877#comment-13552877 ]
Mark Grover commented on HIVE-2693: ----------------------------------- Gunther: I took a look at patch 23 and it looks good to me! Good catch on stripTrailingZeros(), BTW! [~namit], [~cwsteinbach], [~ashutoshc] Thanks for reviewing the change. It seems like you all were pretty happy with patch21 but it seemed to have a bug in round UDF that we noticed while reviewing Namit's review comments. That bug has now been fixed in patch 23. Would one of you please take a final look at the patch and commit it if there are no concerns? FWIW, here is the diff between patch21 and patch23: It basically doesn't set the original scale on the return value of round UDF and has a workaround for the stripTrailingZeros() bug in BigDecimal. Apart from that it's just updates to the test results. {code} diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java index af8186a..1c807ef 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java @@ -72,8 +72,7 @@ private BigDecimalWritable evaluate(BigDecimalWritable n, int i) { return null; } BigDecimal bd = n.getBigDecimal(); - int origScale = bd.scale(); - bd = n.getBigDecimal().setScale(i, RoundingMode.HALF_UP).setScale(origScale); + bd = n.getBigDecimal().setScale(i, RoundingMode.HALF_UP); bigDecimalWritable.set(bd); return bigDecimalWritable; } diff --git ql/src/test/results/clientpositive/decimal_3.q.out ql/src/test/results/clientpositive/decimal_3.q.out index ad6190a..30e6d92 100644 --- ql/src/test/results/clientpositive/decimal_3.q.out +++ ql/src/test/results/clientpositive/decimal_3.q.out @@ -219,7 +219,7 @@ POSTHOOK: Input: default@decimal_3 -0.333 -0.33 -0.3 -0.00 +0 1E-99 0.01 0.02 @@ -258,7 +258,7 @@ POSTHOOK: Input: default@decimal_3 -0.333 0 -0.33 0 -0.3 0 -0.00 0 +0 0 1E-99 0 0.01 0 0.02 0 diff --git ql/src/test/results/clientpositive/decimal_udf.q.out ql/src/test/results/clientpositive/decimal_udf.q.out index be05146..e55ad9d 100644 --- ql/src/test/results/clientpositive/decimal_udf.q.out +++ ql/src/test/results/clientpositive/decimal_udf.q.out @@ -145,7 +145,7 @@ POSTHOOK: query: SELECT key + value FROM DECIMAL_UDF POSTHOOK: type: QUERY POSTHOOK: Input: default@decimal_udf #### A masked pattern was here #### -0E+2 +0 1E+99 1E-99 0 @@ -229,7 +229,7 @@ POSTHOOK: Input: default@decimal_udf -2.2E+3 1E+99 1E-99 -0.0 +0 1.5E+2 15 1.5 @@ -238,7 +238,7 @@ POSTHOOK: Input: default@decimal_udf 3E+2 3E+1 3 -0.0 +0 0.2 0.02 0.3 @@ -390,44 +390,44 @@ POSTHOOK: query: SELECT key - key FROM DECIMAL_UDF POSTHOOK: type: QUERY POSTHOOK: Input: default@decimal_udf #### A masked pattern was here #### -0E+2 -0E+99 -0E-99 -0 -0E+2 -0E+1 -0 -0.0 -0.00 -0E+2 -0E+1 -0 -0 -0.0 -0.00 -0.0 -0.00 -0.000 -0.0 -0.00 -0.000 -0 -0 -0.00 -0.00 -0.00 -0.000 -0.00 -0.000 -0 -0.0 -0.00 -0.00 -0.00 -0.00 -0E-25 -0E-9 -0E-8 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 PREHOOK: query: EXPLAIN SELECT key - value FROM DECIMAL_UDF PREHOOK: type: QUERY POSTHOOK: query: EXPLAIN SELECT key - value FROM DECIMAL_UDF @@ -475,13 +475,13 @@ POSTHOOK: Input: default@decimal_udf 1E+99 1E-99 0 -0E+2 -0E+1 +0 +0 0 0.1 0.01 -0E+2 -0E+1 +0 +0 0 0 0.2 @@ -555,7 +555,7 @@ POSTHOOK: Input: default@decimal_udf -6.6E+3 1E+99 1E-99 -0.0 +0 5E+1 5 0.5 @@ -564,7 +564,7 @@ POSTHOOK: Input: default@decimal_udf 1E+2 1E+1 1 -0.0 +0 0.2 0.02 0.3 @@ -798,26 +798,26 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@decimal_udf #### A masked pattern was here #### -1.936E+7 -0E+99 -0E-99 +0 +0 0 1E+4 1E+2 1 -0.0 -0.00 +0 +0 4E+4 4E+2 4 0 -0.0 -0.00 -0.0 -0.00 -0.000 -0.0 -0.00 -0.000 +0 +0 +0 +0 +0 +0 +0 +0 1 4 9.42 @@ -879,26 +879,26 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@decimal_udf #### A masked pattern was here #### -9.68E+6 -0E+98 -0E-100 -0.0 +0 +0 +0 5E+3 5E+1 0.5 -0.00 -0.000 +0 +0 2E+4 2E+2 2 -0.0 -0.00 -0.000 -0.00 -0.000 -0.0000 -0.00 -0.000 -0.0000 +0 +0 +0 +0 +0 +0 +0 +0 +0 0.5 2 4.71 @@ -1359,8 +1359,8 @@ POSTHOOK: Input: default@decimal_udf #### A masked pattern was here #### -2.2E+3 5E+98 -0E-65 -0E-65 +0 +0 5E+1 5 0.5 @@ -1369,7 +1369,7 @@ POSTHOOK: Input: default@decimal_udf 1E+2 1E+1 1 -0E-65 +0 0.1 0.01 0.15 @@ -1707,9 +1707,9 @@ POSTHOOK: Input: default@decimal_udf 1 1 1 -0.0 -0.00 -0.000 +0 +0 +0 1 2 4 @@ -1774,22 +1774,22 @@ POSTHOOK: Input: default@decimal_udf #### A masked pattern was here #### -4.4E+3 1E+99 -0E-99 +0 0 1E+2 1E+1 1 -0.0 -0.00 +0 +0 2E+2 2E+1 2 0 -0.0 -0.00 -0.0 -0.00 -0.000 +0 +0 +0 +0 +0 -1 -1 -1 @@ -1807,7 +1807,7 @@ POSTHOOK: Input: default@decimal_udf 3 3 3 -0E-25 +0 -1234567891 1.23456789E+9 PREHOOK: query: -- round @@ -1857,7 +1857,7 @@ POSTHOOK: Input: default@decimal_udf #### A masked pattern was here #### -4.4E+3 1E+99 -0E-99 +0 0 1E+2 1E+1 @@ -2027,22 +2027,22 @@ NULL NULL 1 1 -0.0 -0.00 -0.000 +0 +0 +0 1 1 0 NULL -0.0 -0.00 +0 +0 0.1 0.01 0.001 0.1 0.01 0.001 -0.0 +0 0 1 -0.12 diff --git serde/src/java/org/apache/hadoop/hive/serde2/io/BigDecimalWritable.java serde/src/java/org/apache/hadoop/hive/serde2/io/BigDecimalWritable.java index 1d0a31b..db009c4 100644 --- serde/src/java/org/apache/hadoop/hive/serde2/io/BigDecimalWritable.java +++ serde/src/java/org/apache/hadoop/hive/serde2/io/BigDecimalWritable.java @@ -57,6 +57,10 @@ public BigDecimalWritable(BigDecimal value) { public void set(BigDecimal value) { value = value.stripTrailingZeros(); + if (value.compareTo(BigDecimal.ZERO) == 0) { + // Special case for 0, because java doesn't strip zeros correctly on that number. + value = BigDecimal.ZERO; + } set(value.unscaledValue().toByteArray(), value.scale()); } {code} > Add DECIMAL data type > --------------------- > > Key: HIVE-2693 > URL: https://issues.apache.org/jira/browse/HIVE-2693 > Project: Hive > Issue Type: New Feature > Components: Query Processor, Types > Affects Versions: 0.10.0 > Reporter: Carl Steinbach > Assignee: Prasad Mujumdar > Attachments: 2693_7.patch, 2693_8.patch, 2693_fix_all_tests1.patch, > HIVE-2693-10.patch, HIVE-2693-11.patch, HIVE-2693-12-SortableSerDe.patch, > HIVE-2693-13.patch, HIVE-2693-14.patch, HIVE-2693-15.patch, > HIVE-2693-16.patch, HIVE-2693-17.patch, HIVE-2693-18.patch, > HIVE-2693-19.patch, HIVE-2693-1.patch.txt, HIVE-2693-20.patch, > HIVE-2693-21.patch, HIVE-2693-22.patch, HIVE-2693-23.patch, > HIVE-2693-all.patch, HIVE-2693.D7683.1.patch, HIVE-2693-fix.patch, > HIVE-2693.patch, HIVE-2693-take3.patch, HIVE-2693-take4.patch > > > Add support for the DECIMAL data type. HIVE-2272 (TIMESTAMP) provides a nice > template for how to do this. -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira