diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 28d0e1c..cc53444 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -2329,6 +2329,49 @@ private Operator genFilterPlan(QB qb, ASTNode condn, Operator input) return output; } + /* + * for inner joins push a 'is not null predicate' to the join sources for + * every non nullSafe predicate. + */ + private Operator genNotNullFilterForJoinSourcePlan(QB qb, QBJoinTree joinTree, + int pos, Operator input) throws SemanticException { + + ArrayList joiningConds = joinTree.getExpressions().get(pos); + if (joiningConds == null || joiningConds.size() == 0) { + return input; + } + OpParseContext inputCtx = opParseCtx.get(input); + RowResolver inputRR = inputCtx.getRowResolver(); + + ExprNodeDesc filterPred = null; + for (int i = 0; i < joiningConds.size(); i++) { + ASTNode jC = joiningConds.get(i); + if (joinTree.getNullSafes().get(i)) { + continue; + } + List args = new ArrayList(); + args.add(genExprNodeDesc(jC, inputRR)); + ExprNodeDesc nextExpr = ExprNodeGenericFuncDesc.newInstance( + FunctionRegistry.getFunctionInfo("isnotnull").getGenericUDF(), args); + filterPred = filterPred == null ? nextExpr : ExprNodeDescUtils + .mergePredicates(filterPred, nextExpr); + } + + if (filterPred == null) { + return input; + } + + Operator output = putOpInsertMap(OperatorFactory.getAndMakeChild( + new FilterDesc(filterPred, false), + new RowSchema(inputRR.getColumnInfos()), input), inputRR); + + if (LOG.isDebugEnabled()) { + LOG.debug("Created Filter Plan for " + qb.getId() + " row schema: " + + inputRR.toString()); + } + return output; + } + @SuppressWarnings("nls") private Integer genColListRegex(String colRegex, String tabAlias, ASTNode sel, ArrayList col_list, @@ -6599,6 +6642,10 @@ private Operator genJoinReduceSinkChild(QB qb, QBJoinTree joinTree, ArrayList outputColumns = new ArrayList(); ArrayList reduceKeys = new ArrayList(); + if ( joinTree.getNoOuterJoin() ) { + child = genNotNullFilterForJoinSourcePlan(qb, joinTree, pos, child); + } + // Compute join keys and store in reduceKeys ArrayList exprs = joinTree.getExpressions().get(pos); for (int i = 0; i < exprs.size(); i++) {