From 65ada341c3f21ec210a81cc52c797d1b1da666c3 Mon Sep 17 00:00:00 2001 From: liutang123 Date: Tue, 7 Jan 2025 15:53:40 +0800 Subject: [PATCH 1/2] [fix](planner) select and filter by slot in old planner --- .../java/org/apache/doris/planner/SelectNode.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java index 734e9338352a27..d21fc40ebfb8f2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java @@ -22,6 +22,8 @@ import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.Expr; +import org.apache.doris.catalog.Type; +import org.apache.doris.common.AnalysisException; import org.apache.doris.common.UserException; import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; @@ -66,6 +68,17 @@ protected void toThrift(TPlanNode msg) { @Override public void init(Analyzer analyzer) throws UserException { super.init(analyzer); + for (int i = 0; i < conjuncts.size(); ++i) { + Expr expr = conjuncts.get(i); + if (!expr.getType().isBoolean()) { + try { + conjuncts.set(i, expr.castTo(Type.BOOLEAN)); + } catch (AnalysisException e) { + LOG.warn("{} is not boolean and can not be cast to boolean", expr.toSql(), e); + throw new AnalysisException("conjuncts " + expr.toSql() + " is not boolean"); + } + } + } analyzer.markConjunctsAssigned(conjuncts); computeStats(analyzer); } From 21eef3172b01966bccf3a220418792b0f7f52e70 Mon Sep 17 00:00:00 2001 From: liutang123 Date: Wed, 8 Jan 2025 15:03:04 +0800 Subject: [PATCH 2/2] change cast PREDICATES logic to PlanNode --- .../org/apache/doris/planner/PlanNode.java | 20 +++++++++++++++++++ .../org/apache/doris/planner/SelectNode.java | 13 ------------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java index 73768435154b76..c83cd9cde99b99 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java @@ -34,6 +34,7 @@ import org.apache.doris.analysis.TupleId; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.OlapTable; +import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Id; import org.apache.doris.common.NotImplementedException; @@ -59,6 +60,8 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.apache.commons.collections.CollectionUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.Collection; @@ -89,6 +92,7 @@ * its children (= are bound by tupleIds). */ public abstract class PlanNode extends TreeNode implements PlanStats { + private static final Logger LOG = LogManager.getLogger(PlanNode.class); protected String planNodeName; @@ -207,6 +211,7 @@ protected PlanNode(PlanNodeId id, PlanNode node, String planNodeName, Statistica this.tblRefIds = Lists.newArrayList(node.tblRefIds); this.nullableTupleIds = Sets.newHashSet(node.nullableTupleIds); this.conjuncts = Expr.cloneList(node.conjuncts, null); + this.cardinality = -1; this.compactData = node.compactData; this.planNodeName = "V" + planNodeName; @@ -806,6 +811,21 @@ public void init() throws UserException {} public void init(Analyzer analyzer) throws UserException { assignConjuncts(analyzer); createDefaultSmap(analyzer); + castConjuncts(); + } + + private void castConjuncts() throws AnalysisException { + for (int i = 0; i < conjuncts.size(); ++i) { + Expr expr = conjuncts.get(i); + if (!expr.getType().isBoolean()) { + try { + conjuncts.set(i, expr.castTo(Type.BOOLEAN)); + } catch (AnalysisException e) { + LOG.warn("{} is not boolean and can not be cast to boolean", expr.toSql(), e); + throw new AnalysisException("conjuncts " + expr.toSql() + " is not boolean"); + } + } + } } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java index d21fc40ebfb8f2..734e9338352a27 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java @@ -22,8 +22,6 @@ import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.Expr; -import org.apache.doris.catalog.Type; -import org.apache.doris.common.AnalysisException; import org.apache.doris.common.UserException; import org.apache.doris.statistics.StatisticalType; import org.apache.doris.statistics.StatsRecursiveDerive; @@ -68,17 +66,6 @@ protected void toThrift(TPlanNode msg) { @Override public void init(Analyzer analyzer) throws UserException { super.init(analyzer); - for (int i = 0; i < conjuncts.size(); ++i) { - Expr expr = conjuncts.get(i); - if (!expr.getType().isBoolean()) { - try { - conjuncts.set(i, expr.castTo(Type.BOOLEAN)); - } catch (AnalysisException e) { - LOG.warn("{} is not boolean and can not be cast to boolean", expr.toSql(), e); - throw new AnalysisException("conjuncts " + expr.toSql() + " is not boolean"); - } - } - } analyzer.markConjunctsAssigned(conjuncts); computeStats(analyzer); }