diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java index 410735c..bf4f5a1 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java @@ -76,8 +76,10 @@ import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPOr; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFWhen; import org.apache.hadoop.hive.serde.serdeConstants; +import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters; +import org.apache.hadoop.hive.serde2.objectinspector.StandardConstantStructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; @@ -763,6 +766,8 @@ private static ExprNodeDesc evaluateFunction(GenericUDF udf, List } } else if (PrimitiveObjectInspectorUtils.isPrimitiveJavaClass(clz)) { + } else if (oi instanceof ConstantObjectInspector) { + return new ExprNodeConstantDesc(TypeInfoUtils.getTypeInfoFromObjectInspector(oi), o); } else { if (LOG.isErrorEnabled()) { LOG.error("Unable to evaluate " + udf + ". Return value unrecoginizable."); diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStruct.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStruct.java index 7df3f7d..cc04721 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStruct.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDFStruct.java @@ -24,6 +24,7 @@ import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.metadata.HiveException; +import org.apache.hadoop.hive.serde2.objectinspector.ConstantObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; @@ -44,9 +45,22 @@ public ObjectInspector initialize(ObjectInspector[] arguments) for (int f = 1; f <= numFields; f++) { fname.add("col" + f); } - StructObjectInspector soi = - ObjectInspectorFactory.getStandardStructObjectInspector(fname, Arrays.asList(arguments)); - return soi; + boolean constantStruct = true; + Object[] constantValues = new Object[arguments.length]; + for (int i = 0; i < arguments.length; i++) { + ObjectInspector oi = arguments[i]; + constantStruct &= (oi instanceof ConstantObjectInspector); + if (constantStruct) { + constantValues[i] = ((ConstantObjectInspector)oi).getWritableConstantValue(); + } + } + if (constantStruct) { + return ObjectInspectorFactory.getStandardConstantStructObjectInspector( + fname, Arrays.asList(arguments), Arrays.asList(ret)); + } else { + return ObjectInspectorFactory.getStandardStructObjectInspector(fname, + Arrays.asList(arguments)); + } } @Override