Index: ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java (revision 1535614) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/Operator.java (working copy) @@ -354,7 +354,7 @@ // initialize structure to maintain child op info. operator tree changes // while // initializing so this need to be done here instead of initialize() method - if (childOperators != null) { + if (childOperators != null && !childOperators.isEmpty()) { childOperatorsArray = new Operator[childOperators.size()]; for (int i = 0; i < childOperatorsArray.length; i++) { childOperatorsArray[i] = childOperators.get(i); @@ -411,7 +411,7 @@ protected void initializeChildren(Configuration hconf) throws HiveException { state = State.INIT; LOG.info("Operator " + id + " " + getName() + " initialized"); - if (childOperators == null) { + if (childOperators == null || childOperators.isEmpty()) { return; } LOG.info("Initializing children of " + id + " " + getName()); @@ -780,7 +780,7 @@ Operator currOp = this; for (int i = 0; i < depth; i++) { // If there are more than 1 children at any level, don't do anything - if ((currOp.getChildOperators() == null) || + if ((currOp.getChildOperators() == null) || (currOp.getChildOperators().isEmpty()) || (currOp.getChildOperators().size() > 1)) { return false; } Index: ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConvertJoinMapJoin.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConvertJoinMapJoin.java (revision 1535614) +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConvertJoinMapJoin.java (working copy) @@ -162,7 +162,7 @@ ParseContext parseContext = context.parseContext; MapJoinOperator mapJoinOp = MapJoinProcessor. convertJoinOpMapJoinOp(context.conf, parseContext.getOpParseCtx(), - joinOp, parseContext.getJoinContext().get(joinOp), bigTablePosition, true, false); + joinOp, parseContext.getJoinContext().get(joinOp), bigTablePosition, true); Operator parentBigTableOp = mapJoinOp.getParentOperators().get(bigTablePosition); Index: ql/src/java/org/apache/hadoop/hive/ql/optimizer/GroupByOptimizer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/GroupByOptimizer.java (revision 1535614) +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/GroupByOptimizer.java (working copy) @@ -286,7 +286,7 @@ currOp = currOp.getParentOperators().get(0); while (true) { - if (currOp.getParentOperators() == null) { + if ((currOp.getParentOperators() == null) || (currOp.getParentOperators().isEmpty())) { break; } Index: ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinProcessor.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinProcessor.java (revision 1535614) +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/MapJoinProcessor.java (working copy) @@ -376,7 +376,7 @@ // create the map-join operator MapJoinOperator mapJoinOp = convertJoinOpMapJoinOp(conf, opParseCtxMap, - op, joinTree, mapJoinPos, noCheckOuterJoin, validateMapJoinTree); + op, joinTree, mapJoinPos, noCheckOuterJoin); // remove old parents @@ -389,6 +389,10 @@ mapJoinOp.getParentOperators().removeAll(oldReduceSinkParentOps); mapJoinOp.setParentOperators(newParentOps); + // make sure only map-joins can be performed. + if (validateMapJoinTree) { + validateMapJoinTypes(mapJoinOp); + } // change the children of the original join operator to point to the map // join operator @@ -398,8 +402,7 @@ public static MapJoinOperator convertJoinOpMapJoinOp(HiveConf hconf, LinkedHashMap, OpParseContext> opParseCtxMap, - JoinOperator op, QBJoinTree joinTree, int mapJoinPos, boolean noCheckOuterJoin, - boolean validateMapJoinTree) + JoinOperator op, QBJoinTree joinTree, int mapJoinPos, boolean noCheckOuterJoin) throws SemanticException { JoinDesc desc = op.getConf(); @@ -565,11 +568,6 @@ op.setChildOperators(null); op.setParentOperators(null); - // make sure only map-joins can be performed. - if (validateMapJoinTree) { - validateMapJoinTypes(mapJoinOp); - } - return mapJoinOp; } Index: ql/src/java/org/apache/hadoop/hive/ql/optimizer/SkewJoinOptimizer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/SkewJoinOptimizer.java (revision 1535614) +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/SkewJoinOptimizer.java (working copy) @@ -398,7 +398,8 @@ return parseContext.getTopToTable().get(tsOp); } } - if ((op.getParentOperators() == null) || (op.getParentOperators().size() > 1)) { + if ((op.getParentOperators() == null) || (op.getParentOperators().isEmpty()) || + (op.getParentOperators().size() > 1)) { return null; } op = op.getParentOperators().get(0); Index: ql/src/java/org/apache/hadoop/hive/ql/optimizer/correlation/CorrelationOptimizer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/correlation/CorrelationOptimizer.java (revision 1535614) +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/correlation/CorrelationOptimizer.java (working copy) @@ -346,7 +346,7 @@ "involved in this operator"); return correlatedReduceSinkOperators; } - if (current.getParentOperators() == null) { + if ((current.getParentOperators() == null) || (current.getParentOperators().isEmpty())) { return correlatedReduceSinkOperators; } if (current instanceof PTFOperator) { Index: ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/SortMergeJoinTaskDispatcher.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/SortMergeJoinTaskDispatcher.java (revision 1535614) +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/SortMergeJoinTaskDispatcher.java (working copy) @@ -204,7 +204,7 @@ Operator currOp = originalSMBJoinOp; while (true) { - if (currOp.getChildOperators() == null) { + if ((currOp.getChildOperators() == null) || (currOp.getChildOperators().isEmpty())) { if (currOp instanceof FileSinkOperator) { FileSinkOperator fsOp = (FileSinkOperator)currOp; // The query has enforced that a sort-merge join should be performed. Index: ql/src/java/org/apache/hadoop/hive/ql/parse/TableAccessAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/TableAccessAnalyzer.java (revision 1535614) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/TableAccessAnalyzer.java (working copy) @@ -239,7 +239,7 @@ // and filters. while (true) { parentOps = currOp.getParentOperators(); - if (parentOps == null) { + if ((parentOps == null) || (parentOps.isEmpty())) { return (TableScanOperator) currOp; }