diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java index a491677..ff0ddc8 100755 --- ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/ExprNodeEvaluatorFactory.java @@ -64,6 +64,20 @@ public static ExprNodeEvaluator get(ExprNodeDesc desc) throws HiveException { "Cannot find ExprNodeEvaluator for the exprNodeDesc = " + desc); } + public static ExprNodeEvaluator[] toCachedEvals(ExprNodeEvaluator[] evals) { + EvaluatorContext context = new EvaluatorContext(); + for (int i = 0; i < evals.length; i++) { + if (evals[i] instanceof ExprNodeGenericFuncEvaluator) { + iterate(evals[i], context); + if (context.hasReference) { + evals[i] = new ExprNodeEvaluatorHead(evals[i]); + context.hasReference = false; + } + } + } + return evals; + } + /** * Should be called before eval is initialized */ diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java index 93017d3..1dbcb06 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/SelectOperator.java @@ -28,7 +28,6 @@ import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; import org.apache.hadoop.hive.ql.plan.SelectDesc; import org.apache.hadoop.hive.ql.plan.api.OperatorType; -import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; /** * Select operator implementation. @@ -55,12 +54,12 @@ protected void initializeOp(Configuration hconf) throws HiveException { for (int i = 0; i < colList.size(); i++) { assert (colList.get(i) != null); eval[i] = ExprNodeEvaluatorFactory.get(colList.get(i)); - if (HiveConf.getBoolVar(hconf, HiveConf.ConfVars.HIVEEXPREVALUATIONCACHE)) { - eval[i] = ExprNodeEvaluatorFactory.toCachedEval(eval[i]); - } + } + if (HiveConf.getBoolVar(hconf, HiveConf.ConfVars.HIVEEXPREVALUATIONCACHE)) { + eval = ExprNodeEvaluatorFactory.toCachedEvals(eval); } output = new Object[eval.length]; - LOG.info("SELECT " + ((StructObjectInspector) inputObjInspectors[0]).getTypeName()); + LOG.info("SELECT " + inputObjInspectors[0].getTypeName()); outputObjInspector = initEvaluatorsAndReturnStruct(eval, conf.getOutputColumnNames(), inputObjInspectors[0]); initializeChildren(hconf);