You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2014/09/13 01:08:43 UTC

svn commit: r1624675 - /hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java

Author: hashutosh
Date: Fri Sep 12 23:08:43 2014
New Revision: 1624675

URL: http://svn.apache.org/r1624675
Log:
HIVE-8084 : [CBO] Handle casting for parameterized type (Ashutosh Chauhan via John Pullokkaran)

Modified:
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java?rev=1624675&r1=1624674&r2=1624675&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/SqlFunctionConverter.java Fri Sep 12 23:08:43 2014
@@ -24,16 +24,21 @@ import java.util.Map;
 import org.apache.hadoop.hive.ql.exec.Description;
 import org.apache.hadoop.hive.ql.exec.FunctionInfo;
 import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
 import org.apache.hadoop.hive.ql.optimizer.optiq.OptiqSemanticException;
 import org.apache.hadoop.hive.ql.parse.ASTNode;
 import org.apache.hadoop.hive.ql.parse.HiveParser;
 import org.apache.hadoop.hive.ql.parse.ParseDriver;
+import org.apache.hadoop.hive.ql.udf.SettableUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPNegative;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPPositive;
+import org.apache.hadoop.hive.serde2.typeinfo.CharTypeInfo;
+import org.apache.hadoop.hive.serde2.typeinfo.DecimalTypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
+import org.apache.hadoop.hive.serde2.typeinfo.VarcharTypeInfo;
 import org.eigenbase.reltype.RelDataType;
 import org.eigenbase.reltype.RelDataTypeFactory;
 import org.eigenbase.sql.SqlAggFunction;
@@ -96,10 +101,12 @@ public class SqlFunctionConverter {
 
       if (castType.equals(TypeInfoFactory.byteTypeInfo)) {
         castUDF = FunctionRegistry.getFunctionInfo("tinyint");
-      } else if (castType.equals(TypeInfoFactory.charTypeInfo)) {
-        castUDF = FunctionRegistry.getFunctionInfo("char");
-      } else if (castType.equals(TypeInfoFactory.varcharTypeInfo)) {
-        castUDF = FunctionRegistry.getFunctionInfo("varchar");
+      } else if (castType instanceof CharTypeInfo) {
+        castUDF = handleCastForParameterizedType(castType,
+          FunctionRegistry.getFunctionInfo("char"));
+      } else if (castType instanceof VarcharTypeInfo) {
+        castUDF = handleCastForParameterizedType(castType,
+          FunctionRegistry.getFunctionInfo("varchar"));
       } else if (castType.equals(TypeInfoFactory.stringTypeInfo)) {
         castUDF = FunctionRegistry.getFunctionInfo("string");
       } else if (castType.equals(TypeInfoFactory.booleanTypeInfo)) {
@@ -118,16 +125,28 @@ public class SqlFunctionConverter {
         castUDF = FunctionRegistry.getFunctionInfo("timestamp");
       } else if (castType.equals(TypeInfoFactory.dateTypeInfo)) {
         castUDF = FunctionRegistry.getFunctionInfo("datetime");
-      } else if (castType.equals(TypeInfoFactory.decimalTypeInfo)) {
-        castUDF = FunctionRegistry.getFunctionInfo("decimal");
+      } else if (castType instanceof DecimalTypeInfo) {
+        castUDF = handleCastForParameterizedType(castType,
+          FunctionRegistry.getFunctionInfo("decimal"));
       } else if (castType.equals(TypeInfoFactory.binaryTypeInfo)) {
         castUDF = FunctionRegistry.getFunctionInfo("binary");
-      }
+      } else throw new IllegalStateException("Unexpected type : " +
+        castType.getQualifiedName());
     }
 
     return castUDF;
   }
 
+  private static FunctionInfo handleCastForParameterizedType(TypeInfo ti, FunctionInfo fi) {
+    SettableUDF udf = (SettableUDF)fi.getGenericUDF();
+    try {
+      udf.setTypeInfo(ti);
+    } catch (UDFArgumentException e) {
+      throw new RuntimeException(e);
+    }
+    return new FunctionInfo(fi.isNative(),fi.getDisplayName(),(GenericUDF)udf);
+  }
+
   // TODO: 1) handle Agg Func Name translation 2) is it correct to add func args
   // as child of func?
   public static ASTNode buildAST(SqlOperator op, List<ASTNode> children) {