Author: szehon
Date: Sat Jul 12 22:08:29 2014
New Revision: 1610069

URL: http://svn.apache.org/r1610069
Log:
HIVE-7279: UDF format_number() does not work on DECIMAL types (Wilbur Yang via 
Szehon)

Modified:
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
    hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q
    hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out
    hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
 Sat Jul 12 22:08:29 2014
@@ -20,6 +20,7 @@ package org.apache.hadoop.hive.ql.udf.ge
 
 import java.text.DecimalFormat;
 
+import org.apache.hadoop.hive.common.type.HiveDecimal;
 import org.apache.hadoop.hive.ql.exec.Description;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
@@ -32,6 +33,7 @@ import org.apache.hadoop.hive.serde2.obj
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.FloatObjectInspector;
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.IntObjectInspector;
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.LongObjectInspector;
+import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.HiveDecimalObjectInspector;
 import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
 import org.apache.hadoop.io.Text;
 
@@ -78,7 +80,8 @@ public class GenericUDFFormatNumber exte
           + " or \"" + serdeConstants.INT_TYPE_NAME + "\""
           + " or \"" + serdeConstants.BIGINT_TYPE_NAME + "\""
           + " or \"" + serdeConstants.DOUBLE_TYPE_NAME + "\""
-          + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\", but \""
+          + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\""
+          + " or \"" + serdeConstants.DECIMAL_TYPE_NAME + "\", but \""
           + arguments[0].getTypeName() + "\" was found.");
     }
 
@@ -104,8 +107,9 @@ public class GenericUDFFormatNumber exte
       case SHORT:
       case INT:
       case LONG:
-      case FLOAT:
       case DOUBLE:
+      case FLOAT:
+      case DECIMAL:
         break;
       default:
         throw new UDFArgumentTypeException(0, "Argument 1"
@@ -115,7 +119,8 @@ public class GenericUDFFormatNumber exte
           + " or \"" + serdeConstants.INT_TYPE_NAME + "\""
           + " or \"" + serdeConstants.BIGINT_TYPE_NAME + "\""
           + " or \"" + serdeConstants.DOUBLE_TYPE_NAME + "\""
-          + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\", but \""
+          + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\""
+          + " or \"" + serdeConstants.DECIMAL_TYPE_NAME + "\", but \""
           + arguments[0].getTypeName() + "\" was found.");
     }
 
@@ -168,6 +173,7 @@ public class GenericUDFFormatNumber exte
 
     double xDoubleValue = 0.0;
     float xFloatValue = 0.0f;
+    HiveDecimal xDecimalValue = null;
     int xIntValue = 0;
     long xLongValue = 0L;
 
@@ -182,6 +188,11 @@ public class GenericUDFFormatNumber exte
         xFloatValue = ((FloatObjectInspector) 
argumentOIs[0]).get(arguments[0].get());
         resultText.set(numberFormat.format(xFloatValue));
         break;
+      case DECIMAL:
+        xDecimalValue = ((HiveDecimalObjectInspector) argumentOIs[0])
+            .getPrimitiveJavaObject(arguments[0].get());
+        resultText.set(numberFormat.format(xDecimalValue.bigDecimalValue()));
+        break;
       case BYTE:
       case SHORT:
       case INT:
@@ -199,7 +210,8 @@ public class GenericUDFFormatNumber exte
           + " or \"" + serdeConstants.INT_TYPE_NAME + "\""
           + " or \"" + serdeConstants.BIGINT_TYPE_NAME + "\""
           + " or \"" + serdeConstants.DOUBLE_TYPE_NAME + "\""
-          + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\", but \""
+          + " or \"" + serdeConstants.FLOAT_TYPE_NAME + "\""
+          + " or \"" + serdeConstants.DECIMAL_TYPE_NAME + "\", but \""
           + argumentOIs[0].getTypeName() + "\" was found.");
     }
     return resultText;

Modified: hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q (original)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q Sat Jul 
12 22:08:29 2014
@@ -63,3 +63,11 @@ SELECT format_number(CAST(12332.123456 A
     format_number(CAST(12332.1 AS FLOAT), 4),
     format_number(CAST(-12332.2 AS FLOAT), 0)
 FROM src tablesample (1 rows);
+
+-- decimals
+SELECT format_number(12332.123456BD, 4),
+    format_number(12332.123456BD, 2),
+    format_number(12332.1BD, 4),
+    format_number(-12332.2BD, 0),
+    format_number(CAST(12332.567 AS DECIMAL(8, 1)), 4)
+FROM src tablesample (1 rows);

Modified: 
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out 
(original)
+++ 
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out 
Sat Jul 12 22:08:29 2014
@@ -1 +1 @@
-FAILED: SemanticException [Error 10016]: Line 2:21 Argument type mismatch 
'321.23': Argument 1 of function FORMAT_NUMBER must be "tinyint" or "smallint" 
or "int" or "bigint" or "double" or "float", but "array<double>" was found.
+FAILED: SemanticException [Error 10016]: Line 2:21 Argument type mismatch 
'321.23': Argument 1 of function FORMAT_NUMBER must be "tinyint" or "smallint" 
or "int" or "bigint" or "double" or "float" or "decimal", but "array<double>" 
was found.

Modified: 
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out 
(original)
+++ 
hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out 
Sat Jul 12 22:08:29 2014
@@ -1 +1 @@
-FAILED: SemanticException [Error 10016]: Line 2:21 Argument type mismatch '4': 
Argument 1 of function FORMAT_NUMBER must be "tinyint" or "smallint" or "int" 
or "bigint" or "double" or "float", but "string" was found.
+FAILED: SemanticException [Error 10016]: Line 2:21 Argument type mismatch '4': 
Argument 1 of function FORMAT_NUMBER must be "tinyint" or "smallint" or "int" 
or "bigint" or "double" or "float" or "decimal", but "string" was found.

Modified: hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out?rev=1610069&r1=1610068&r2=1610069&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out 
(original)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out Sat 
Jul 12 22:08:29 2014
@@ -188,3 +188,24 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@src
 #### A masked pattern was here ####
 12,332.1230    12,332.0996     -12,332
+PREHOOK: query: -- decimals
+SELECT format_number(12332.123456BD, 4),
+    format_number(12332.123456BD, 2),
+    format_number(12332.1BD, 4),
+    format_number(-12332.2BD, 0),
+    format_number(CAST(12332.567 AS DECIMAL(8, 1)), 4)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: -- decimals
+SELECT format_number(12332.123456BD, 4),
+    format_number(12332.123456BD, 2),
+    format_number(12332.1BD, 4),
+    format_number(-12332.2BD, 0),
+    format_number(CAST(12332.567 AS DECIMAL(8, 1)), 4)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+12,332.1235    12,332.12       12,332.1000     -12,332 12,332.6000


Reply via email to