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 f05407d..1bd2678 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -5337,13 +5337,13 @@ private Operator genGroupByPlan1ReduceMultiGBY(List dests, QB qb, Operat QBParseInfo parseInfo = qb.getParseInfo(); - ExprNodeDesc previous = null; - Operator selectInput = input; + List expressions = new ArrayList(); // In order to facilitate partition pruning, or the where clauses together and put them at the // top of the operator tree, this could also reduce the amount of data going to the reducer List whereExpressions = new ArrayList(); + boolean allIncluded = true; for (String dest : dests) { ASTNode whereExpr = parseInfo.getWhrForClause(dest); @@ -5361,35 +5361,29 @@ private Operator genGroupByPlan1ReduceMultiGBY(List dests, QB qb, Operat continue; } - if (previous == null) { - // If this is the first expression - previous = current; - continue; - } - - GenericUDFOPOr or = new GenericUDFOPOr(); - List expressions = new ArrayList(2); - expressions.add(previous); expressions.add(current); - ExprNodeDesc orExpr = - new ExprNodeGenericFuncDesc(TypeInfoFactory.booleanTypeInfo, or, expressions); - previous = orExpr; } else { // If an expression does not have a where clause, there can be no common filter - previous = null; + allIncluded = false; break; } } - if (previous != null) { + Operator selectInput; + if (allIncluded) { + GenericUDFOPOr or = new GenericUDFOPOr(); + ExprNodeDesc orExpr = + new ExprNodeGenericFuncDesc(TypeInfoFactory.booleanTypeInfo, or, expressions); OpParseContext inputCtx = opParseCtx.get(input); RowResolver inputRR = inputCtx.getRowResolver(); - FilterDesc orFilterDesc = new FilterDesc(previous, false); + FilterDesc orFilterDesc = new FilterDesc(orExpr, false); orFilterDesc.setGenerated(true); selectInput = putOpInsertMap(OperatorFactory.getAndMakeChild( orFilterDesc, new RowSchema( inputRR.getColumnInfos()), input), inputRR); + } else { + selectInput = input; } // insert a select operator here used by the ColumnPruner to reduce