You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by cw...@apache.org on 2012/06/11 21:16:29 UTC

svn commit: r1348976 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/exec/ java/org/apache/hadoop/hive/ql/udf/generic/ test/queries/clientnegative/ test/queries/clientpositive/ test/results/clientnegative/ test/results/clientpositive/

Author: cws
Date: Mon Jun 11 19:16:28 2012
New Revision: 1348976

URL: http://svn.apache.org/viewvc?rev=1348976&view=rev
Log:
HIVE-2694. Add FORMAT UDF (Zhenxiao Luo via cws)

Added:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java   (with props)
    hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong1.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong2.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong3.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong4.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong5.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong6.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong7.q
    hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q
    hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong1.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong2.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong3.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong4.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong6.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/exec/FunctionRegistry.java
    hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java?rev=1348976&r1=1348975&r2=1348976&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java Mon Jun 11 19:16:28 2012
@@ -163,6 +163,7 @@ import org.apache.hadoop.hive.ql.udf.gen
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFEWAHBitmapOr;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFElt;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFField;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDFFormatNumber;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFFromUtcTimestamp;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFHash;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFIf;
@@ -456,6 +457,7 @@ public final class FunctionRegistry {
     registerGenericUDF("sentences", GenericUDFSentences.class);
     registerGenericUDF("map_keys", GenericUDFMapKeys.class);
     registerGenericUDF("map_values", GenericUDFMapValues.class);
+    registerGenericUDF("format_number", GenericUDFFormatNumber.class);
     registerGenericUDF("printf", GenericUDFPrintf.class);
 
     registerGenericUDF("from_utc_timestamp", GenericUDFFromUtcTimestamp.class);

Added: 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=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java Mon Jun 11 19:16:28 2012
@@ -0,0 +1,219 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.generic;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.serde.Constants;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
+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.DoubleObjectInspector;
+import org.apache.hadoop.io.Text;
+
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.lang.Number;
+import java.lang.NumberFormatException;
+
+/**
+ * Generic UDF for format_number function
+ * <code>FORMAT_NUMBER(X, D)</code>.
+ * This is supposed to function like MySQL's FORMAT,
+ * http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#
+ * function_format
+ *
+ * @see org.apache.hadoop.hive.ql.udf.generic.GenericUDF
+ */
+@Description(name = "format_number",
+    value = "_FUNC_(X, D) - Formats the number X to "
+    + "a format like '#,###,###.##', rounded to D decimal places,"
+    + " and returns the result as a string. If D is 0, the result"
+    + " has no decimal point or fractional part."
+    + " This is supposed to function like MySQL's FORMAT",
+    extended = "Example:\n"
+    + "  > SELECT _FUNC_(12332.123456, 4) FROM src LIMIT 1;\n"
+    + "  '12,332.1235'")
+public class GenericUDFFormatNumber extends GenericUDF {
+  private ObjectInspector[] argumentOIs;
+  private final Text resultText = new Text();
+  private final StringBuilder pattern = new StringBuilder("");
+  private final DecimalFormat numberFormat = new DecimalFormat("");
+  private int lastDValue = -1;
+
+  @Override
+  public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
+    if (arguments.length != 2) {
+      throw new UDFArgumentLengthException(
+          "The function FORMAT_NUMBER(X, D) needs two arguments.");
+    }
+
+    switch (arguments[0].getCategory()) {
+      case PRIMITIVE:
+        break;
+      default:
+        throw new UDFArgumentTypeException(0, "Argument 1"
+          + " of function FORMAT_NUMBER must be \""
+          + Constants.TINYINT_TYPE_NAME + "\""
+          + " or \"" + Constants.SMALLINT_TYPE_NAME + "\""
+          + " or \"" + Constants.INT_TYPE_NAME + "\""
+          + " or \"" + Constants.BIGINT_TYPE_NAME + "\""
+          + " or \"" + Constants.DOUBLE_TYPE_NAME + "\""
+          + " or \"" + Constants.FLOAT_TYPE_NAME + "\", but \""
+          + arguments[0].getTypeName() + "\" was found.");
+    }
+
+    switch (arguments[1].getCategory()) {
+      case PRIMITIVE:
+        break;
+      default:
+        throw new UDFArgumentTypeException(1, "Argument 2"
+          + " of function FORMAT_NUMBER must be \""
+          + Constants.TINYINT_TYPE_NAME + "\""
+          + " or \"" + Constants.SMALLINT_TYPE_NAME + "\""
+          + " or \"" + Constants.INT_TYPE_NAME + "\""
+          + " or \"" + Constants.BIGINT_TYPE_NAME + "\", but \""
+          + arguments[1].getTypeName() + "\" was found.");
+    }
+
+    PrimitiveObjectInspector xObjectInspector = (PrimitiveObjectInspector)arguments[0];
+    PrimitiveObjectInspector dObjectInspector = (PrimitiveObjectInspector)arguments[1];
+
+    switch (xObjectInspector.getPrimitiveCategory()) {
+      case VOID:
+      case BYTE:
+      case SHORT:
+      case INT:
+      case LONG:
+      case FLOAT:
+      case DOUBLE:
+        break;
+      default:
+        throw new UDFArgumentTypeException(0, "Argument 1"
+          + " of function FORMAT_NUMBER must be \""
+          + Constants.TINYINT_TYPE_NAME + "\""
+          + " or \"" + Constants.SMALLINT_TYPE_NAME + "\""
+          + " or \"" + Constants.INT_TYPE_NAME + "\""
+          + " or \"" + Constants.BIGINT_TYPE_NAME + "\""
+          + " or \"" + Constants.DOUBLE_TYPE_NAME + "\""
+          + " or \"" + Constants.FLOAT_TYPE_NAME + "\", but \""
+          + arguments[0].getTypeName() + "\" was found.");
+    }
+
+    switch (dObjectInspector.getPrimitiveCategory()) {
+      case VOID:
+      case BYTE:
+      case SHORT:
+      case INT:
+      case LONG:
+        break;
+      default:
+        throw new UDFArgumentTypeException(1, "Argument 2"
+          + " of function FORMAT_NUMBER must be \""
+          + Constants.TINYINT_TYPE_NAME + "\""
+          + " or \"" + Constants.SMALLINT_TYPE_NAME + "\""
+          + " or \"" + Constants.INT_TYPE_NAME + "\""
+          + " or \"" + Constants.BIGINT_TYPE_NAME + "\", but \""
+          + arguments[1].getTypeName() + "\" was found.");
+    }
+
+    argumentOIs = arguments;
+    return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+  }
+
+  @Override
+  public Object evaluate(DeferredObject[] arguments) throws HiveException {
+    int dValue = ((IntObjectInspector) argumentOIs[1]).get(arguments[1].get());
+
+    if (dValue < 0) {
+      throw new HiveException("Argument 2 of function FORMAT_NUMBER must be >= 0, but \""
+      + dValue + "\" was found");
+    }
+
+    if (dValue != lastDValue) {
+      // construct a new DecimalFormat only if a new dValue
+      pattern.delete(0, pattern.length());
+      pattern.append("#,###,###,###,###,###,##0");
+
+      //decimal place
+      if (dValue > 0) {
+        pattern.append(".");
+        for (int i = 0; i < dValue; i++) {
+          pattern.append("0");
+        }
+      }
+      DecimalFormat dFormat = new DecimalFormat(pattern.toString());
+      lastDValue = dValue;
+      numberFormat.applyPattern(dFormat.toPattern());
+    }
+
+    double xDoubleValue = 0.0;
+    int xIntValue = 0;
+    long xLongValue = 0L;
+
+    PrimitiveObjectInspector xObjectInspector = (PrimitiveObjectInspector)argumentOIs[0];
+    switch (xObjectInspector.getPrimitiveCategory()) {
+      case VOID:
+      case FLOAT:
+      case DOUBLE:
+        xDoubleValue = ((DoubleObjectInspector) argumentOIs[0]).get(arguments[0].get());
+        resultText.set(numberFormat.format(xDoubleValue));
+        break;
+      case BYTE:
+      case SHORT:
+      case INT:
+        xIntValue = ((IntObjectInspector) argumentOIs[0]).get(arguments[0].get());
+        resultText.set(numberFormat.format(xIntValue));
+        break;
+      case LONG:
+        xLongValue = ((LongObjectInspector) argumentOIs[0]).get(arguments[0].get());
+        resultText.set(numberFormat.format(xLongValue));
+        break;
+      default:
+        throw new HiveException("Argument 1 of function FORMAT_NUMBER must be "
+          + Constants.TINYINT_TYPE_NAME + "\""
+          + " or \"" + Constants.SMALLINT_TYPE_NAME + "\""
+          + " or \"" + Constants.INT_TYPE_NAME + "\""
+          + " or \"" + Constants.BIGINT_TYPE_NAME + "\""
+          + " or \"" + Constants.DOUBLE_TYPE_NAME + "\""
+          + " or \"" + Constants.FLOAT_TYPE_NAME + "\", but \""
+          + argumentOIs[0].getTypeName() + "\" was found.");
+    }
+    return resultText;
+  }
+
+  @Override
+  public String getDisplayString(String[] children) {
+    assert (children.length == 2);
+    StringBuilder sb = new StringBuilder();
+    sb.append("format_number(");
+    for (int i = 0; i < children.length - 1; i++) {
+      sb.append(children[i]).append(", ");
+    }
+    sb.append(children[children.length - 1]).append(")");
+    return sb.toString();
+  }
+}

Propchange: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFFormatNumber.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong1.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong1.q?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong1.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong1.q Mon Jun 11 19:16:28 2012
@@ -0,0 +1,2 @@
+-- invalid argument length
+SELECT format_number(12332.123456) FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong2.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong2.q?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong2.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong2.q Mon Jun 11 19:16:28 2012
@@ -0,0 +1,2 @@
+-- invalid argument length
+SELECT format_number(12332.123456, 2, 3) FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong3.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong3.q?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong3.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong3.q Mon Jun 11 19:16:28 2012
@@ -0,0 +1,2 @@
+-- invalid argument(second argument should be >= 0)
+SELECT format_number(12332.123456, -4) FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong4.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong4.q?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong4.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong4.q Mon Jun 11 19:16:28 2012
@@ -0,0 +1,2 @@
+-- invalid argument type
+SELECT format_number(12332.123456, 4.01) FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong5.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong5.q?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong5.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong5.q Mon Jun 11 19:16:28 2012
@@ -0,0 +1,2 @@
+-- invalid argument type
+SELECT format_number(array(12332.123456, 321.23), 5) FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong6.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong6.q?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong6.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong6.q Mon Jun 11 19:16:28 2012
@@ -0,0 +1,2 @@
+-- invalid argument type
+SELECT format_number(12332.123456, "4") FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong7.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong7.q?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong7.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_format_number_wrong7.q Mon Jun 11 19:16:28 2012
@@ -0,0 +1,2 @@
+-- invalid argument type(format_number returns the result as a string)
+SELECT format_number(format_number(12332.123456, 4), 2) FROM src LIMIT 1;

Added: 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=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_format_number.q Mon Jun 11 19:16:28 2012
@@ -0,0 +1,57 @@
+use default;
+-- Test format_number() UDF
+
+DESCRIBE FUNCTION format_number;
+DESCRIBE FUNCTION EXTENDED format_number;
+
+EXPLAIN
+SELECT format_number(12332.123456, 4),
+    format_number(12332.1,4),
+    format_number(12332.2,0) FROM src limit 1;
+
+SELECT format_number(12332.123456, 4),
+    format_number(12332.1,4),
+    format_number(12332.2,0)
+FROM src limit 1;
+
+-- positive numbers
+SELECT format_number(0.123456789, 12),
+    format_number(12345678.123456789, 5),
+    format_number(1234567.123456789, 7),
+    format_number(123456.123456789, 0)
+FROM src limit 1;
+
+-- negative numbers
+SELECT format_number(-123456.123456789, 0),
+    format_number(-1234567.123456789, 2),
+    format_number(-0.123456789, 15),
+    format_number(-12345.123456789, 4)
+FROM src limit 1;
+
+-- zeros
+SELECT format_number(0.0, 4),
+    format_number(0.000000, 1),
+    format_number(000.0000, 1),
+    format_number(00000.0000, 1),
+    format_number(-00.0, 4)
+FROM src limit 1;
+
+-- integers
+SELECT format_number(0, 0),
+    format_number(1, 4),
+    format_number(12, 2),
+    format_number(123, 5),
+    format_number(1234, 7)
+FROM src limit 1;
+
+-- long and double boundary
+-- 9223372036854775807 is LONG_MAX
+-- -9223372036854775807 is one more than LONG_MIN,
+-- due to HIVE-2733, put it here to check LONG_MIN boundary
+-- 4.9E-324 and 1.7976931348623157E308 are Double.MIN_VALUE and Double.MAX_VALUE
+-- check them for Double boundary
+SELECT format_number(-9223372036854775807, 10),
+    format_number(9223372036854775807, 20),
+    format_number(4.9E-324, 324),
+    format_number(1.7976931348623157E308, 308)
+FROM src limit 1;

Added: hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong1.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong1.q.out?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong1.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong1.q.out Mon Jun 11 19:16:28 2012
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10015]: Line 2:7 Arguments length mismatch '12332.123456': The function FORMAT_NUMBER(X, D) needs two arguments.

Added: hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong2.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong2.q.out?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong2.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong2.q.out Mon Jun 11 19:16:28 2012
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10015]: Line 2:7 Arguments length mismatch '3': The function FORMAT_NUMBER(X, D) needs two arguments.

Added: hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong3.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong3.q.out?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong3.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong3.q.out Mon Jun 11 19:16:28 2012
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10014]: Line 2:7 Wrong arguments '4': org.apache.hadoop.hive.ql.metadata.HiveException: Argument 2 of function FORMAT_NUMBER must be >= 0, but "-4" was found

Added: hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong4.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong4.q.out?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong4.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong4.q.out Mon Jun 11 19:16:28 2012
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10016]: Line 2:35 Argument type mismatch '4.01': Argument 2 of function FORMAT_NUMBER must be "tinyint" or "smallint" or "int" or "bigint", but "double" was found.

Added: 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=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong5.q.out Mon Jun 11 19:16:28 2012
@@ -0,0 +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.

Added: hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong6.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong6.q.out?rev=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong6.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong6.q.out Mon Jun 11 19:16:28 2012
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10016]: Line 2:35 Argument type mismatch '"4"': Argument 2 of function FORMAT_NUMBER must be "tinyint" or "smallint" or "int" or "bigint", but "string" was found.

Added: 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=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_format_number_wrong7.q.out Mon Jun 11 19:16:28 2012
@@ -0,0 +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.

Modified: hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out?rev=1348976&r1=1348975&r2=1348976&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out (original)
+++ hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out Mon Jun 11 19:16:28 2012
@@ -64,6 +64,7 @@ explode
 field
 find_in_set
 floor
+format_number
 from_unixtime
 from_utc_timestamp
 get_json_object

Added: 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=1348976&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_format_number.q.out Mon Jun 11 19:16:28 2012
@@ -0,0 +1,191 @@
+PREHOOK: query: use default
+PREHOOK: type: SWITCHDATABASE
+POSTHOOK: query: use default
+POSTHOOK: type: SWITCHDATABASE
+PREHOOK: query: -- Test format_number() UDF
+
+DESCRIBE FUNCTION format_number
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: -- Test format_number() UDF
+
+DESCRIBE FUNCTION format_number
+POSTHOOK: type: DESCFUNCTION
+format_number(X, D) - Formats the number X to a format like '#,###,###.##', rounded to D decimal places, and returns the result as a string. If D is 0, the result has no decimal point or fractional part. This is supposed to function like MySQL's FORMAT
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED format_number
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED format_number
+POSTHOOK: type: DESCFUNCTION
+format_number(X, D) - Formats the number X to a format like '#,###,###.##', rounded to D decimal places, and returns the result as a string. If D is 0, the result has no decimal point or fractional part. This is supposed to function like MySQL's FORMAT
+Example:
+  > SELECT format_number(12332.123456, 4) FROM src LIMIT 1;
+  '12,332.1235'
+PREHOOK: query: EXPLAIN
+SELECT format_number(12332.123456, 4),
+    format_number(12332.1,4),
+    format_number(12332.2,0) FROM src limit 1
+PREHOOK: type: QUERY
+POSTHOOK: query: EXPLAIN
+SELECT format_number(12332.123456, 4),
+    format_number(12332.1,4),
+    format_number(12332.2,0) FROM src limit 1
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+  (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME src))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION format_number 12332.123456 4)) (TOK_SELEXPR (TOK_FUNCTION format_number 12332.1 4)) (TOK_SELEXPR (TOK_FUNCTION format_number 12332.2 0))) (TOK_LIMIT 1)))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        src 
+          TableScan
+            alias: src
+            Select Operator
+              expressions:
+                    expr: format_number(12332.123456, 4)
+                    type: string
+                    expr: format_number(12332.1, 4)
+                    type: string
+                    expr: format_number(12332.2, 0)
+                    type: string
+              outputColumnNames: _col0, _col1, _col2
+              Limit
+                File Output Operator
+                  compressed: false
+                  GlobalTableId: 0
+                  table:
+                      input format: org.apache.hadoop.mapred.TextInputFormat
+                      output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: 1
+
+
+PREHOOK: query: SELECT format_number(12332.123456, 4),
+    format_number(12332.1,4),
+    format_number(12332.2,0)
+FROM src limit 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT format_number(12332.123456, 4),
+    format_number(12332.1,4),
+    format_number(12332.2,0)
+FROM src limit 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+12,332.1235	12,332.1000	12,332
+PREHOOK: query: -- positive numbers
+SELECT format_number(0.123456789, 12),
+    format_number(12345678.123456789, 5),
+    format_number(1234567.123456789, 7),
+    format_number(123456.123456789, 0)
+FROM src limit 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: -- positive numbers
+SELECT format_number(0.123456789, 12),
+    format_number(12345678.123456789, 5),
+    format_number(1234567.123456789, 7),
+    format_number(123456.123456789, 0)
+FROM src limit 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+0.123456789000	12,345,678.12346	1,234,567.1234568	123,456
+PREHOOK: query: -- negative numbers
+SELECT format_number(-123456.123456789, 0),
+    format_number(-1234567.123456789, 2),
+    format_number(-0.123456789, 15),
+    format_number(-12345.123456789, 4)
+FROM src limit 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: -- negative numbers
+SELECT format_number(-123456.123456789, 0),
+    format_number(-1234567.123456789, 2),
+    format_number(-0.123456789, 15),
+    format_number(-12345.123456789, 4)
+FROM src limit 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+-123,456	-1,234,567.12	-0.123456789000000	-12,345.1235
+PREHOOK: query: -- zeros
+SELECT format_number(0.0, 4),
+    format_number(0.000000, 1),
+    format_number(000.0000, 1),
+    format_number(00000.0000, 1),
+    format_number(-00.0, 4)
+FROM src limit 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: -- zeros
+SELECT format_number(0.0, 4),
+    format_number(0.000000, 1),
+    format_number(000.0000, 1),
+    format_number(00000.0000, 1),
+    format_number(-00.0, 4)
+FROM src limit 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+0.0000	0.0	0.0	0.0	-0.0000
+PREHOOK: query: -- integers
+SELECT format_number(0, 0),
+    format_number(1, 4),
+    format_number(12, 2),
+    format_number(123, 5),
+    format_number(1234, 7)
+FROM src limit 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: -- integers
+SELECT format_number(0, 0),
+    format_number(1, 4),
+    format_number(12, 2),
+    format_number(123, 5),
+    format_number(1234, 7)
+FROM src limit 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+0	1.0000	12.00	123.00000	1,234.0000000
+PREHOOK: query: -- long and double boundary
+-- 9223372036854775807 is LONG_MAX
+-- -9223372036854775807 is one more than LONG_MIN,
+-- due to HIVE-2733, put it here to check LONG_MIN boundary
+-- 4.9E-324 and 1.7976931348623157E308 are Double.MIN_VALUE and Double.MAX_VALUE
+-- check them for Double boundary
+SELECT format_number(-9223372036854775807, 10),
+    format_number(9223372036854775807, 20),
+    format_number(4.9E-324, 324),
+    format_number(1.7976931348623157E308, 308)
+FROM src limit 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: -- long and double boundary
+-- 9223372036854775807 is LONG_MAX
+-- -9223372036854775807 is one more than LONG_MIN,
+-- due to HIVE-2733, put it here to check LONG_MIN boundary
+-- 4.9E-324 and 1.7976931348623157E308 are Double.MIN_VALUE and Double.MAX_VALUE
+-- check them for Double boundary
+SELECT format_number(-9223372036854775807, 10),
+    format_number(9223372036854775807, 20),
+    format_number(4.9E-324, 324),
+    format_number(1.7976931348623157E308, 308)
+FROM src limit 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+-9,223,372,036,854,775,807.0000000000	9,223,372,036,854,775,807.00000000000000000000	0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005	179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000