You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jd...@apache.org on 2015/01/24 01:16:54 UTC

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

Author: jdere
Date: Sat Jan 24 00:16:54 2015
New Revision: 1654440

URL: http://svn.apache.org/r1654440
Log:
HIVE-9402: Create GREATEST and LEAST udf (Alexander Pivovarov via Jason Dere)

Added:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java
    hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java
    hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_1.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_2.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_3.q
    hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_4.q
    hive/trunk/ql/src/test/queries/clientpositive/udf_greatest.q
    hive/trunk/ql/src/test/queries/clientpositive/udf_least.q
    hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_1.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out
    hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out
    hive/trunk/ql/src/test/results/clientpositive/udf_greatest.q.out
    hive/trunk/ql/src/test/results/clientpositive/udf_least.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=1654440&r1=1654439&r2=1654440&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 Sat Jan 24 00:16:54 2015
@@ -423,6 +423,8 @@ public final class FunctionRegistry {
     registerGenericUDF("map_values", GenericUDFMapValues.class);
     registerGenericUDF("format_number", GenericUDFFormatNumber.class);
     registerGenericUDF("printf", GenericUDFPrintf.class);
+    registerGenericUDF("greatest", GenericUDFGreatest.class);
+    registerGenericUDF("least", GenericUDFLeast.class);
 
     registerGenericUDF("from_utc_timestamp", GenericUDFFromUtcTimestamp.class);
     registerGenericUDF("to_utc_timestamp", GenericUDFToUtcTimestamp.class);

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java Sat Jan 24 00:16:54 2015
@@ -0,0 +1,117 @@
+/**
+ * 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.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
+
+/**
+ * GenericUDF Class for SQL construct "greatest(v1, v2, .. vn)".
+ *
+ * NOTES: 1. v1, v2 and vn should have the same TypeInfo, or an exception will
+ * be thrown.
+ */
+@Description(name = "greatest",
+    value = "_FUNC_(v1, v2, ...) - Returns the greatest value in a list of values",
+    extended = "Example:\n"
+    + "  > SELECT _FUNC_(2, 3, 1) FROM src LIMIT 1;\n" + "  3")
+public class GenericUDFGreatest extends GenericUDF {
+  private transient ObjectInspector[] argumentOIs;
+  private transient GenericUDFUtils.ReturnObjectInspectorResolver returnOIResolver;
+
+  @Override
+  public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
+    if (arguments.length < 2) {
+      throw new UDFArgumentLengthException(getFuncName() + " requires at least 2 arguments, got "
+          + arguments.length);
+    }
+    if (arguments[0].getCategory() != Category.PRIMITIVE) {
+      throw new UDFArgumentException(getFuncName() + " only takes primitive types, got "
+          + arguments[0].getTypeName());
+    }
+
+    argumentOIs = arguments;
+
+    returnOIResolver = new GenericUDFUtils.ReturnObjectInspectorResolver(false);
+    for (int i = 0; i < arguments.length; i++) {
+      if (!returnOIResolver.update(arguments[i])) {
+        throw new UDFArgumentTypeException(i, "The expressions after " + getFuncName()
+            + " should all have the same type: \"" + returnOIResolver.get().getTypeName()
+            + "\" is expected but \"" + arguments[i].getTypeName() + "\" is found");
+      }
+    }
+    return returnOIResolver.get();
+  }
+
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Override
+  public Object evaluate(DeferredObject[] arguments) throws HiveException {
+    Comparable maxV = null;
+    int maxIndex = 0;
+    for (int i = 0; i < arguments.length; i++) {
+      Object ai = arguments[i].get();
+      if (ai == null) {
+        continue;
+      }
+      // all PRIMITIVEs are Comparable
+      Comparable v = (Comparable) ai;
+      if (maxV == null) {
+        maxV = v;
+        maxIndex = i;
+        continue;
+      }
+      if ((isGreatest() ? 1 : -1) * v.compareTo(maxV) > 0) {
+        maxV = v;
+        maxIndex = i;
+      }
+    }
+    if (maxV != null) {
+      return returnOIResolver.convertIfNecessary(maxV, argumentOIs[maxIndex]);
+    }
+    return null;
+  }
+
+  @Override
+  public String getDisplayString(String[] children) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(getFuncName()).append("(");
+    if (children.length > 0) {
+      sb.append(children[0]);
+      for (int i = 1; i < children.length; i++) {
+        sb.append(",");
+        sb.append(children[i]);
+      }
+    }
+    sb.append(")");
+    return sb.toString();
+  }
+
+  protected String getFuncName() {
+    return "greatest";
+  }
+
+  protected boolean isGreatest() {
+    return true;
+  }
+}

Added: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java (added)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java Sat Jan 24 00:16:54 2015
@@ -0,0 +1,44 @@
+/**
+ * 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;
+
+/**
+ * GenericUDF Class for SQL construct "least(v1, v2, .. vn)".
+ *
+ * NOTES: 1. v1, v2 and vn should have the same TypeInfo, or an exception will
+ * be thrown.
+ */
+@Description(name = "least",
+    value = "_FUNC_(v1, v2, ...) - Returns the least value in a list of values",
+    extended = "Example:\n"
+    + "  > SELECT _FUNC_(2, 3, 1) FROM src LIMIT 1;\n" + "  1")
+public class GenericUDFLeast extends GenericUDFGreatest {
+
+  @Override
+  protected String getFuncName() {
+    return "least";
+  }
+
+  @Override
+  protected boolean isGreatest() {
+    return false;
+  }
+}

Added: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java (added)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java Sat Jan 24 00:16:54 2015
@@ -0,0 +1,200 @@
+/**
+ * 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 java.sql.Date;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
+import org.apache.hadoop.hive.serde2.io.DateWritable;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.Text;
+
+public class TestGenericUDFGreatest extends TestCase {
+
+  public void testOneArg() throws HiveException {
+    @SuppressWarnings("resource")
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    ObjectInspector[] arguments = { valueOI1 };
+
+    UDFArgumentException ex = null;
+    try {
+      udf.initialize(arguments);
+    } catch (UDFArgumentException e) {
+      ex = e;
+    }
+    assertNotNull("greatest() test ", ex);
+  }
+
+  public void testDifferentType() throws HiveException {
+    @SuppressWarnings("resource")
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+    ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector;
+    ObjectInspector[] arguments = { valueOI1, valueOI2 };
+
+    UDFArgumentException ex = null;
+    try {
+      udf.initialize(arguments);
+    } catch (UDFArgumentException e) {
+      ex = e;
+    }
+    assertNotNull("greatest() test ", ex);
+  }
+
+  public void testGreatestStr() throws HiveException {
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector[] arguments = new ObjectInspector[3];
+    for (int i = 0; i < arguments.length; i++) {
+      arguments[i] = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    }
+
+    udf.initialize(arguments);
+
+    runAndVerify(new String[] { "a", "b", "c" }, "c", udf);
+    runAndVerify(new String[] { "C", "a", "B" }, "a", udf);
+    runAndVerify(new String[] { "AAA", "AaA", "AAa" }, "AaA", udf);
+    runAndVerify(new String[] { "A", "AA", "AAA" }, "AAA", udf);
+
+    runAndVerify(new String[] { "11", "13", "12" }, "13", udf);
+    runAndVerify(new String[] { "11", "2", "12" }, "2", udf);
+    runAndVerify(new String[] { "01", "03", "02" }, "03", udf);
+    runAndVerify(new String[] { "01", "1", "02" }, "1", udf);
+
+    runAndVerify(new String[] { null, "b", "c" }, "c", udf);
+    runAndVerify(new String[] { "a", null, "c" }, "c", udf);
+    runAndVerify(new String[] { "a", "b", null }, "b", udf);
+
+    runAndVerify(new String[] { "a", null, null }, "a", udf);
+    runAndVerify(new String[] { null, "b", null }, "b", udf);
+    runAndVerify(new String[] { null, null, null }, null, udf);
+  }
+
+  public void testGreatestInt() throws HiveException {
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector[] arguments = new ObjectInspector[3];
+    for (int i = 0; i < arguments.length; i++) {
+      arguments[i] = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+    }
+
+    udf.initialize(arguments);
+
+    runAndVerify(new Integer[] { 11, 13, 12 }, 13, udf);
+    runAndVerify(new Integer[] { 1, 13, 2 }, 13, udf);
+
+    runAndVerify(new Integer[] { -11, -13, -12 }, -11, udf);
+    runAndVerify(new Integer[] { 1, -13, 2 }, 2, udf);
+
+    runAndVerify(new Integer[] { null, 1, 2 }, 2, udf);
+    runAndVerify(new Integer[] { 1, null, 2 }, 2, udf);
+    runAndVerify(new Integer[] { 1, 2, null }, 2, udf);
+
+    runAndVerify(new Integer[] { null, null, null }, null, udf);
+  }
+
+  public void testGreatestDouble() throws HiveException {
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector[] arguments = new ObjectInspector[3];
+    for (int i = 0; i < arguments.length; i++) {
+      arguments[i] = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector;
+    }
+
+    udf.initialize(arguments);
+
+    runAndVerify(new Double[] { 11.4, 11.5, 11.2 }, 11.5, udf);
+    runAndVerify(new Double[] { 1.0, 13.3, 2.0 }, 13.3, udf);
+
+    runAndVerify(new Double[] { -11.4, -13.1, -12.2 }, -11.4, udf);
+    runAndVerify(new Double[] { 1.0, -13.3, 2.2 }, 2.2, udf);
+
+    runAndVerify(new Double[] { null, 1.1, 2.2 }, 2.2, udf);
+    runAndVerify(new Double[] { 1.1, null, 2.2 }, 2.2, udf);
+    runAndVerify(new Double[] { 1.1, 2.2, null }, 2.2, udf);
+
+    runAndVerify(new Double[] { null, null, null }, null, udf);
+  }
+
+  public void testGreatestDate() throws HiveException {
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector[] arguments = new ObjectInspector[3];
+    for (int i = 0; i < arguments.length; i++) {
+      arguments[i] = PrimitiveObjectInspectorFactory.writableDateObjectInspector;
+    }
+
+    udf.initialize(arguments);
+
+    Date d1 = Date.valueOf("2015-03-20");
+    Date d2 = Date.valueOf("2015-03-21");
+    Date d3 = Date.valueOf("2014-03-20");
+
+    runAndVerify(new Date[] { d1, d2, d3 }, d2, udf);
+
+    runAndVerify(new Date[] { null, d2, d3 }, d2, udf);
+    runAndVerify(new Date[] { d1, null, d3 }, d1, udf);
+    runAndVerify(new Date[] { d1, d2, null }, d2, udf);
+
+    runAndVerify(new Date[] { null, null, null }, null, udf);
+  }
+
+  private void runAndVerify(String[] v, String expResult, GenericUDF udf) throws HiveException {
+    DeferredObject[] args = new DeferredObject[v.length];
+    for (int i = 0; i < v.length; i++) {
+      args[i] = new DeferredJavaObject(v[i] != null ? new Text(v[i]) : null);
+    }
+    Text output = (Text) udf.evaluate(args);
+    assertEquals("greatest() test ", expResult, output != null ? output.toString() : null);
+  }
+
+  private void runAndVerify(Integer[] v, Integer expResult, GenericUDF udf) throws HiveException {
+    DeferredObject[] args = new DeferredObject[v.length];
+    for (int i = 0; i < v.length; i++) {
+      args[i] = new DeferredJavaObject(v[i] != null ? new IntWritable(v[i]) : null);
+    }
+    IntWritable output = (IntWritable) udf.evaluate(args);
+    Integer res = output != null ? Integer.valueOf(output.get()) : null;
+    assertEquals("greatest() test ", expResult, res);
+  }
+
+  private void runAndVerify(Double[] v, Double expResult, GenericUDF udf) throws HiveException {
+    DeferredObject[] args = new DeferredObject[v.length];
+    for (int i = 0; i < v.length; i++) {
+      args[i] = new DeferredJavaObject(v[i] != null ? new DoubleWritable(v[i]) : null);
+    }
+    DoubleWritable output = (DoubleWritable) udf.evaluate(args);
+    Double res = output != null ? Double.valueOf(output.get()) : null;
+    assertEquals("greatest() test ", expResult, res);
+  }
+
+  private void runAndVerify(Date[] v, Date expResult, GenericUDF udf) throws HiveException {
+    DeferredObject[] args = new DeferredObject[v.length];
+    for (int i = 0; i < v.length; i++) {
+      args[i] = new DeferredJavaObject(v[i] != null ? new DateWritable(v[i]) : null);
+    }
+    DateWritable output = (DateWritable) udf.evaluate(args);
+    Date res = output != null ? output.get() : null;
+    assertEquals("greatest() test ", expResult, res);
+  }
+}

Added: hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java (added)
+++ hive/trunk/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java Sat Jan 24 00:16:54 2015
@@ -0,0 +1,200 @@
+/**
+ * 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 java.sql.Date;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
+import org.apache.hadoop.hive.serde2.io.DateWritable;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.Text;
+
+public class TestGenericUDFLeast extends TestCase {
+
+  public void testOneArg() throws HiveException {
+    @SuppressWarnings("resource")
+    GenericUDFLeast udf = new GenericUDFLeast();
+    ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    ObjectInspector[] arguments = { valueOI1 };
+
+    UDFArgumentException ex = null;
+    try {
+      udf.initialize(arguments);
+    } catch (UDFArgumentException e) {
+      ex = e;
+    }
+    assertNotNull("least() test ", ex);
+  }
+
+  public void testDifferentType() throws HiveException {
+    @SuppressWarnings("resource")
+    GenericUDFLeast udf = new GenericUDFLeast();
+    ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+    ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector;
+    ObjectInspector[] arguments = { valueOI1, valueOI2 };
+
+    UDFArgumentException ex = null;
+    try {
+      udf.initialize(arguments);
+    } catch (UDFArgumentException e) {
+      ex = e;
+    }
+    assertNotNull("least() test ", ex);
+  }
+
+  public void testLeastStr() throws HiveException {
+    GenericUDFLeast udf = new GenericUDFLeast();
+    ObjectInspector[] arguments = new ObjectInspector[3];
+    for (int i = 0; i < arguments.length; i++) {
+      arguments[i] = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    }
+
+    udf.initialize(arguments);
+
+    runAndVerify(new String[] { "a", "b", "c" }, "a", udf);
+    runAndVerify(new String[] { "C", "a", "B" }, "B", udf);
+    runAndVerify(new String[] { "AAA", "AaA", "AAa" }, "AAA", udf);
+    runAndVerify(new String[] { "A", "AA", "AAA" }, "A", udf);
+
+    runAndVerify(new String[] { "11", "13", "12" }, "11", udf);
+    runAndVerify(new String[] { "11", "2", "12" }, "11", udf);
+    runAndVerify(new String[] { "01", "03", "02" }, "01", udf);
+    runAndVerify(new String[] { "01", "1", "02" }, "01", udf);
+
+    runAndVerify(new String[] { null, "b", "c" }, "b", udf);
+    runAndVerify(new String[] { "a", null, "c" }, "a", udf);
+    runAndVerify(new String[] { "a", "b", null }, "a", udf);
+
+    runAndVerify(new String[] { "a", null, null }, "a", udf);
+    runAndVerify(new String[] { null, "b", null }, "b", udf);
+    runAndVerify(new String[] { null, null, null }, null, udf);
+  }
+
+  public void testLeastInt() throws HiveException {
+    GenericUDFLeast udf = new GenericUDFLeast();
+    ObjectInspector[] arguments = new ObjectInspector[3];
+    for (int i = 0; i < arguments.length; i++) {
+      arguments[i] = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+    }
+
+    udf.initialize(arguments);
+
+    runAndVerify(new Integer[] { 11, 13, 12 }, 11, udf);
+    runAndVerify(new Integer[] { 1, 13, 2 }, 1, udf);
+
+    runAndVerify(new Integer[] { -11, -13, -12 }, -13, udf);
+    runAndVerify(new Integer[] { 1, -13, 2 }, -13, udf);
+
+    runAndVerify(new Integer[] { null, 1, 2 }, 1, udf);
+    runAndVerify(new Integer[] { 1, null, 2 }, 1, udf);
+    runAndVerify(new Integer[] { 1, 2, null }, 1, udf);
+
+    runAndVerify(new Integer[] { null, null, null }, null, udf);
+  }
+
+  public void testLeastDouble() throws HiveException {
+    GenericUDFLeast udf = new GenericUDFLeast();
+    ObjectInspector[] arguments = new ObjectInspector[3];
+    for (int i = 0; i < arguments.length; i++) {
+      arguments[i] = PrimitiveObjectInspectorFactory.writableDoubleObjectInspector;
+    }
+
+    udf.initialize(arguments);
+
+    runAndVerify(new Double[] { 11.4, 11.5, 11.2 }, 11.2, udf);
+    runAndVerify(new Double[] { 1.0, 13.3, 2.0 }, 1.0, udf);
+
+    runAndVerify(new Double[] { -11.4, -13.1, -12.2 }, -13.1, udf);
+    runAndVerify(new Double[] { 1.0, -13.3, 2.2 }, -13.3, udf);
+
+    runAndVerify(new Double[] { null, 1.1, 2.2 }, 1.1, udf);
+    runAndVerify(new Double[] { 1.1, null, 2.2 }, 1.1, udf);
+    runAndVerify(new Double[] { 1.1, 2.2, null }, 1.1, udf);
+
+    runAndVerify(new Double[] { null, null, null }, null, udf);
+  }
+
+  public void testLeastDate() throws HiveException {
+    GenericUDFLeast udf = new GenericUDFLeast();
+    ObjectInspector[] arguments = new ObjectInspector[3];
+    for (int i = 0; i < arguments.length; i++) {
+      arguments[i] = PrimitiveObjectInspectorFactory.writableDateObjectInspector;
+    }
+
+    udf.initialize(arguments);
+
+    Date d1 = Date.valueOf("2015-03-20");
+    Date d2 = Date.valueOf("2015-03-21");
+    Date d3 = Date.valueOf("2014-03-20");
+
+    runAndVerify(new Date[] { d1, d2, d3 }, d3, udf);
+
+    runAndVerify(new Date[] { null, d2, d3 }, d3, udf);
+    runAndVerify(new Date[] { d1, null, d3 }, d3, udf);
+    runAndVerify(new Date[] { d1, d2, null }, d1, udf);
+
+    runAndVerify(new Date[] { null, null, null }, null, udf);
+  }
+
+  private void runAndVerify(String[] v, String expResult, GenericUDF udf) throws HiveException {
+    DeferredObject[] args = new DeferredObject[v.length];
+    for (int i = 0; i < v.length; i++) {
+      args[i] = new DeferredJavaObject(v[i] != null ? new Text(v[i]) : null);
+    }
+    Text output = (Text) udf.evaluate(args);
+    assertEquals("least() test ", expResult, output != null ? output.toString() : null);
+  }
+
+  private void runAndVerify(Integer[] v, Integer expResult, GenericUDF udf) throws HiveException {
+    DeferredObject[] args = new DeferredObject[v.length];
+    for (int i = 0; i < v.length; i++) {
+      args[i] = new DeferredJavaObject(v[i] != null ? new IntWritable(v[i]) : null);
+    }
+    IntWritable output = (IntWritable) udf.evaluate(args);
+    Integer res = output != null ? Integer.valueOf(output.get()) : null;
+    assertEquals("least() test ", expResult, res);
+  }
+
+  private void runAndVerify(Double[] v, Double expResult, GenericUDF udf) throws HiveException {
+    DeferredObject[] args = new DeferredObject[v.length];
+    for (int i = 0; i < v.length; i++) {
+      args[i] = new DeferredJavaObject(v[i] != null ? new DoubleWritable(v[i]) : null);
+    }
+    DoubleWritable output = (DoubleWritable) udf.evaluate(args);
+    Double res = output != null ? Double.valueOf(output.get()) : null;
+    assertEquals("least() test ", expResult, res);
+  }
+
+  private void runAndVerify(Date[] v, Date expResult, GenericUDF udf) throws HiveException {
+    DeferredObject[] args = new DeferredObject[v.length];
+    for (int i = 0; i < v.length; i++) {
+      args[i] = new DeferredJavaObject(v[i] != null ? new DateWritable(v[i]) : null);
+    }
+    DateWritable output = (DateWritable) udf.evaluate(args);
+    Date res = output != null ? output.get() : null;
+    assertEquals("least() test ", expResult, res);
+  }
+}

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_1.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_1.q?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_1.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_1.q Sat Jan 24 00:16:54 2015
@@ -0,0 +1 @@
+SELECT GREATEST(array('a', 'b'), '2.0') FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_2.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_2.q?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_2.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_2.q Sat Jan 24 00:16:54 2015
@@ -0,0 +1 @@
+SELECT GREATEST(1, 2.2) FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_3.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_3.q?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_3.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_3.q Sat Jan 24 00:16:54 2015
@@ -0,0 +1 @@
+SELECT GREATEST(1, '2') FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_4.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_4.q?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_4.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/udf_greatest_error_4.q Sat Jan 24 00:16:54 2015
@@ -0,0 +1 @@
+SELECT GREATEST(1) FROM src LIMIT 1;

Added: hive/trunk/ql/src/test/queries/clientpositive/udf_greatest.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/udf_greatest.q?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_greatest.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_greatest.q Sat Jan 24 00:16:54 2015
@@ -0,0 +1,57 @@
+set hive.fetch.task.conversion=more;
+
+DESCRIBE FUNCTION greatest;
+DESCRIBE FUNCTION EXTENDED greatest;
+
+EXPLAIN
+SELECT GREATEST('a', 'b', 'c'),
+       GREATEST('C', 'a', 'B'),
+       GREATEST('AAA', 'AaA', 'AAa'),
+       GREATEST('A', 'AA', 'AAA'),
+       GREATEST('11', '13', '12'),
+       GREATEST('11', '2', '12'),
+       GREATEST('01', '03', '02'),
+       GREATEST('01', '1', '02'),
+       GREATEST(null, 'b', 'c' ),
+       GREATEST('a', null, 'c'),
+       GREATEST('a', 'b', null ),
+       GREATEST('a', null, null),
+       GREATEST(null, 'b', null),
+       GREATEST(cast(null as string), null, null)
+FROM src tablesample (1 rows);
+
+SELECT GREATEST('a', 'b', 'c'),
+       GREATEST('C', 'a', 'B'),
+       GREATEST('AAA', 'AaA', 'AAa'),
+       GREATEST('A', 'AA', 'AAA'),
+       GREATEST('11', '13', '12'),
+       GREATEST('11', '2', '12'),
+       GREATEST('01', '03', '02'),
+       GREATEST('01', '1', '02'),
+       GREATEST(null, 'b', 'c' ),
+       GREATEST('a', null, 'c'),
+       GREATEST('a', 'b', null ),
+       GREATEST('a', null, null),
+       GREATEST(null, 'b', null),
+       GREATEST(cast(null as string), null, null)
+FROM src tablesample (1 rows);
+
+SELECT GREATEST(11, 13, 12),
+       GREATEST(1, 13, 2),
+       GREATEST(-11, -13, -12),
+       GREATEST(1, -13, 2),
+       GREATEST(null, 1, 2),
+       GREATEST(1, null, 2),
+       GREATEST(1, 2, null),
+       GREATEST(cast(null as int), null, null)
+FROM src tablesample (1 rows);
+
+SELECT GREATEST(11.4, 13.5, 12.2),
+       GREATEST(1.0, 13.2, 2.0),
+       GREATEST(-11.4, -13.1, -12.2),
+       GREATEST(1.0, -13.3, 2.2),
+       GREATEST(null, 1.1, 2.2),
+       GREATEST(1.1, null, 2.2),
+       GREATEST(1.1, 2.2, null),
+       GREATEST(cast(null as double), null, null)
+FROM src tablesample (1 rows);

Added: hive/trunk/ql/src/test/queries/clientpositive/udf_least.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientpositive/udf_least.q?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientpositive/udf_least.q (added)
+++ hive/trunk/ql/src/test/queries/clientpositive/udf_least.q Sat Jan 24 00:16:54 2015
@@ -0,0 +1,57 @@
+set hive.fetch.task.conversion=more;
+
+DESCRIBE FUNCTION least;
+DESCRIBE FUNCTION EXTENDED least;
+
+EXPLAIN
+SELECT LEAST('a', 'b', 'c'),
+       LEAST('C', 'a', 'B'),
+       LEAST('AAA', 'AaA', 'AAa'),
+       LEAST('A', 'AA', 'AAA'),
+       LEAST('11', '13', '12'),
+       LEAST('11', '2', '12'),
+       LEAST('01', '03', '02'),
+       LEAST('01', '1', '02'),
+       LEAST(null, 'b', 'c' ),
+       LEAST('a', null, 'c'),
+       LEAST('a', 'b', null ),
+       LEAST('a', null, null),
+       LEAST(null, 'b', null),
+       LEAST(cast(null as string), null, null)
+FROM src tablesample (1 rows);
+
+SELECT LEAST('a', 'b', 'c'),
+       LEAST('C', 'a', 'B'),
+       LEAST('AAA', 'AaA', 'AAa'),
+       LEAST('A', 'AA', 'AAA'),
+       LEAST('11', '13', '12'),
+       LEAST('11', '2', '12'),
+       LEAST('01', '03', '02'),
+       LEAST('01', '1', '02'),
+       LEAST(null, 'b', 'c' ),
+       LEAST('a', null, 'c'),
+       LEAST('a', 'b', null ),
+       LEAST('a', null, null),
+       LEAST(null, 'b', null),
+       LEAST(cast(null as string), null, null)
+FROM src tablesample (1 rows);
+
+SELECT LEAST(11, 13, 12),
+       LEAST(1, 13, 2),
+       LEAST(-11, -13, -12),
+       LEAST(1, -13, 2),
+       LEAST(null, 1, 2),
+       LEAST(1, null, 2),
+       LEAST(1, 2, null),
+       LEAST(cast(null as int), null, null)
+FROM src tablesample (1 rows);
+
+SELECT LEAST(11.4, 13.5, 12.2),
+       LEAST(1.0, 13.2, 2.0),
+       LEAST(-11.4, -13.1, -12.2),
+       LEAST(1.0, -13.3, 2.2),
+       LEAST(null, 1.1, 2.2),
+       LEAST(1.1, null, 2.2),
+       LEAST(1.1, 2.2, null),
+       LEAST(cast(null as double), null, null)
+FROM src tablesample (1 rows);

Added: hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_1.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_1.q.out?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_1.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_1.q.out Sat Jan 24 00:16:54 2015
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ''2.0'': greatest only takes primitive types, got array<string>

Added: hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out Sat Jan 24 00:16:54 2015
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10016]: Line 1:19 Argument type mismatch '2.2': The expressions after greatest should all have the same type: "int" is expected but "double" is found

Added: hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out Sat Jan 24 00:16:54 2015
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10016]: Line 1:19 Argument type mismatch ''2'': The expressions after greatest should all have the same type: "int" is expected but "string" is found

Added: hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out Sat Jan 24 00:16:54 2015
@@ -0,0 +1 @@
+FAILED: SemanticException [Error 10015]: Line 1:7 Arguments length mismatch '1': greatest requires at least 2 arguments, got 1

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=1654440&r1=1654439&r2=1654440&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 Sat Jan 24 00:16:54 2015
@@ -79,6 +79,7 @@ format_number
 from_unixtime
 from_utc_timestamp
 get_json_object
+greatest
 hash
 hex
 histogram_numeric
@@ -99,6 +100,7 @@ last_day
 last_value
 lcase
 lead
+least
 length
 like
 ln

Added: hive/trunk/ql/src/test/results/clientpositive/udf_greatest.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/udf_greatest.q.out?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_greatest.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_greatest.q.out Sat Jan 24 00:16:54 2015
@@ -0,0 +1,152 @@
+PREHOOK: query: DESCRIBE FUNCTION greatest
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION greatest
+POSTHOOK: type: DESCFUNCTION
+greatest(v1, v2, ...) - Returns the greatest value in a list of values
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED greatest
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED greatest
+POSTHOOK: type: DESCFUNCTION
+greatest(v1, v2, ...) - Returns the greatest value in a list of values
+Example:
+  > SELECT greatest(2, 3, 1) FROM src LIMIT 1;
+  3
+PREHOOK: query: EXPLAIN
+SELECT GREATEST('a', 'b', 'c'),
+       GREATEST('C', 'a', 'B'),
+       GREATEST('AAA', 'AaA', 'AAa'),
+       GREATEST('A', 'AA', 'AAA'),
+       GREATEST('11', '13', '12'),
+       GREATEST('11', '2', '12'),
+       GREATEST('01', '03', '02'),
+       GREATEST('01', '1', '02'),
+       GREATEST(null, 'b', 'c' ),
+       GREATEST('a', null, 'c'),
+       GREATEST('a', 'b', null ),
+       GREATEST('a', null, null),
+       GREATEST(null, 'b', null),
+       GREATEST(cast(null as string), null, null)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+POSTHOOK: query: EXPLAIN
+SELECT GREATEST('a', 'b', 'c'),
+       GREATEST('C', 'a', 'B'),
+       GREATEST('AAA', 'AaA', 'AAa'),
+       GREATEST('A', 'AA', 'AAA'),
+       GREATEST('11', '13', '12'),
+       GREATEST('11', '2', '12'),
+       GREATEST('01', '03', '02'),
+       GREATEST('01', '1', '02'),
+       GREATEST(null, 'b', 'c' ),
+       GREATEST('a', null, 'c'),
+       GREATEST('a', 'b', null ),
+       GREATEST('a', null, null),
+       GREATEST(null, 'b', null),
+       GREATEST(cast(null as string), null, null)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        TableScan
+          alias: src
+          Row Limit Per Split: 1
+          Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: COMPLETE
+          Select Operator
+            expressions: 'c' (type: string), 'a' (type: string), 'AaA' (type: string), 'AAA' (type: string), '13' (type: string), '2' (type: string), '03' (type: string), '1' (type: string), greatest(null,'b','c') (type: string), greatest('a',null,'c') (type: string), greatest('a','b',null) (type: string), greatest('a',null,null) (type: string), greatest(null,'b',null) (type: string), greatest(UDFToString(null),null,null) (type: string)
+            outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13
+            Statistics: Num rows: 500 Data size: 597500 Basic stats: COMPLETE Column stats: COMPLETE
+            ListSink
+
+PREHOOK: query: SELECT GREATEST('a', 'b', 'c'),
+       GREATEST('C', 'a', 'B'),
+       GREATEST('AAA', 'AaA', 'AAa'),
+       GREATEST('A', 'AA', 'AAA'),
+       GREATEST('11', '13', '12'),
+       GREATEST('11', '2', '12'),
+       GREATEST('01', '03', '02'),
+       GREATEST('01', '1', '02'),
+       GREATEST(null, 'b', 'c' ),
+       GREATEST('a', null, 'c'),
+       GREATEST('a', 'b', null ),
+       GREATEST('a', null, null),
+       GREATEST(null, 'b', null),
+       GREATEST(cast(null as string), null, null)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT GREATEST('a', 'b', 'c'),
+       GREATEST('C', 'a', 'B'),
+       GREATEST('AAA', 'AaA', 'AAa'),
+       GREATEST('A', 'AA', 'AAA'),
+       GREATEST('11', '13', '12'),
+       GREATEST('11', '2', '12'),
+       GREATEST('01', '03', '02'),
+       GREATEST('01', '1', '02'),
+       GREATEST(null, 'b', 'c' ),
+       GREATEST('a', null, 'c'),
+       GREATEST('a', 'b', null ),
+       GREATEST('a', null, null),
+       GREATEST(null, 'b', null),
+       GREATEST(cast(null as string), null, null)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+c	a	AaA	AAA	13	2	03	1	c	c	b	a	b	NULL
+PREHOOK: query: SELECT GREATEST(11, 13, 12),
+       GREATEST(1, 13, 2),
+       GREATEST(-11, -13, -12),
+       GREATEST(1, -13, 2),
+       GREATEST(null, 1, 2),
+       GREATEST(1, null, 2),
+       GREATEST(1, 2, null),
+       GREATEST(cast(null as int), null, null)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT GREATEST(11, 13, 12),
+       GREATEST(1, 13, 2),
+       GREATEST(-11, -13, -12),
+       GREATEST(1, -13, 2),
+       GREATEST(null, 1, 2),
+       GREATEST(1, null, 2),
+       GREATEST(1, 2, null),
+       GREATEST(cast(null as int), null, null)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+13	13	-11	2	2	2	2	NULL
+PREHOOK: query: SELECT GREATEST(11.4, 13.5, 12.2),
+       GREATEST(1.0, 13.2, 2.0),
+       GREATEST(-11.4, -13.1, -12.2),
+       GREATEST(1.0, -13.3, 2.2),
+       GREATEST(null, 1.1, 2.2),
+       GREATEST(1.1, null, 2.2),
+       GREATEST(1.1, 2.2, null),
+       GREATEST(cast(null as double), null, null)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT GREATEST(11.4, 13.5, 12.2),
+       GREATEST(1.0, 13.2, 2.0),
+       GREATEST(-11.4, -13.1, -12.2),
+       GREATEST(1.0, -13.3, 2.2),
+       GREATEST(null, 1.1, 2.2),
+       GREATEST(1.1, null, 2.2),
+       GREATEST(1.1, 2.2, null),
+       GREATEST(cast(null as double), null, null)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+13.5	13.2	-11.4	2.2	2.2	2.2	2.2	NULL

Added: hive/trunk/ql/src/test/results/clientpositive/udf_least.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/udf_least.q.out?rev=1654440&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/udf_least.q.out (added)
+++ hive/trunk/ql/src/test/results/clientpositive/udf_least.q.out Sat Jan 24 00:16:54 2015
@@ -0,0 +1,152 @@
+PREHOOK: query: DESCRIBE FUNCTION least
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION least
+POSTHOOK: type: DESCFUNCTION
+least(v1, v2, ...) - Returns the least value in a list of values
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED least
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED least
+POSTHOOK: type: DESCFUNCTION
+least(v1, v2, ...) - Returns the least value in a list of values
+Example:
+  > SELECT least(2, 3, 1) FROM src LIMIT 1;
+  1
+PREHOOK: query: EXPLAIN
+SELECT LEAST('a', 'b', 'c'),
+       LEAST('C', 'a', 'B'),
+       LEAST('AAA', 'AaA', 'AAa'),
+       LEAST('A', 'AA', 'AAA'),
+       LEAST('11', '13', '12'),
+       LEAST('11', '2', '12'),
+       LEAST('01', '03', '02'),
+       LEAST('01', '1', '02'),
+       LEAST(null, 'b', 'c' ),
+       LEAST('a', null, 'c'),
+       LEAST('a', 'b', null ),
+       LEAST('a', null, null),
+       LEAST(null, 'b', null),
+       LEAST(cast(null as string), null, null)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+POSTHOOK: query: EXPLAIN
+SELECT LEAST('a', 'b', 'c'),
+       LEAST('C', 'a', 'B'),
+       LEAST('AAA', 'AaA', 'AAa'),
+       LEAST('A', 'AA', 'AAA'),
+       LEAST('11', '13', '12'),
+       LEAST('11', '2', '12'),
+       LEAST('01', '03', '02'),
+       LEAST('01', '1', '02'),
+       LEAST(null, 'b', 'c' ),
+       LEAST('a', null, 'c'),
+       LEAST('a', 'b', null ),
+       LEAST('a', null, null),
+       LEAST(null, 'b', null),
+       LEAST(cast(null as string), null, null)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        TableScan
+          alias: src
+          Row Limit Per Split: 1
+          Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: COMPLETE
+          Select Operator
+            expressions: 'a' (type: string), 'B' (type: string), 'AAA' (type: string), 'A' (type: string), '11' (type: string), '11' (type: string), '01' (type: string), '01' (type: string), least(null,'b','c') (type: string), least('a',null,'c') (type: string), least('a','b',null) (type: string), least('a',null,null) (type: string), least(null,'b',null) (type: string), least(UDFToString(null),null,null) (type: string)
+            outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13
+            Statistics: Num rows: 500 Data size: 597500 Basic stats: COMPLETE Column stats: COMPLETE
+            ListSink
+
+PREHOOK: query: SELECT LEAST('a', 'b', 'c'),
+       LEAST('C', 'a', 'B'),
+       LEAST('AAA', 'AaA', 'AAa'),
+       LEAST('A', 'AA', 'AAA'),
+       LEAST('11', '13', '12'),
+       LEAST('11', '2', '12'),
+       LEAST('01', '03', '02'),
+       LEAST('01', '1', '02'),
+       LEAST(null, 'b', 'c' ),
+       LEAST('a', null, 'c'),
+       LEAST('a', 'b', null ),
+       LEAST('a', null, null),
+       LEAST(null, 'b', null),
+       LEAST(cast(null as string), null, null)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT LEAST('a', 'b', 'c'),
+       LEAST('C', 'a', 'B'),
+       LEAST('AAA', 'AaA', 'AAa'),
+       LEAST('A', 'AA', 'AAA'),
+       LEAST('11', '13', '12'),
+       LEAST('11', '2', '12'),
+       LEAST('01', '03', '02'),
+       LEAST('01', '1', '02'),
+       LEAST(null, 'b', 'c' ),
+       LEAST('a', null, 'c'),
+       LEAST('a', 'b', null ),
+       LEAST('a', null, null),
+       LEAST(null, 'b', null),
+       LEAST(cast(null as string), null, null)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+a	B	AAA	A	11	11	01	01	b	a	a	a	b	NULL
+PREHOOK: query: SELECT LEAST(11, 13, 12),
+       LEAST(1, 13, 2),
+       LEAST(-11, -13, -12),
+       LEAST(1, -13, 2),
+       LEAST(null, 1, 2),
+       LEAST(1, null, 2),
+       LEAST(1, 2, null),
+       LEAST(cast(null as int), null, null)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT LEAST(11, 13, 12),
+       LEAST(1, 13, 2),
+       LEAST(-11, -13, -12),
+       LEAST(1, -13, 2),
+       LEAST(null, 1, 2),
+       LEAST(1, null, 2),
+       LEAST(1, 2, null),
+       LEAST(cast(null as int), null, null)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+11	1	-13	-13	1	1	1	NULL
+PREHOOK: query: SELECT LEAST(11.4, 13.5, 12.2),
+       LEAST(1.0, 13.2, 2.0),
+       LEAST(-11.4, -13.1, -12.2),
+       LEAST(1.0, -13.3, 2.2),
+       LEAST(null, 1.1, 2.2),
+       LEAST(1.1, null, 2.2),
+       LEAST(1.1, 2.2, null),
+       LEAST(cast(null as double), null, null)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT LEAST(11.4, 13.5, 12.2),
+       LEAST(1.0, 13.2, 2.0),
+       LEAST(-11.4, -13.1, -12.2),
+       LEAST(1.0, -13.3, 2.2),
+       LEAST(null, 1.1, 2.2),
+       LEAST(1.1, null, 2.2),
+       LEAST(1.1, 2.2, null),
+       LEAST(cast(null as double), null, null)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+11.4	1.0	-13.1	-13.3	1.1	1.1	1.1	NULL