You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by na...@apache.org on 2011/07/01 03:53:07 UTC

svn commit: r1141777 - /hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java

Author: namit
Date: Fri Jul  1 01:53:07 2011
New Revision: 1141777

URL: http://svn.apache.org/viewvc?rev=1141777&view=rev
Log:
HIVE-2248 Comparison Operators convert number types to common type instead of
          double if necessary (Siying Dong via namit)


Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java?rev=1141777&r1=1141776&r2=1141777&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFBaseCompare.java Fri Jul  1 01:53:07 2011
@@ -19,6 +19,7 @@
 package org.apache.hadoop.hive.ql.udf.generic;
 
 import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFUtils.ReturnObjectInspectorResolver;
@@ -132,8 +133,22 @@ public abstract class GenericUDFBaseComp
 
       if (oiTypeInfo0 != oiTypeInfo1) {
         compareType = CompareType.NEED_CONVERT;
-        compareOI = TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(
-            TypeInfoFactory.doubleTypeInfo);
+
+        // If either argument is a string, we convert to a double because a number
+        // in string form should always be convertible into a double
+        if (oiTypeInfo0.equals(TypeInfoFactory.stringTypeInfo)
+            || oiTypeInfo1.equals(TypeInfoFactory.stringTypeInfo)) {
+          compareOI = TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(
+              TypeInfoFactory.doubleTypeInfo);
+        } else {
+          TypeInfo compareType = FunctionRegistry.getCommonClass(oiTypeInfo0, oiTypeInfo1);
+
+          // For now, we always convert to double if we can't find a common type
+          compareOI = TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(
+              (compareType == null) ?
+              TypeInfoFactory.doubleTypeInfo : compareType);
+        }
+
         converter0 = ObjectInspectorConverters.getConverter(arguments[0], compareOI);
         converter1 = ObjectInspectorConverters.getConverter(arguments[1], compareOI);
       } else {