Index: ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java (revision 1628549) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeGenericFuncEvaluator.java (revision ) @@ -31,6 +31,9 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; +import java.util.ArrayList; +import java.util.List; + /** * ExprNodeGenericFuncEvaluator. * @@ -44,6 +47,7 @@ transient Object rowObject; transient ExprNodeEvaluator[] children; transient GenericUDF.DeferredObject[] deferredChildren; + transient List childrenNeedingPrepare = new ArrayList(); transient boolean isEager; transient boolean isConstant = false; @@ -73,6 +77,10 @@ } } + public boolean needsPrepare() { + return !(eval instanceof ExprNodeConstantEvaluator || eval instanceof ExprNodeNullEvaluator); + } + public Object get() throws HiveException { if (!evaluated) { obj = eval.evaluate(rowObject, version); @@ -114,8 +122,12 @@ public ObjectInspector initialize(ObjectInspector rowInspector) throws HiveException { deferredChildren = new GenericUDF.DeferredObject[children.length]; for (int i = 0; i < deferredChildren.length; i++) { - deferredChildren[i] = new DeferredExprObject(children[i], isEager); + DeferredExprObject deferredExprObject = new DeferredExprObject(children[i], isEager); + deferredChildren[i] = deferredExprObject; + if (deferredExprObject.needsPrepare()) { + childrenNeedingPrepare.add(deferredExprObject); - } + } + } // Initialize all children first ObjectInspector[] childrenOIs = new ObjectInspector[children.length]; for (int i = 0; i < children.length; i++) { @@ -163,8 +175,8 @@ return ((ConstantObjectInspector) outputOI).getWritableConstantValue(); } rowObject = row; - for (int i = 0; i < deferredChildren.length; i++) { - deferredChildren[i].prepare(version); + for (GenericUDF.DeferredObject deferredObject : childrenNeedingPrepare) { + deferredObject.prepare(version); } return genericUDF.evaluate(deferredChildren); }