diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/NonBlockingOpDeDupProc.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/NonBlockingOpDeDupProc.java index 63862b9..3004a36 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/NonBlockingOpDeDupProc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/NonBlockingOpDeDupProc.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.ql.optimizer; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; @@ -28,6 +29,8 @@ import java.util.Stack; import org.apache.hadoop.hive.ql.exec.FilterOperator; +import org.apache.hadoop.hive.ql.exec.JoinOperator; +import org.apache.hadoop.hive.ql.exec.Operator; import org.apache.hadoop.hive.ql.exec.SelectOperator; import org.apache.hadoop.hive.ql.lib.DefaultGraphWalker; import org.apache.hadoop.hive.ql.lib.DefaultRuleDispatcher; @@ -39,11 +42,13 @@ import org.apache.hadoop.hive.ql.lib.Rule; import org.apache.hadoop.hive.ql.lib.RuleRegExp; import org.apache.hadoop.hive.ql.parse.ParseContext; +import org.apache.hadoop.hive.ql.parse.QBJoinTree; import org.apache.hadoop.hive.ql.parse.SemanticException; import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDescUtils; import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; +import org.apache.hadoop.hive.ql.plan.OperatorDesc; /** * merges SEL-SEL or FIL-FIL into single operator @@ -129,8 +134,8 @@ public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx, pSEL.removeChildAndAdoptItsChildren(cSEL); cSEL.setParentOperators(null); cSEL.setChildOperators(null); + fixContextReferences(cSEL, pSEL); cSEL = null; - return null; } @@ -175,6 +180,23 @@ private boolean checkReferences(ExprNodeDesc expr, Set funcOutputs, Set< } } + /** + * Change existing references in the context to point from child to parent operator. + * @param cSEL child operator (to be removed, and merged into parent) + * @param pSEL parent operator + */ + private void fixContextReferences(SelectOperator cSEL, SelectOperator pSEL) { + Collection qbJoinTrees = pctx.getJoinContext().values(); + for (QBJoinTree qbJoinTree : qbJoinTrees) { + for (String alias : qbJoinTree.getAliasToOpInfo().keySet()) { + Operator opInfo = qbJoinTree.getAliasToOpInfo().get(alias); + if (opInfo == cSEL) { + qbJoinTree.getAliasToOpInfo().put(alias, pSEL); + } + } + } + } + private class FilterDedup implements NodeProcessor { @Override public Object process(Node nd, Stack stack, NodeProcessorCtx procCtx,