You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by sz...@apache.org on 2015/10/15 20:21:24 UTC

hive git commit: HIVE-12082 : Null comparison for greatest and least operator (Szehon, reviewed by Xuefu)

Repository: hive
Updated Branches:
  refs/heads/master 370a807d5 -> 6462daf0b


HIVE-12082 : Null comparison for greatest and least operator (Szehon, reviewed by Xuefu)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/6462daf0
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/6462daf0
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/6462daf0

Branch: refs/heads/master
Commit: 6462daf0b3eb124e28d64dbda45c641edc48129c
Parents: 370a807
Author: Szehon Ho <sz...@cloudera.com>
Authored: Thu Oct 15 11:19:37 2015 -0700
Committer: Szehon Ho <sz...@cloudera.com>
Committed: Thu Oct 15 11:21:01 2015 -0700

----------------------------------------------------------------------
 .../udf/generic/GenericUDFBaseNwayCompare.java  | 115 ++++++++++++++
 .../hive/ql/udf/generic/GenericUDFGreatest.java |  75 +--------
 .../hive/ql/udf/generic/GenericUDFLeast.java    |   9 +-
 .../ql/udf/generic/TestGenericUDFGreatest.java  | 153 ++++++++++++-------
 .../ql/udf/generic/TestGenericUDFLeast.java     | 149 +++++++++++-------
 .../clientnegative/udf_greatest_error_2.q       |   2 +-
 .../clientnegative/udf_greatest_error_3.q       |   1 -
 .../clientnegative/udf_greatest_error_4.q       |   1 -
 .../test/queries/clientpositive/udf_greatest.q  |  20 +++
 ql/src/test/queries/clientpositive/udf_least.q  |  20 +++
 .../clientnegative/udf_greatest_error_2.q.out   |   2 +-
 .../clientnegative/udf_greatest_error_3.q.out   |   1 -
 .../clientnegative/udf_greatest_error_4.q.out   |   1 -
 .../results/clientpositive/udf_greatest.q.out   |  70 ++++++++-
 .../test/results/clientpositive/udf_least.q.out |  70 ++++++++-
 15 files changed, 490 insertions(+), 199 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseNwayCompare.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseNwayCompare.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseNwayCompare.java
new file mode 100644
index 0000000..5d542aa
--- /dev/null
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseNwayCompare.java
@@ -0,0 +1,115 @@
+/**
+ * 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.FunctionRegistry;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
+
+
+/**
+ * Base class for comparison UDF's (Greatest and Least).
+ */
+public abstract class GenericUDFBaseNwayCompare extends GenericUDF {
+
+  protected transient ObjectInspector[] argumentOIs;
+  protected transient Converter[] converters;
+  protected transient ObjectInspector resultOI;
+
+  /**
+   * @return desired comparison (positive for greatest, negative for least)
+   */
+  abstract int getOrder();
+
+  @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() != ObjectInspector.Category.PRIMITIVE) {
+      throw new UDFArgumentException(getFuncName() + " only takes primitive types, got "
+        + arguments[0].getTypeName());
+    }
+
+    argumentOIs = arguments;
+    converters = new Converter[arguments.length];
+
+    TypeInfo commonInfo = TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[0]);
+
+    for (int i = 1; i < arguments.length; i++) {
+      PrimitiveTypeInfo currInfo = (PrimitiveTypeInfo) TypeInfoUtils.getTypeInfoFromObjectInspector(arguments[i]);
+
+      commonInfo = FunctionRegistry.getCommonClassForComparison(
+        commonInfo, currInfo);
+    }
+
+    resultOI = TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(
+      (commonInfo == null) ?
+        TypeInfoFactory.doubleTypeInfo : commonInfo);
+
+    for (int i = 0; i < arguments.length; i++) {
+      converters[i] = ObjectInspectorConverters.getConverter(arguments[i], resultOI);
+    }
+
+    return resultOI;
+  }
+
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Override
+  public Object evaluate(GenericUDF.DeferredObject[] arguments) throws HiveException {
+    Object maxV = null;
+    //for case of conversion, convert both values to common type and then compare.
+    for (int i = 0; i < arguments.length; i++) {
+      Object ai = arguments[i].get();
+      if (ai == null) { //NULL if any of the args are nulls
+        return null;
+      }
+
+      if (maxV == null) { //First non-null item.
+        maxV = converters[i].convert(ai);
+        continue;
+      }
+      Object converted = converters[i].convert(ai);
+      if (converted == null) {
+        return null;
+      }
+      int result = ObjectInspectorUtils.compare(
+        converted, resultOI,
+        maxV, resultOI);
+      if (getOrder() * result > 0) {
+        maxV = converted;
+      }
+    }
+    return maxV;
+  }
+
+  @Override
+  public String getDisplayString(String[] children) {
+    return getStandardDisplayString(getFuncName(), children, ",");
+  }
+}

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java
index e1eab89..a79be1b 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFGreatest.java
@@ -19,90 +19,23 @@
 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) {
-    return getStandardDisplayString(getFuncName(), children, ",");
-  }
+public class GenericUDFGreatest extends GenericUDFBaseNwayCompare {
 
   @Override
   protected String getFuncName() {
     return "greatest";
   }
 
-  protected boolean isGreatest() {
-    return true;
+  @Override
+  protected int getOrder() {
+    return 1;
   }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java
index 64a1b47..77f19e4 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFLeast.java
@@ -22,15 +22,12 @@ 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 {
+public class GenericUDFLeast extends GenericUDFBaseNwayCompare {
 
   @Override
   protected String getFuncName() {
@@ -38,7 +35,7 @@ public class GenericUDFLeast extends GenericUDFGreatest {
   }
 
   @Override
-  protected boolean isGreatest() {
-    return false;
+  protected int getOrder() {
+    return -1;
   }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java
index 55d7d5d..15a58b2 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFGreatest.java
@@ -17,21 +17,23 @@
  */
 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.ByteWritable;
 import org.apache.hadoop.hive.serde2.io.DateWritable;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.ShortWritable;
 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.LongWritable;
 import org.apache.hadoop.io.Text;
 
+import java.sql.Date;
+
 public class TestGenericUDFGreatest extends TestCase {
 
   public void testOneArg() throws HiveException {
@@ -49,22 +51,28 @@ public class TestGenericUDFGreatest extends TestCase {
     assertNotNull("greatest() test ", ex);
   }
 
-  public void testDifferentType() throws HiveException {
-    @SuppressWarnings("resource")
+  public void testVoids() throws HiveException {
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableVoidObjectInspector;
+    ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+    ObjectInspector valueOI3 = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    ObjectInspector[] arguments = { valueOI1, valueOI2, valueOI3 };
+    udf.initialize(arguments);
+    runAndVerify(new Object[] { null, 1, "test"}, null, udf);
+  }
+
+  public void testGreatestMixed() throws HiveException {
     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);
+    ObjectInspector valueOI3 = PrimitiveObjectInspectorFactory.writableDateObjectInspector;
+    ObjectInspector valueOI4 = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    ObjectInspector[] arguments = { valueOI1, valueOI2, valueOI3, valueOI4 };
+    udf.initialize(arguments);
+    runAndVerify(new Object[] { 1, 11.1, Date.valueOf("2015-03-20"), "test"}, "test", udf);  //string comparisons
   }
 
+
   public void testGreatestStr() throws HiveException {
     GenericUDFGreatest udf = new GenericUDFGreatest();
     ObjectInspector[] arguments = new ObjectInspector[3];
@@ -84,12 +92,12 @@ public class TestGenericUDFGreatest extends TestCase {
     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[] { null, "b", "c" }, null, udf);
+    runAndVerify(new String[] { "a", null, "c" }, null, udf);
+    runAndVerify(new String[] { "a", "b", null }, null, udf);
 
-    runAndVerify(new String[] { "a", null, null }, "a", udf);
-    runAndVerify(new String[] { null, "b", null }, "b", udf);
+    runAndVerify(new String[] { "a", null, null }, null, udf);
+    runAndVerify(new String[] { null, "b", null }, null, udf);
     runAndVerify(new String[] { null, null, null }, null, udf);
   }
 
@@ -108,9 +116,9 @@ public class TestGenericUDFGreatest extends TestCase {
     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, 1, 2 }, null, udf);
+    runAndVerify(new Integer[] { 1, null, 2 }, null, udf);
+    runAndVerify(new Integer[] { 1, 2, null }, null, udf);
 
     runAndVerify(new Integer[] { null, null, null }, null, udf);
   }
@@ -130,9 +138,9 @@ public class TestGenericUDFGreatest extends TestCase {
     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, 1.1, 2.2 }, null, udf);
+    runAndVerify(new Double[] { 1.1, null, 2.2 }, null, udf);
+    runAndVerify(new Double[] { 1.1, 2.2, null }, null, udf);
 
     runAndVerify(new Double[] { null, null, null }, null, udf);
   }
@@ -152,49 +160,86 @@ public class TestGenericUDFGreatest extends TestCase {
 
     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, d2, d3 }, null, udf);
+    runAndVerify(new Date[] { d1, null, d3 }, null, udf);
+    runAndVerify(new Date[] { d1, d2, null }, null, 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);
+  public void testGreatestIntTypes() throws HiveException {
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector[] arguments = new ObjectInspector[4];
+
+    arguments[0] = PrimitiveObjectInspectorFactory.writableByteObjectInspector;
+    arguments[1] = PrimitiveObjectInspectorFactory.writableShortObjectInspector;
+    arguments[2] = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+    arguments[3] = PrimitiveObjectInspectorFactory.writableLongObjectInspector;
+
+
+    udf.initialize(arguments);
+
+    runAndVerify(new Object[] { (byte) 11, (short) 13, 12, 14L }, 14L, udf);
+    runAndVerify(new Object[] { (byte) 1, (short) 13, 2, 0L }, 13L, udf);
+
+    runAndVerify(new Object[] { (byte) -11, (short) -13, -12, 0L }, 0L, udf);
+    runAndVerify(new Object[] { (byte) 1, (short) -13, 2, 0L}, 2L, udf);
+
+    runAndVerify(new Object[] { null, (short) 1, 2, 0L }, null, udf);
+    runAndVerify(new Object[] { (byte) 1, null, 2, -1L }, null, udf);
+    runAndVerify(new Object[] { (byte) 1, (short) 2, null, -1L }, null, udf);
+
+    runAndVerify(new Integer[] { null, null, null, null }, null, udf);
   }
 
-  private void runAndVerify(Integer[] v, Integer expResult, GenericUDF udf) throws HiveException {
+  private void runAndVerify(Object[] v, Object 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);
+      args[i] = new DeferredJavaObject(getWritable(v[i]));
     }
-    IntWritable output = (IntWritable) udf.evaluate(args);
-    Integer res = output != null ? Integer.valueOf(output.get()) : null;
-    assertEquals("greatest() test ", expResult, res);
+    Object output = udf.evaluate(args);
+    output = parseOutput(output);
+    assertEquals("greatest() test ", expResult, output != null ? output : null);
   }
 
-  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);
+  private Object getWritable(Object o) {
+    if (o instanceof String) {
+      return o != null ? new Text((String) o) : null;
+    } else if (o instanceof Integer) {
+      return o != null ? new IntWritable((Integer) o) : null;
+    } else if (o instanceof Double) {
+      return o != null ? new DoubleWritable((Double) o) : null;
+    } else if (o instanceof Date) {
+      return o != null ? new DateWritable((Date) o) : null;
+    } else if (o instanceof Byte) {
+      return o != null ? new ByteWritable((Byte) o): null;
+    } else if (o instanceof Short) {
+      return o != null ? new ShortWritable((Short) o) : null;
+    } else if (o instanceof Long) {
+      return o != null ? new LongWritable((Long) o) : null;
     }
-    DoubleWritable output = (DoubleWritable) udf.evaluate(args);
-    Double res = output != null ? Double.valueOf(output.get()) : null;
-    assertEquals("greatest() test ", expResult, res);
+    return null;
   }
 
-  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);
+  private Object parseOutput(Object o) {
+    if (o == null) {
+      return null;
+    }
+    if (o instanceof Text) {
+      return o.toString();
+    } else if (o instanceof IntWritable) {
+      return ((IntWritable) o).get();
+    } else if (o instanceof DoubleWritable) {
+      return ((DoubleWritable) o).get();
+    } else if (o instanceof DateWritable) {
+      return ((DateWritable) o).get();
+    } else if (o instanceof ByteWritable) {
+      return ((ByteWritable) o).get();
+    } else if (o instanceof ShortWritable) {
+      return ((ShortWritable) o).get();
+    } else if (o instanceof LongWritable) {
+      return ((LongWritable) o).get();
     }
-    DateWritable output = (DateWritable) udf.evaluate(args);
-    Date res = output != null ? output.get() : null;
-    assertEquals("greatest() test ", expResult, res);
+    return null;
   }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java
index 47e4801..847754a 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/udf/generic/TestGenericUDFLeast.java
@@ -25,11 +25,14 @@ 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.ByteWritable;
 import org.apache.hadoop.hive.serde2.io.DateWritable;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.io.ShortWritable;
 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.LongWritable;
 import org.apache.hadoop.io.Text;
 
 public class TestGenericUDFLeast extends TestCase {
@@ -49,20 +52,25 @@ public class TestGenericUDFLeast extends TestCase {
     assertNotNull("least() test ", ex);
   }
 
-  public void testDifferentType() throws HiveException {
-    @SuppressWarnings("resource")
-    GenericUDFLeast udf = new GenericUDFLeast();
+  public void testVoids() throws HiveException {
+    GenericUDFGreatest udf = new GenericUDFGreatest();
+    ObjectInspector valueOI1 = PrimitiveObjectInspectorFactory.writableVoidObjectInspector;
+    ObjectInspector valueOI2 = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+    ObjectInspector valueOI3 = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    ObjectInspector[] arguments = { valueOI1, valueOI2, valueOI3 };
+    udf.initialize(arguments);
+    runAndVerify(new Object[] { null, 1, "test"}, null, udf);
+  }
+
+  public void testLeastTypes() throws HiveException {
+    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("least() test ", ex);
+    ObjectInspector valueOI3 = PrimitiveObjectInspectorFactory.writableDateObjectInspector;
+    ObjectInspector valueOI4 = PrimitiveObjectInspectorFactory.writableStringObjectInspector;
+    ObjectInspector[] arguments = { valueOI1, valueOI2, valueOI3, valueOI4 };
+    udf.initialize(arguments);
+    runAndVerify(new Object[] { 1, 11.1, Date.valueOf("2015-03-20"), "test"}, "test", udf);  //string comparisons
   }
 
   public void testLeastStr() throws HiveException {
@@ -84,12 +92,12 @@ public class TestGenericUDFLeast extends TestCase {
     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[] { null, "b", "c" }, null, udf);
+    runAndVerify(new String[] { "a", null, "c" }, null, udf);
+    runAndVerify(new String[] { "a", "b", null }, null, udf);
 
-    runAndVerify(new String[] { "a", null, null }, "a", udf);
-    runAndVerify(new String[] { null, "b", null }, "b", udf);
+    runAndVerify(new String[] { "a", null, null }, null, udf);
+    runAndVerify(new String[] { null, "b", null }, null, udf);
     runAndVerify(new String[] { null, null, null }, null, udf);
   }
 
@@ -108,9 +116,9 @@ public class TestGenericUDFLeast extends TestCase {
     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, 1, 2 }, null, udf);
+    runAndVerify(new Integer[] { 1, null, 2 }, null, udf);
+    runAndVerify(new Integer[] { 1, 2, null }, null, udf);
 
     runAndVerify(new Integer[] { null, null, null }, null, udf);
   }
@@ -130,9 +138,9 @@ public class TestGenericUDFLeast extends TestCase {
     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, 1.1, 2.2 }, null, udf);
+    runAndVerify(new Double[] { 1.1, null, 2.2 }, null, udf);
+    runAndVerify(new Double[] { 1.1, 2.2, null }, null, udf);
 
     runAndVerify(new Double[] { null, null, null }, null, udf);
   }
@@ -152,49 +160,86 @@ public class TestGenericUDFLeast extends TestCase {
 
     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, d2, d3 }, null, udf);
+    runAndVerify(new Date[] { d1, null, d3 }, null, udf);
+    runAndVerify(new Date[] { d1, d2, null }, null, 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);
+  public void testLeastIntTypes() throws HiveException {
+    GenericUDFLeast udf = new GenericUDFLeast();
+    ObjectInspector[] arguments = new ObjectInspector[4];
+
+    arguments[0] = PrimitiveObjectInspectorFactory.writableByteObjectInspector;
+    arguments[1] = PrimitiveObjectInspectorFactory.writableShortObjectInspector;
+    arguments[2] = PrimitiveObjectInspectorFactory.writableIntObjectInspector;
+    arguments[3] = PrimitiveObjectInspectorFactory.writableLongObjectInspector;
+
+
+    udf.initialize(arguments);
+
+    runAndVerify(new Object[] { (byte) 11, (short) 13, 12, 14L }, 11L, udf);
+    runAndVerify(new Object[] { (byte) 1, (short) 13, 2, 0L }, 0L, udf);
+
+    runAndVerify(new Object[] { (byte) -11, (short) -13, -12, 0L }, -13L, udf);
+    runAndVerify(new Object[] { (byte) 1, (short) -13, 2, 0L}, -13L, udf);
+
+    runAndVerify(new Object[] { null, (short) 1, 2, 0L }, null, udf);
+    runAndVerify(new Object[] { (byte) 1, null, 2, -1L }, null, udf);
+    runAndVerify(new Object[] { (byte) 1, (short) 2, null, -1L }, null, udf);
+
+    runAndVerify(new Integer[] { null, null, null, null }, null, udf);
   }
 
-  private void runAndVerify(Integer[] v, Integer expResult, GenericUDF udf) throws HiveException {
+  private void runAndVerify(Object[] v, Object 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);
+      args[i] = new DeferredJavaObject(getWritable(v[i]));
     }
-    IntWritable output = (IntWritable) udf.evaluate(args);
-    Integer res = output != null ? Integer.valueOf(output.get()) : null;
-    assertEquals("least() test ", expResult, res);
+    Object output = udf.evaluate(args);
+    output = parseOutput(output);
+    assertEquals("greatest() test ", expResult, output != null ? output : null);
   }
 
-  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);
+  private Object getWritable(Object o) {
+    if (o instanceof String) {
+      return o != null ? new Text((String) o) : null;
+    } else if (o instanceof Integer) {
+      return o != null ? new IntWritable((Integer) o) : null;
+    } else if (o instanceof Double) {
+      return o != null ? new DoubleWritable((Double) o) : null;
+    } else if (o instanceof Date) {
+      return o != null ? new DateWritable((Date) o) : null;
+    } else if (o instanceof Byte) {
+      return o != null ? new ByteWritable((Byte) o): null;
+    } else if (o instanceof Short) {
+      return o != null ? new ShortWritable((Short) o) : null;
+    } else if (o instanceof Long) {
+      return o != null ? new LongWritable((Long) o) : null;
     }
-    DoubleWritable output = (DoubleWritable) udf.evaluate(args);
-    Double res = output != null ? Double.valueOf(output.get()) : null;
-    assertEquals("least() test ", expResult, res);
+    return null;
   }
 
-  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);
+  private Object parseOutput(Object o) {
+    if (o == null) {
+      return null;
+    }
+    if (o instanceof Text) {
+      return o.toString();
+    } else if (o instanceof IntWritable) {
+      return ((IntWritable) o).get();
+    } else if (o instanceof DoubleWritable) {
+      return ((DoubleWritable) o).get();
+    } else if (o instanceof DateWritable) {
+      return ((DateWritable) o).get();
+    } else if (o instanceof ByteWritable) {
+      return ((ByteWritable) o).get();
+    } else if (o instanceof ShortWritable) {
+      return ((ShortWritable) o).get();
+    } else if (o instanceof LongWritable) {
+      return ((LongWritable) o).get();
     }
-    DateWritable output = (DateWritable) udf.evaluate(args);
-    Date res = output != null ? output.get() : null;
-    assertEquals("least() test ", expResult, res);
+    return null;
   }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/queries/clientnegative/udf_greatest_error_2.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/udf_greatest_error_2.q b/ql/src/test/queries/clientnegative/udf_greatest_error_2.q
index b270a1a..ae6d928 100644
--- a/ql/src/test/queries/clientnegative/udf_greatest_error_2.q
+++ b/ql/src/test/queries/clientnegative/udf_greatest_error_2.q
@@ -1 +1 @@
-SELECT GREATEST(1, 2.2) FROM src LIMIT 1;
+SELECT GREATEST(1) FROM src LIMIT 1;

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/queries/clientnegative/udf_greatest_error_3.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/udf_greatest_error_3.q b/ql/src/test/queries/clientnegative/udf_greatest_error_3.q
deleted file mode 100644
index ba21748..0000000
--- a/ql/src/test/queries/clientnegative/udf_greatest_error_3.q
+++ /dev/null
@@ -1 +0,0 @@
-SELECT GREATEST(1, '2') FROM src LIMIT 1;

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/queries/clientnegative/udf_greatest_error_4.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientnegative/udf_greatest_error_4.q b/ql/src/test/queries/clientnegative/udf_greatest_error_4.q
deleted file mode 100644
index ae6d928..0000000
--- a/ql/src/test/queries/clientnegative/udf_greatest_error_4.q
+++ /dev/null
@@ -1 +0,0 @@
-SELECT GREATEST(1) FROM src LIMIT 1;

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/queries/clientpositive/udf_greatest.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/udf_greatest.q b/ql/src/test/queries/clientpositive/udf_greatest.q
index 02c7d3c..03c01b5 100644
--- a/ql/src/test/queries/clientpositive/udf_greatest.q
+++ b/ql/src/test/queries/clientpositive/udf_greatest.q
@@ -55,3 +55,23 @@ SELECT GREATEST(11.4, 13.5, 12.2),
        GREATEST(1.1, 2.2, null),
        GREATEST(cast(null as double), null, null)
 FROM src tablesample (1 rows);
+
+SELECT GREATEST(101Y, -101S, 100, -100L, null),
+       GREATEST(-101Y, 101S, 100, -100L, 0),
+       GREATEST(100Y, -100S, 101, -101L, null),
+       GREATEST(100Y, -100S, -101, 101L, 0)
+FROM src tablesample (1 rows);
+
+SELECT GREATEST(cast(1.1 as float), cast(-1.1 as double), cast(0.5 as decimal)),
+       GREATEST(cast(-1.1 as float), cast(1.1 as double), cast(0.5 as decimal)),
+       GREATEST(cast(0.1 as float), cast(-0.1 as double), cast(0.5 as decimal)),
+       GREATEST(null, cast(-0.1 as double), cast(0.5 as decimal))
+FROM src tablesample (1 rows);
+
+SELECT GREATEST(-100Y, -80S, -60, -40L, cast(-20 as float), cast(0 as double), cast(0.5 as decimal)),
+       GREATEST(100Y, 80S, 60, 40L, cast(20 as float), cast(0 as double), cast(-0.5 as decimal)),
+       GREATEST(100Y, 80S, 60, 40L, null, cast(0 as double), cast(-0.5 as decimal))
+FROM src tablesample (1 rows);
+
+SELECT GREATEST(10L, 'a', date('2001-01-28'))
+FROM src tablesample (1 rows);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/queries/clientpositive/udf_least.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/udf_least.q b/ql/src/test/queries/clientpositive/udf_least.q
index a754ef0..93d0ee8 100644
--- a/ql/src/test/queries/clientpositive/udf_least.q
+++ b/ql/src/test/queries/clientpositive/udf_least.q
@@ -55,3 +55,23 @@ SELECT LEAST(11.4, 13.5, 12.2),
        LEAST(1.1, 2.2, null),
        LEAST(cast(null as double), null, null)
 FROM src tablesample (1 rows);
+
+SELECT LEAST(101Y, -101S, 100, -100L, null),
+       LEAST(-101Y, 101S, 100, -100L, 0),
+       LEAST(100Y, -100S, 101, -101L, null),
+       LEAST(100Y, -100S, -101, 101L, 0)
+FROM src tablesample (1 rows);
+
+SELECT LEAST(cast(1.1 as float), cast(-1.1 as double), cast(0.5 as decimal)),
+       LEAST(cast(-1.1 as float), cast(1.1 as double), cast(0.5 as decimal)),
+       LEAST(cast(0.1 as float), cast(-0.1 as double), cast(0.5 as decimal)),
+       LEAST(null, cast(-0.1 as double), cast(0.5 as decimal))
+FROM src tablesample (1 rows);
+
+SELECT LEAST(-100Y, -80S, -60, -40L, cast(-20 as float), cast(0 as double), cast(0.5 as decimal)),
+       LEAST(100Y, 80S, 60, 40L, cast(20 as float), cast(0 as double), cast(-0.5 as decimal)),
+       LEAST(100Y, 80S, 60, 40L, null, cast(0 as double), cast(-0.5 as decimal))
+FROM src tablesample (1 rows);
+
+SELECT LEAST(10L, 'a', date('2001-01-28'))
+FROM src tablesample (1 rows);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out b/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out
index 9a6348c..58b4c44 100644
--- a/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out
+++ b/ql/src/test/results/clientnegative/udf_greatest_error_2.q.out
@@ -1 +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
+FAILED: SemanticException [Error 10015]: Line 1:7 Arguments length mismatch '1': greatest requires at least 2 arguments, got 1

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out b/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out
deleted file mode 100644
index 3fb3499..0000000
--- a/ql/src/test/results/clientnegative/udf_greatest_error_3.q.out
+++ /dev/null
@@ -1 +0,0 @@
-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

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out b/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out
deleted file mode 100644
index 58b4c44..0000000
--- a/ql/src/test/results/clientnegative/udf_greatest_error_4.q.out
+++ /dev/null
@@ -1 +0,0 @@
-FAILED: SemanticException [Error 10015]: Line 1:7 Arguments length mismatch '1': greatest requires at least 2 arguments, got 1

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/results/clientpositive/udf_greatest.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/udf_greatest.q.out b/ql/src/test/results/clientpositive/udf_greatest.q.out
index 10f1c2d..47cfb3f 100644
--- a/ql/src/test/results/clientpositive/udf_greatest.q.out
+++ b/ql/src/test/results/clientpositive/udf_greatest.q.out
@@ -58,9 +58,9 @@ STAGE PLANS:
           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), 'c' (type: string), 'c' (type: string), 'b' (type: string), 'a' (type: string), 'b' (type: string), null (type: string)
+            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), null (type: double), null (type: double), null (type: double), null (type: double), null (type: double), null (type: double)
             outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13
-            Statistics: Num rows: 500 Data size: 555500 Basic stats: COMPLETE Column stats: COMPLETE
+            Statistics: Num rows: 500 Data size: 343000 Basic stats: COMPLETE Column stats: COMPLETE
             ListSink
 
 PREHOOK: query: SELECT GREATEST('a', 'b', 'c'),
@@ -99,7 +99,7 @@ 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
+c	a	AaA	AAA	13	2	03	1	NULL	NULL	NULL	NULL	NULL	NULL
 PREHOOK: query: SELECT GREATEST(11, 13, 12),
        GREATEST(1, 13, 2),
        GREATEST(-11, -13, -12),
@@ -124,7 +124,7 @@ 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
+13	13	-11	2	NULL	NULL	NULL	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),
@@ -149,4 +149,64 @@ 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
+13.5	13.2	-11.4	2.2	NULL	NULL	NULL	NULL
+PREHOOK: query: SELECT GREATEST(101Y, -101S, 100, -100L, null),
+       GREATEST(-101Y, 101S, 100, -100L, 0),
+       GREATEST(100Y, -100S, 101, -101L, null),
+       GREATEST(100Y, -100S, -101, 101L, 0)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT GREATEST(101Y, -101S, 100, -100L, null),
+       GREATEST(-101Y, 101S, 100, -100L, 0),
+       GREATEST(100Y, -100S, 101, -101L, null),
+       GREATEST(100Y, -100S, -101, 101L, 0)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+NULL	101	NULL	101
+PREHOOK: query: SELECT GREATEST(cast(1.1 as float), cast(-1.1 as double), cast(0.5 as decimal)),
+       GREATEST(cast(-1.1 as float), cast(1.1 as double), cast(0.5 as decimal)),
+       GREATEST(cast(0.1 as float), cast(-0.1 as double), cast(0.5 as decimal)),
+       GREATEST(null, cast(-0.1 as double), cast(0.5 as decimal))
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT GREATEST(cast(1.1 as float), cast(-1.1 as double), cast(0.5 as decimal)),
+       GREATEST(cast(-1.1 as float), cast(1.1 as double), cast(0.5 as decimal)),
+       GREATEST(cast(0.1 as float), cast(-0.1 as double), cast(0.5 as decimal)),
+       GREATEST(null, cast(-0.1 as double), cast(0.5 as decimal))
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+1.1	1.1	1	NULL
+PREHOOK: query: SELECT GREATEST(-100Y, -80S, -60, -40L, cast(-20 as float), cast(0 as double), cast(0.5 as decimal)),
+       GREATEST(100Y, 80S, 60, 40L, cast(20 as float), cast(0 as double), cast(-0.5 as decimal)),
+       GREATEST(100Y, 80S, 60, 40L, null, cast(0 as double), cast(-0.5 as decimal))
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT GREATEST(-100Y, -80S, -60, -40L, cast(-20 as float), cast(0 as double), cast(0.5 as decimal)),
+       GREATEST(100Y, 80S, 60, 40L, cast(20 as float), cast(0 as double), cast(-0.5 as decimal)),
+       GREATEST(100Y, 80S, 60, 40L, null, cast(0 as double), cast(-0.5 as decimal))
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+1	100	NULL
+PREHOOK: query: SELECT GREATEST(10L, 'a', date('2001-01-28'))
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT GREATEST(10L, 'a', date('2001-01-28'))
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+a

http://git-wip-us.apache.org/repos/asf/hive/blob/6462daf0/ql/src/test/results/clientpositive/udf_least.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/udf_least.q.out b/ql/src/test/results/clientpositive/udf_least.q.out
index 6983137..2363abe 100644
--- a/ql/src/test/results/clientpositive/udf_least.q.out
+++ b/ql/src/test/results/clientpositive/udf_least.q.out
@@ -58,9 +58,9 @@ STAGE PLANS:
           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), 'b' (type: string), 'a' (type: string), 'a' (type: string), 'a' (type: string), 'b' (type: string), null (type: string)
+            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), null (type: double), null (type: double), null (type: double), null (type: double), null (type: double), null (type: double)
             outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5, _col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13
-            Statistics: Num rows: 500 Data size: 555500 Basic stats: COMPLETE Column stats: COMPLETE
+            Statistics: Num rows: 500 Data size: 343000 Basic stats: COMPLETE Column stats: COMPLETE
             ListSink
 
 PREHOOK: query: SELECT LEAST('a', 'b', 'c'),
@@ -99,7 +99,7 @@ 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
+a	B	AAA	A	11	11	01	01	NULL	NULL	NULL	NULL	NULL	NULL
 PREHOOK: query: SELECT LEAST(11, 13, 12),
        LEAST(1, 13, 2),
        LEAST(-11, -13, -12),
@@ -124,7 +124,7 @@ 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
+11	1	-13	-13	NULL	NULL	NULL	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),
@@ -149,4 +149,64 @@ 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
+11.4	1.0	-13.1	-13.3	NULL	NULL	NULL	NULL
+PREHOOK: query: SELECT LEAST(101Y, -101S, 100, -100L, null),
+       LEAST(-101Y, 101S, 100, -100L, 0),
+       LEAST(100Y, -100S, 101, -101L, null),
+       LEAST(100Y, -100S, -101, 101L, 0)
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT LEAST(101Y, -101S, 100, -100L, null),
+       LEAST(-101Y, 101S, 100, -100L, 0),
+       LEAST(100Y, -100S, 101, -101L, null),
+       LEAST(100Y, -100S, -101, 101L, 0)
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+NULL	-101	NULL	-101
+PREHOOK: query: SELECT LEAST(cast(1.1 as float), cast(-1.1 as double), cast(0.5 as decimal)),
+       LEAST(cast(-1.1 as float), cast(1.1 as double), cast(0.5 as decimal)),
+       LEAST(cast(0.1 as float), cast(-0.1 as double), cast(0.5 as decimal)),
+       LEAST(null, cast(-0.1 as double), cast(0.5 as decimal))
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT LEAST(cast(1.1 as float), cast(-1.1 as double), cast(0.5 as decimal)),
+       LEAST(cast(-1.1 as float), cast(1.1 as double), cast(0.5 as decimal)),
+       LEAST(cast(0.1 as float), cast(-0.1 as double), cast(0.5 as decimal)),
+       LEAST(null, cast(-0.1 as double), cast(0.5 as decimal))
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+-1.1	-1.1	-0.1	NULL
+PREHOOK: query: SELECT LEAST(-100Y, -80S, -60, -40L, cast(-20 as float), cast(0 as double), cast(0.5 as decimal)),
+       LEAST(100Y, 80S, 60, 40L, cast(20 as float), cast(0 as double), cast(-0.5 as decimal)),
+       LEAST(100Y, 80S, 60, 40L, null, cast(0 as double), cast(-0.5 as decimal))
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT LEAST(-100Y, -80S, -60, -40L, cast(-20 as float), cast(0 as double), cast(0.5 as decimal)),
+       LEAST(100Y, 80S, 60, 40L, cast(20 as float), cast(0 as double), cast(-0.5 as decimal)),
+       LEAST(100Y, 80S, 60, 40L, null, cast(0 as double), cast(-0.5 as decimal))
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+-100	-1	NULL
+PREHOOK: query: SELECT LEAST(10L, 'a', date('2001-01-28'))
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT LEAST(10L, 'a', date('2001-01-28'))
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+10