This is an automated email from the ASF dual-hosted git repository.
starocean999 pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push:
new bd45f778a4 [fix](planner)push conjuncts into inlineview (#22054)
bd45f778a4 is described below
commit bd45f778a4e0d6370a1bc94637c0c62309463498
Author: starocean999 <[email protected]>
AuthorDate: Mon Jul 24 16:33:15 2023 +0800
[fix](planner)push conjuncts into inlineview (#22054)
* [fix](planner)push conjuncts into inlineview
---
.../java/org/apache/doris/analysis/Analyzer.java | 11 +++++----
.../apache/doris/planner/SingleNodePlanner.java | 27 ++++++++++++++++++----
2 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index 7fad314167..11032bcb7d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -43,6 +43,7 @@ import org.apache.doris.common.util.TimeUtils;
import org.apache.doris.common.util.VectorizedUtil;
import org.apache.doris.external.hudi.HudiTable;
import org.apache.doris.external.hudi.HudiUtils;
+import org.apache.doris.planner.AggregationNode;
import org.apache.doris.planner.PlanNode;
import org.apache.doris.planner.RuntimeFilter;
import org.apache.doris.qe.ConnectContext;
@@ -1868,7 +1869,7 @@ public class Analyzer {
// aliases and having it analyzed is needed for the
following EvalPredicate() call
conjunct.analyze(this);
}
- Expr newConjunct = conjunct.getResultValue(true);
+ Expr newConjunct = conjunct.clone().getResultValue(true);
newConjunct = FoldConstantsRule.INSTANCE.apply(newConjunct,
this, null);
if (newConjunct instanceof BoolLiteral || newConjunct
instanceof NullLiteral) {
boolean evalResult = true;
@@ -2425,10 +2426,12 @@ public class Analyzer {
* Wrapper around getUnassignedConjuncts(List<TupleId> tupleIds).
*/
public List<Expr> getUnassignedConjuncts(PlanNode node) {
- // constant conjuncts should be push down to all leaf node.
+ // constant conjuncts should be push down to all leaf node except agg
node.
+ // (see getPredicatesBoundedByGroupbysSourceExpr method)
// so we need remove constant conjuncts when expr is not a leaf node.
- List<Expr> unassigned = getUnassignedConjuncts(node.getTblRefIds());
- if (!node.getChildren().isEmpty()) {
+ List<Expr> unassigned = getUnassignedConjuncts(
+ node instanceof AggregationNode ? node.getTupleIds() :
node.getTblRefIds());
+ if (!node.getChildren().isEmpty() && !(node instanceof
AggregationNode)) {
unassigned = unassigned.stream()
.filter(e -> !e.isConstant()).collect(Collectors.toList());
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
index a145b6e9f1..27c01dd03b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java
@@ -21,6 +21,7 @@
package org.apache.doris.planner;
import org.apache.doris.analysis.AggregateInfo;
+import org.apache.doris.analysis.AnalyticExpr;
import org.apache.doris.analysis.AnalyticInfo;
import org.apache.doris.analysis.Analyzer;
import org.apache.doris.analysis.AssertNumRowsElement;
@@ -264,6 +265,13 @@ public class SingleNodePlanner {
AggregateInfo aggInfo = selectStmt.getAggInfo();
root = analyticPlanner.createSingleNodePlan(root,
aggInfo != null ? aggInfo.getGroupingExprs() : null,
inputPartitionExprs);
+ List<Expr> predicates = getBoundPredicates(analyzer,
+ selectStmt.getAnalyticInfo().getOutputTupleDesc());
+ if (!predicates.isEmpty()) {
+ root = new SelectNode(ctx.getNextNodeId(), root,
predicates);
+ root.init(analyzer);
+ Preconditions.checkState(root.hasValidStats());
+ }
if (aggInfo != null && !inputPartitionExprs.isEmpty()) {
// analytic computation will benefit from a partition on
inputPartitionExprs
aggInfo.setPartitionExprs(inputPartitionExprs);
@@ -1782,7 +1790,6 @@ public class SingleNodePlanner {
e.setIsOnClauseConjunct(false);
}
inlineViewRef.getAnalyzer().registerConjuncts(viewPredicates,
inlineViewRef.getAllTupleIds());
-
// mark (fully resolve) slots referenced by remaining unassigned
conjuncts as
// materialized
List<Expr> substUnassigned = Expr.substituteList(unassignedConjuncts,
@@ -1808,15 +1815,21 @@ public class SingleNodePlanner {
return;
}
- List<Expr> newConjuncts = cloneExprs(conjuncts);
final QueryStmt stmt = inlineViewRef.getViewStmt();
final Analyzer viewAnalyzer = inlineViewRef.getAnalyzer();
viewAnalyzer.markConjunctsAssigned(conjuncts);
+ // even if the conjuncts are constant, they may contains slotRef
+ // for example: case when slotRef is null then 0 else 1
+ // we need substitute the conjuncts using inlineViewRef's analyzer
+ // otherwise, when analyzing the conjunct in the inline view
+ // the analyzer is not able to find the column because it comes from
outside
+ List<Expr> newConjuncts =
+ Expr.substituteList(conjuncts, inlineViewRef.getSmap(),
viewAnalyzer, false);
if (stmt instanceof SelectStmt) {
final SelectStmt select = (SelectStmt) stmt;
if (select.getAggInfo() != null) {
viewAnalyzer.registerConjuncts(newConjuncts,
select.getAggInfo().getOutputTupleId().asList());
- } else if (select.getTableRefs().size() > 1) {
+ } else if (select.getTableRefs().size() > 0) {
for (int i = select.getTableRefs().size() - 1; i >= 0; i--) {
viewAnalyzer.registerConjuncts(newConjuncts,
select.getTableRefs().get(i).getDesc().getId().asList());
@@ -2695,6 +2708,10 @@ public class SingleNodePlanner {
}
sourceExpr = slotDesc.getSourceExprs().get(0);
}
+ if (sourceExpr instanceof AnalyticExpr) {
+ isAllSlotReferToGroupBys = false;
+ break;
+ }
// if grouping set is given and column is not in all grouping
set list
// we cannot push the predicate since the column value can be
null
if (stmt.getGroupByClause() == null) {
@@ -2722,7 +2739,9 @@ public class SingleNodePlanner {
}
GroupByClause groupByClause = stmt.getGroupByClause();
List<Expr> exprs = groupByClause.getGroupingExprs();
- if (!exprs.contains(sourceExpr)) {
+ final Expr srcExpr = sourceExpr;
+ if (!exprs.stream().anyMatch(expr -> expr.comeFrom(srcExpr))) {
+ // the sourceExpr doesn't come from any of the group by
exprs
isAllSlotReferToGroupBys = false;
break;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]