Index: ql/src/test/results/clientpositive/udf_round.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_round.q.out (revision 1406041) +++ ql/src/test/results/clientpositive/udf_round.q.out (working copy) @@ -40,7 +40,7 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -55555 55555.0 55555.0 55555.0 55555.0 55560.0 55600.0 56000.0 60000.0 100000.0 0.0 0.0 0.0 +55555.0 55555.0 55555.0 55555.0 55555.0 55560.0 55600.0 56000.0 60000.0 100000.0 0.0 0.0 0.0 PREHOOK: query: SELECT round(125.315), round(125.315, 0), round(125.315, 1), round(125.315, 2), round(125.315, 3), round(125.315, 4), @@ -63,7 +63,7 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -125 125.0 125.3 125.32 125.315 125.315 130.0 100.0 0.0 0.0 -125 -125.0 -125.3 -125.32 -125.315 -125.315 -130.0 -100.0 0.0 0.0 +125.0 125.0 125.3 125.32 125.315 125.315 130.0 100.0 0.0 0.0 -125.0 -125.0 -125.3 -125.32 -125.315 -125.315 -130.0 -100.0 0.0 0.0 PREHOOK: query: SELECT round(3.141592653589793, -15), round(3.141592653589793, -16), round(3.141592653589793, -13), round(3.141592653589793, -14), Index: ql/src/test/results/clientpositive/udf_round_2.q.out =================================================================== --- ql/src/test/results/clientpositive/udf_round_2.q.out (revision 0) +++ ql/src/test/results/clientpositive/udf_round_2.q.out (working copy) @@ -0,0 +1,48 @@ +PREHOOK: query: -- test for Nan (not-a-number) +create table tstTbl1(n double) +PREHOOK: type: CREATETABLE +POSTHOOK: query: -- test for Nan (not-a-number) +create table tstTbl1(n double) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@tstTbl1 +PREHOOK: query: insert overwrite table tstTbl1 +select 'NaN' from src limit 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@tsttbl1 +POSTHOOK: query: insert overwrite table tstTbl1 +select 'NaN' from src limit 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@tsttbl1 +POSTHOOK: Lineage: tsttbl1.n EXPRESSION [] +PREHOOK: query: select * from tstTbl1 +PREHOOK: type: QUERY +PREHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: query: select * from tstTbl1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: Lineage: tsttbl1.n EXPRESSION [] +NaN +PREHOOK: query: select round(n, 1) from tstTbl1 +PREHOOK: type: QUERY +PREHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: query: select round(n, 1) from tstTbl1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: Lineage: tsttbl1.n EXPRESSION [] +NaN +PREHOOK: query: select round(n) from tstTbl1 +PREHOOK: type: QUERY +PREHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: query: select round(n) from tstTbl1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: Lineage: tsttbl1.n EXPRESSION [] +NaN Index: ql/src/test/queries/clientpositive/udf_round_2.q =================================================================== --- ql/src/test/queries/clientpositive/udf_round_2.q (revision 0) +++ ql/src/test/queries/clientpositive/udf_round_2.q (working copy) @@ -0,0 +1,11 @@ +-- test for Nan (not-a-number) +create table tstTbl1(n double); + +insert overwrite table tstTbl1 +select 'NaN' from src limit 1; + +select * from tstTbl1; + +select round(n, 1) from tstTbl1; +select round(n) from tstTbl1; + Index: ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java (revision 1406041) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRound.java (working copy) @@ -25,7 +25,6 @@ import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.hive.serde2.io.DoubleWritable; import org.apache.hadoop.io.IntWritable; -import org.apache.hadoop.io.LongWritable; /** * UDFRound. @@ -36,33 +35,34 @@ extended = "Example:\n" + " > SELECT _FUNC_(12.3456, 1) FROM src LIMIT 1;\n" + " 12.3'") public class UDFRound extends UDF { - private DoubleWritable doubleWritable = new DoubleWritable(); - private LongWritable longWritable = new LongWritable(); + private final DoubleWritable doubleWritable = new DoubleWritable(); public UDFRound() { } - public LongWritable evaluate(DoubleWritable n) { + private DoubleWritable evaluate(DoubleWritable n, int i) { + double d = n.get(); + if (Double.isNaN(d) || Double.isInfinite(d)) { + doubleWritable.set(d); + } else { + doubleWritable.set(BigDecimal.valueOf(d).setScale(i, + RoundingMode.HALF_UP).doubleValue()); + } + return doubleWritable; + } + + public DoubleWritable evaluate(DoubleWritable n) { if (n == null) { return null; } - longWritable.set(BigDecimal.valueOf(n.get()).setScale(0, - RoundingMode.HALF_UP).longValue()); - return longWritable; + return evaluate(n, 0); } public DoubleWritable evaluate(DoubleWritable n, IntWritable i) { if ((n == null) || (i == null)) { return null; } - double d = n.get(); - if (Double.isNaN(d) || Double.isInfinite(d)) { - doubleWritable.set(d); - } else { - doubleWritable.set(BigDecimal.valueOf(d).setScale(i.get(), - RoundingMode.HALF_UP).doubleValue()); - } - return doubleWritable; + return evaluate(n, i.get()); } }