diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTrunc.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTrunc.java index 036d112..ba768fa 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTrunc.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFTrunc.java @@ -95,7 +95,7 @@ private int scale = 0; private boolean inputSacleConst; private boolean dateTypeArg; - + @Override public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException { if (arguments.length == 2) { @@ -441,8 +441,14 @@ private Calendar evalDate(Date d) throws UDFArgumentException { } protected HiveDecimal trunc(HiveDecimal input, int scale) { - BigDecimal bigDecimal = trunc(input.bigDecimalValue(), scale); - return HiveDecimal.create(bigDecimal); + BigDecimal bigDecimal = input.bigDecimalValue(); + String stringInput = bigDecimal.stripTrailingZeros().toPlainString(); + if (!isScaleGreater(stringInput, scale)) { + BigDecimal bigDecimalVal = trunc(bigDecimal, scale); + return HiveDecimal.create(bigDecimalVal); + } else { + return input; + } } protected long trunc(long input, int scale) { @@ -450,14 +456,25 @@ protected long trunc(long input, int scale) { } protected double trunc(double input, int scale) { - return trunc(BigDecimal.valueOf(input), scale).doubleValue(); + BigDecimal bigDecimal = BigDecimal.valueOf(input); + String stringInput = bigDecimal.stripTrailingZeros().toPlainString(); + if (!isScaleGreater(stringInput, scale)) { + return trunc(bigDecimal, scale).doubleValue(); + } else { + return input; + } } protected DoubleWritable trunc(DoubleWritable input, int scale) { BigDecimal bigDecimal = new BigDecimal(input.get()); - BigDecimal trunc = trunc(bigDecimal, scale); - DoubleWritable doubleWritable = new DoubleWritable(trunc.doubleValue()); - return doubleWritable; + String stringInput = bigDecimal.stripTrailingZeros().toPlainString(); + if (!isScaleGreater(stringInput, scale)) { + BigDecimal trunc = trunc(bigDecimal, scale); + DoubleWritable doubleWritable = new DoubleWritable(trunc.doubleValue()); + return doubleWritable; + } else { + return input; + } } protected BigDecimal trunc(BigDecimal input, int scale) { @@ -478,4 +495,11 @@ protected BigDecimal trunc(BigDecimal input, int scale) { return output; } + private boolean isScaleGreater(String input, int scale) { + String[] split = input.split("\\."); + boolean isScaleGreater = false; + isScaleGreater = (scale > 0 && scale >= split[1].length()) ? true : false; + return isScaleGreater; + } + } \ No newline at end of file diff --git ql/src/test/queries/clientpositive/udf_trunc_number.q ql/src/test/queries/clientpositive/udf_trunc_number.q index b3fd9e5..ac3ddb6 100644 --- ql/src/test/queries/clientpositive/udf_trunc_number.q +++ ql/src/test/queries/clientpositive/udf_trunc_number.q @@ -4,6 +4,26 @@ EXPLAIN SELECT trunc(1234567891.1234567891,4), trunc(1234567891.1234567891,-4), SELECT trunc(1234567891.1234567891,4), trunc(1234567891.1234567891,-4), trunc(1234567891.1234567891,0), trunc(1234567891.1234567891) FROM src tablesample (1 rows); +SELECT trunc(1234567891.1234567891,100), trunc(1234567891.1234567891,-100), trunc(1234567891.1234567891,0), trunc(1234567891.1234567891) FROM src tablesample (1 rows); + +SELECT trunc(-1234567891.1234567891,4), trunc(-1234567891.1234567891,-4), trunc(-1234567891.1234567891,0), trunc(-1234567891.1234567891) FROM src tablesample (1 rows); + +select trunc(1234567891.1234567891,9), trunc(1234567891.1234567891,10), trunc(1234567891.1234567891,11), trunc(1234567891.1234567891,12) FROM src tablesample (1 rows); + +select trunc(1234567891.1234567891,-9), trunc(1234567891.1234567891,-10), trunc(1234567891.1234567891,-11), trunc(1234567891.1234567891,-12) FROM src tablesample (1 rows); + +select trunc(-1234567891.1234567891,9), trunc(-1234567891.1234567891,10), trunc(-1234567891.1234567891,11), trunc(-1234567891.1234567891,12) FROM src tablesample (1 rows); + +select trunc(-1234567891.1234567891,-9), trunc(-1234567891.1234567891,-10), trunc(-1234567891.1234567891,-11), trunc(-1234567891.1234567891,-12) FROM src tablesample (1 rows); + +select trunc(1234567891.1234567891,15), trunc(1234567891.1234567891,25), trunc(1234567891.1234567891,20), trunc(1234567891.1234567891,50) FROM src tablesample (1 rows); + +select trunc(1234567891.1234567891,-15), trunc(1234567891.1234567891,-25), trunc(1234567891.1234567891,-20), trunc(1234567891.1234567891,-50) FROM src tablesample (1 rows); + +select trunc(-1234567891.1234567891,15), trunc(-1234567891.1234567891,25), trunc(-1234567891.1234567891,20), trunc(-1234567891.1234567891,50) FROM src tablesample (1 rows); + +select trunc(-1234567891.1234567891,-15), trunc(-1234567891.1234567891,-25), trunc(-1234567891.1234567891,-20), trunc(-1234567891.1234567891,-50) FROM src tablesample (1 rows); + DROP TABLE sampletable; CREATE TABLE sampletable(c DOUBLE, d INT) diff --git ql/src/test/results/clientpositive/udf_trunc_number.q.out ql/src/test/results/clientpositive/udf_trunc_number.q.out index dfc9d70..ba53891 100644 --- ql/src/test/results/clientpositive/udf_trunc_number.q.out +++ ql/src/test/results/clientpositive/udf_trunc_number.q.out @@ -29,6 +29,96 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 1234567891.1234 1234560000 1234567891 1234567891 +PREHOOK: query: SELECT trunc(1234567891.1234567891,100), trunc(1234567891.1234567891,-100), trunc(1234567891.1234567891,0), trunc(1234567891.1234567891) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT trunc(1234567891.1234567891,100), trunc(1234567891.1234567891,-100), trunc(1234567891.1234567891,0), trunc(1234567891.1234567891) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1234567891.1234567891 0 1234567891 1234567891 +PREHOOK: query: SELECT trunc(-1234567891.1234567891,4), trunc(-1234567891.1234567891,-4), trunc(-1234567891.1234567891,0), trunc(-1234567891.1234567891) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: SELECT trunc(-1234567891.1234567891,4), trunc(-1234567891.1234567891,-4), trunc(-1234567891.1234567891,0), trunc(-1234567891.1234567891) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +-1234567891.1234 -1234560000 -1234567891 -1234567891 +PREHOOK: query: select trunc(1234567891.1234567891,9), trunc(1234567891.1234567891,10), trunc(1234567891.1234567891,11), trunc(1234567891.1234567891,12) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select trunc(1234567891.1234567891,9), trunc(1234567891.1234567891,10), trunc(1234567891.1234567891,11), trunc(1234567891.1234567891,12) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1234567891.123456789 1234567891.1234567891 1234567891.1234567891 1234567891.1234567891 +PREHOOK: query: select trunc(1234567891.1234567891,-9), trunc(1234567891.1234567891,-10), trunc(1234567891.1234567891,-11), trunc(1234567891.1234567891,-12) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select trunc(1234567891.1234567891,-9), trunc(1234567891.1234567891,-10), trunc(1234567891.1234567891,-11), trunc(1234567891.1234567891,-12) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1000000000 0 0 0 +PREHOOK: query: select trunc(-1234567891.1234567891,9), trunc(-1234567891.1234567891,10), trunc(-1234567891.1234567891,11), trunc(-1234567891.1234567891,12) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select trunc(-1234567891.1234567891,9), trunc(-1234567891.1234567891,10), trunc(-1234567891.1234567891,11), trunc(-1234567891.1234567891,12) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +-1234567891.123456789 -1234567891.1234567891 -1234567891.1234567891 -1234567891.1234567891 +PREHOOK: query: select trunc(-1234567891.1234567891,-9), trunc(-1234567891.1234567891,-10), trunc(-1234567891.1234567891,-11), trunc(-1234567891.1234567891,-12) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select trunc(-1234567891.1234567891,-9), trunc(-1234567891.1234567891,-10), trunc(-1234567891.1234567891,-11), trunc(-1234567891.1234567891,-12) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +-1000000000 0 0 0 +PREHOOK: query: select trunc(1234567891.1234567891,15), trunc(1234567891.1234567891,25), trunc(1234567891.1234567891,20), trunc(1234567891.1234567891,50) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select trunc(1234567891.1234567891,15), trunc(1234567891.1234567891,25), trunc(1234567891.1234567891,20), trunc(1234567891.1234567891,50) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1234567891.1234567891 1234567891.1234567891 1234567891.1234567891 1234567891.1234567891 +PREHOOK: query: select trunc(1234567891.1234567891,-15), trunc(1234567891.1234567891,-25), trunc(1234567891.1234567891,-20), trunc(1234567891.1234567891,-50) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select trunc(1234567891.1234567891,-15), trunc(1234567891.1234567891,-25), trunc(1234567891.1234567891,-20), trunc(1234567891.1234567891,-50) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +0 0 0 0 +PREHOOK: query: select trunc(-1234567891.1234567891,15), trunc(-1234567891.1234567891,25), trunc(-1234567891.1234567891,20), trunc(-1234567891.1234567891,50) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select trunc(-1234567891.1234567891,15), trunc(-1234567891.1234567891,25), trunc(-1234567891.1234567891,20), trunc(-1234567891.1234567891,50) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +-1234567891.1234567891 -1234567891.1234567891 -1234567891.1234567891 -1234567891.1234567891 +PREHOOK: query: select trunc(-1234567891.1234567891,-15), trunc(-1234567891.1234567891,-25), trunc(-1234567891.1234567891,-20), trunc(-1234567891.1234567891,-50) FROM src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select trunc(-1234567891.1234567891,-15), trunc(-1234567891.1234567891,-25), trunc(-1234567891.1234567891,-20), trunc(-1234567891.1234567891,-50) FROM src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +0 0 0 0 PREHOOK: query: DROP TABLE sampletable PREHOOK: type: DROPTABLE POSTHOOK: query: DROP TABLE sampletable