diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/stats/annotation/AnnotateStatsProcCtx.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/stats/annotation/AnnotateStatsProcCtx.java index 0b7f14f957..187ec254a7 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/stats/annotation/AnnotateStatsProcCtx.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/stats/annotation/AnnotateStatsProcCtx.java @@ -77,6 +77,10 @@ public void addAffectedColumn(ExprNodeColumnDesc column) { affectedColumns.add(column.getColumn()); } + public void addAffectedColumns(Set columns) { + affectedColumns.addAll(columns); + } + public Set getAffectedColumns() { return affectedColumns; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/stats/annotation/StatsRulesProcFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/stats/annotation/StatsRulesProcFactory.java index 0258e36738..26773aa1d4 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/stats/annotation/StatsRulesProcFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/stats/annotation/StatsRulesProcFactory.java @@ -334,15 +334,19 @@ protected long evaluateExpression(Statistics stats, ExprNodeDesc pred, // for AND condition cascadingly update stats if (udf instanceof GenericUDFOPAnd) { + Set affectedColumns = new HashSet<>(); andStats = stats.clone(); aspCtx.setAndExprStats(andStats); + aspCtx.clearAffectedColumns(); // evaluate children long evaluatedRowCount = currNumRows; for (ExprNodeDesc child : genFunc.getChildren()) { - aspCtx.clearAffectedColumns(); evaluatedRowCount = evaluateChildExpr(aspCtx.getAndExprStats(), child, aspCtx, neededCols, op, evaluatedRowCount); + if (evaluatedRowCount == newNumRows) { + continue; + } newNumRows = evaluatedRowCount; if (satisfyPrecondition(aspCtx.getAndExprStats())) { // Assumption is that columns are uncorrelated. @@ -353,7 +357,10 @@ protected long evaluateExpression(Statistics stats, ExprNodeDesc pred, } else { StatsUtils.updateStats(aspCtx.getAndExprStats(), newNumRows, false, op); } + affectedColumns.addAll(aspCtx.getAffectedColumns()); + aspCtx.clearAffectedColumns(); } + aspCtx.addAffectedColumns(affectedColumns); } else if (udf instanceof GenericUDFOPOr) { // for OR condition independently compute and update stats. for (ExprNodeDesc child : genFunc.getChildren()) {