You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by li...@apache.org on 2022/07/04 06:15:38 UTC
[doris] branch master updated: [enhancement](Nereids)make nereids work (#10550)
This is an automated email from the ASF dual-hosted git repository.
lingmiao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new e6f090e5bf [enhancement](Nereids)make nereids work (#10550)
e6f090e5bf is described below
commit e6f090e5bff5925b35b7adadf992c3c1e56e8efd
Author: morrySnow <10...@users.noreply.github.com>
AuthorDate: Mon Jul 4 14:15:33 2022 +0800
[enhancement](Nereids)make nereids work (#10550)
Nereids could execute query: `select a from t;`
**enhancement**
- add a queriable interface for QueryStmt and LogicalPlanAdapter Temporarily
- refactor GroupId, GroupId extends doris.common.id now
- GroupId is generated by it's memo now, not global yet
- add varchar type
- Nereids enabled only when vectorized engine enabled
**fix**
- set output and column label to logicalPlanAdapter
- set output expression on root fragment
- set select partition and select index id to OlapScanNode
- BatchRulesJob add rule type mismatch
- add all implementation rules to rule set
- SlotReference get catalog column no longer returns null values
- bind star correctly
- implement `isNullable` in expressions
**known issue**
- could not do expression mapping(e.g. a + 1) on project node(wait intermediate tuple interface and project ability in ExecNode in be)
- aggregate do not work
- sort do not work
- filter do not work
- join do not work
---
.../java/org/apache/doris/analysis/ExprId.java | 7 +--
.../Queriable.java} | 26 +++++++----
.../java/org/apache/doris/analysis/QueryStmt.java | 2 +-
.../org/apache/doris/nereids/NereidsPlanner.java | 32 +++++++------
.../doris/nereids/analyzer/UnboundAlias.java | 2 +-
.../doris/nereids/analyzer/UnboundFunction.java | 2 +-
.../apache/doris/nereids/analyzer/UnboundSlot.java | 2 +-
.../apache/doris/nereids/analyzer/UnboundStar.java | 20 +++++---
.../apache/doris/nereids/cost/CostCalculator.java | 2 +-
.../plans/logical => glue}/LogicalPlanAdapter.java | 42 +++++++++++++++--
.../translator/ExpressionTranslator.java | 6 +--
.../translator/PhysicalPlanTranslator.java | 13 +++++-
.../translator/PlanTranslatorContext.java | 2 +-
.../doris/nereids/{ => jobs}/AnalyzeRulesJob.java | 11 +++--
.../doris/nereids/{ => jobs}/BatchRulesJob.java | 16 +++----
.../doris/nereids/{ => jobs}/OptimizeRulesJob.java | 6 ++-
.../java/org/apache/doris/nereids/memo/Group.java | 7 +--
.../org/apache/doris/nereids/memo/GroupId.java | 53 ++++++++++------------
.../java/org/apache/doris/nereids/memo/Memo.java | 7 ++-
.../doris/nereids/operators/AbstractOperator.java | 1 -
.../apache/doris/nereids/operators/Operator.java | 1 -
.../nereids/{ => operators}/OperatorVisitor.java | 3 +-
.../doris/nereids/parser/LogicalPlanBuilder.java | 3 +-
.../apache/doris/nereids/parser/NereidsParser.java | 2 +-
.../org/apache/doris/nereids/rules/RuleSet.java | 10 +++-
.../doris/nereids/rules/analysis/BindFunction.java | 2 +-
.../nereids/rules/analysis/BindSlotReference.java | 4 +-
.../rewrite/AbstractExpressionRewriteRule.java | 2 +-
.../rewrite/logical/PushPredicateThroughJoin.java | 2 +-
.../doris/nereids/trees/expressions/Add.java | 8 ++++
.../doris/nereids/trees/expressions/Alias.java | 20 ++++----
.../nereids/trees/expressions/Arithmetic.java | 19 ++++++--
.../doris/nereids/trees/expressions/Between.java | 6 +++
.../trees/expressions/ComparisonPredicate.java | 6 +++
.../trees/expressions/CompoundPredicate.java | 27 +++++++----
.../doris/nereids/trees/expressions/Divide.java | 2 +
.../doris/nereids/trees/expressions/EqualTo.java | 1 +
.../nereids/trees/expressions/Expression.java | 1 +
.../nereids/trees/expressions/GreaterThan.java | 1 +
.../trees/expressions/GreaterThanEqual.java | 1 +
.../doris/nereids/trees/expressions/LessThan.java | 1 +
.../nereids/trees/expressions/LessThanEqual.java | 1 +
.../doris/nereids/trees/expressions/Literal.java | 36 +++++----------
.../doris/nereids/trees/expressions/Mod.java | 2 +
.../doris/nereids/trees/expressions/Multiply.java | 2 +
.../trees/expressions/NamedExpressionUtil.java | 4 +-
.../doris/nereids/trees/expressions/Not.java | 1 +
.../nereids/trees/expressions/NullSafeEqual.java | 1 +
.../nereids/trees/expressions/SlotReference.java | 4 +-
.../doris/nereids/trees/expressions/Subtract.java | 2 +
.../expressions/functions/AggregateFunction.java | 2 +-
.../trees/expressions/functions/BoundFunction.java | 2 +-
.../{ => visitor}/DefaultExpressionRewriter.java | 6 ++-
.../{ => visitor}/DefaultExpressionVisitor.java | 4 +-
.../{ => visitor}/ExpressionVisitor.java | 26 ++++++++++-
.../{ => visitor}/IterationVisitor.java | 25 +++++++++-
.../expressions/{ => visitor}/SlotExtractor.java | 6 ++-
.../org/apache/doris/nereids/types/DataType.java | 20 +++++---
.../VarcharType.java} | 26 +++++++----
.../org/apache/doris/planner/OlapScanNode.java | 10 +++-
.../java/org/apache/doris/qe/ConnectProcessor.java | 44 +++++++-----------
.../java/org/apache/doris/qe/SessionVariable.java | 7 ++-
.../java/org/apache/doris/qe/StmtExecutor.java | 43 ++++++++++++++----
63 files changed, 430 insertions(+), 225 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprId.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprId.java
index 2045b71367..303d2fbb9d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprId.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprId.java
@@ -23,14 +23,9 @@ package org.apache.doris.analysis;
import org.apache.doris.common.Id;
import org.apache.doris.common.IdGenerator;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
public class ExprId extends Id<ExprId> {
- private static final Logger LOG = LogManager.getLogger(ExprId.class);
-
// Construction only allowed via an IdGenerator.
- public ExprId(int id) {
+ protected ExprId(int id) {
super(id);
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/OptimizeRulesJob.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Queriable.java
similarity index 68%
copy from fe/fe-core/src/main/java/org/apache/doris/nereids/OptimizeRulesJob.java
copy to fe/fe-core/src/main/java/org/apache/doris/analysis/Queriable.java
index 80ed619a16..5144304905 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/OptimizeRulesJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Queriable.java
@@ -15,18 +15,24 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids;
+package org.apache.doris.analysis;
-import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.List;
/**
- * cascade optimizer added.
+ * Glue interface for QueryStmt and LogicalPlanAdaptor
*/
-public class OptimizeRulesJob extends BatchRulesJob {
- OptimizeRulesJob(PlannerContext plannerContext) {
- super(plannerContext);
- rulesJob.addAll(ImmutableList.of(
- optimize()
- ));
- }
+public interface Queriable {
+ boolean hasOutFileClause();
+
+ OutFileClause getOutFileClause();
+
+ boolean isExplain();
+
+ ExplainOptions getExplainOptions();
+
+ List<Expr> getResultExprs();
+
+ ArrayList<String> getColLabels();
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java
index d11f27d100..2246139339 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java
@@ -50,7 +50,7 @@ import java.util.stream.Collectors;
* Used for sharing members/methods and some of the analysis code, in particular the
* analysis of the ORDER BY and LIMIT clauses.
*/
-public abstract class QueryStmt extends StatementBase {
+public abstract class QueryStmt extends StatementBase implements Queriable {
private static final Logger LOG = LogManager.getLogger(QueryStmt.class);
/////////////////////////////////////////
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
index 5d58791502..96a4a26f04 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
@@ -21,17 +21,19 @@ import org.apache.doris.analysis.DescriptorTable;
import org.apache.doris.analysis.StatementBase;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.UserException;
-import org.apache.doris.common.util.VectorizedUtil;
+import org.apache.doris.nereids.glue.LogicalPlanAdapter;
+import org.apache.doris.nereids.glue.translator.PhysicalPlanTranslator;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.nereids.jobs.AnalyzeRulesJob;
+import org.apache.doris.nereids.jobs.OptimizeRulesJob;
import org.apache.doris.nereids.memo.Group;
import org.apache.doris.nereids.memo.GroupExpression;
import org.apache.doris.nereids.memo.Memo;
import org.apache.doris.nereids.properties.PhysicalProperties;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
-import org.apache.doris.nereids.trees.plans.logical.LogicalPlanAdapter;
import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
-import org.apache.doris.nereids.trees.plans.translator.PhysicalPlanTranslator;
-import org.apache.doris.nereids.trees.plans.translator.PlanTranslatorContext;
import org.apache.doris.planner.PlanFragment;
import org.apache.doris.planner.Planner;
import org.apache.doris.planner.ScanNode;
@@ -42,6 +44,7 @@ import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.stream.Collectors;
/**
* Planner to do query plan in Nereids.
@@ -66,19 +69,22 @@ public class NereidsPlanner extends Planner {
LogicalPlanAdapter logicalPlanAdapter = (LogicalPlanAdapter) queryStmt;
PhysicalPlan physicalPlan = plan(logicalPlanAdapter.getLogicalPlan(), new PhysicalProperties(), ctx);
PhysicalPlanTranslator physicalPlanTranslator = new PhysicalPlanTranslator();
- PlanTranslatorContext planContext = new PlanTranslatorContext();
- physicalPlanTranslator.translatePlan(physicalPlan, planContext);
- fragments = new ArrayList<>(planContext.getPlanFragmentList());
+ PlanTranslatorContext planTranslatorContext = new PlanTranslatorContext();
+ physicalPlanTranslator.translatePlan(physicalPlan, planTranslatorContext);
+ descTable = planTranslatorContext.getDescTable();
+ fragments = new ArrayList<>(planTranslatorContext.getPlanFragmentList());
PlanFragment root = fragments.get(fragments.size() - 1);
for (PlanFragment fragment : fragments) {
fragment.finalize(queryStmt);
}
- root.setOutputExprs(queryStmt.getResultExprs());
- if (VectorizedUtil.isVectorized()) {
- root.getPlanRoot().convertToVectoriezd();
- }
- scanNodeList = planContext.getScanNodeList();
- descTable = planContext.getDescTable();
+ root.resetOutputExprs(descTable.getTupleDesc(root.getPlanRoot().getTupleIds().get(0)));
+ root.getPlanRoot().convertToVectoriezd();
+ scanNodeList = planTranslatorContext.getScanNodeList();
+ logicalPlanAdapter.setResultExprs(root.getOutputExprs());
+ ArrayList<String> columnLabelList = physicalPlan.getOutput().stream()
+ .map(NamedExpression::getName).collect(Collectors.toCollection(ArrayList::new));
+ logicalPlanAdapter.setColLabels(columnLabelList);
+
Collections.reverse(fragments);
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundAlias.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundAlias.java
index e17e5ed645..42a6751564 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundAlias.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundAlias.java
@@ -20,9 +20,9 @@ package org.apache.doris.nereids.analyzer;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.ExpressionVisitor;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.UnaryExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
import com.google.common.base.Preconditions;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
index f82b13259a..bf8e5aee79 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundFunction.java
@@ -19,7 +19,7 @@ package org.apache.doris.nereids.analyzer;
import org.apache.doris.nereids.trees.NodeType;
import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.ExpressionVisitor;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import com.google.common.base.Joiner;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
index ce0972dfb8..b287f8d512 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundSlot.java
@@ -18,8 +18,8 @@
package org.apache.doris.nereids.analyzer;
import org.apache.doris.nereids.trees.NodeType;
-import org.apache.doris.nereids.trees.expressions.ExpressionVisitor;
import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.util.Utils;
import com.google.common.collect.Lists;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
index 9f7bf23aa4..e9a2b07eed 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundStar.java
@@ -17,10 +17,11 @@
package org.apache.doris.nereids.analyzer;
+import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
-import org.apache.doris.nereids.trees.expressions.ExpressionVisitor;
import org.apache.doris.nereids.trees.expressions.LeafExpression;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.util.Utils;
import org.apache.commons.lang.StringUtils;
@@ -31,23 +32,28 @@ import java.util.List;
* Star expression.
*/
public class UnboundStar extends NamedExpression implements LeafExpression, Unbound {
- private final List<String> target;
+ private final List<String> qualifier;
- public UnboundStar(List<String> target) {
+ public UnboundStar(List<String> qualifier) {
super(NodeType.UNBOUND_STAR);
- this.target = target;
+ this.qualifier = qualifier;
}
@Override
public String sql() {
- String targetString = target.stream().map(Utils::quoteIfNeeded).reduce((t1, t2) -> t1 + "." + t2).orElse("");
- if (StringUtils.isNotEmpty(targetString)) {
- return targetString + ".*";
+ String qualified = qualifier.stream().map(Utils::quoteIfNeeded).reduce((t1, t2) -> t1 + "." + t2).orElse("");
+ if (StringUtils.isNotEmpty(qualified)) {
+ return qualified + ".*";
} else {
return "*";
}
}
+ @Override
+ public List<String> getQualifier() throws UnboundException {
+ return qualifier;
+ }
+
@Override
public String toString() {
return sql();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostCalculator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostCalculator.java
index 90cc2f8751..b0c7025b14 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostCalculator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostCalculator.java
@@ -18,10 +18,10 @@
package org.apache.doris.nereids.cost;
import org.apache.doris.common.Id;
-import org.apache.doris.nereids.OperatorVisitor;
import org.apache.doris.nereids.PlanContext;
import org.apache.doris.nereids.memo.GroupExpression;
import org.apache.doris.nereids.operators.Operator;
+import org.apache.doris.nereids.operators.OperatorVisitor;
import org.apache.doris.nereids.operators.plans.physical.PhysicalAggregation;
import org.apache.doris.nereids.operators.plans.physical.PhysicalHashJoin;
import org.apache.doris.nereids.operators.plans.physical.PhysicalOlapScan;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalPlanAdapter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/LogicalPlanAdapter.java
similarity index 53%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalPlanAdapter.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/glue/LogicalPlanAdapter.java
index 419fb2ba4f..0c92395291 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalPlanAdapter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/LogicalPlanAdapter.java
@@ -6,7 +6,7 @@
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
@@ -15,18 +15,28 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.plans.logical;
+package org.apache.doris.nereids.glue;
+import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.OutFileClause;
+import org.apache.doris.analysis.Queriable;
import org.apache.doris.analysis.RedirectStatus;
import org.apache.doris.analysis.StatementBase;
+import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* This class is used for the compatibility and code reuse in.
+ * TODO: rethink it, LogicalPlanAdapter should not bind with Query yet, so we need to do some refactor in StmtExecutor
* @see org.apache.doris.qe.ConnectProcessor
*/
-public class LogicalPlanAdapter extends StatementBase {
+public class LogicalPlanAdapter extends StatementBase implements Queriable {
private final LogicalPlan logicalPlan;
+ private List<Expr> resultExprs;
+ private ArrayList<String> colLabels;
public LogicalPlanAdapter(LogicalPlan logicalPlan) {
this.logicalPlan = logicalPlan;
@@ -41,4 +51,30 @@ public class LogicalPlanAdapter extends StatementBase {
return logicalPlan;
}
+ @Override
+ public boolean hasOutFileClause() {
+ return false;
+ }
+
+ @Override
+ public OutFileClause getOutFileClause() {
+ return null;
+ }
+
+ @Override
+ public List<Expr> getResultExprs() {
+ return resultExprs;
+ }
+
+ public ArrayList<String> getColLabels() {
+ return colLabels;
+ }
+
+ public void setResultExprs(List<Expr> resultExprs) {
+ this.resultExprs = resultExprs;
+ }
+
+ public void setColLabels(ArrayList<String> colLabels) {
+ this.colLabels = colLabels;
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/ExpressionTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
similarity index 97%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/ExpressionTranslator.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
index 887b152c19..85dd9625ed 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/ExpressionTranslator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.plans.translator;
+package org.apache.doris.nereids.glue.translator;
import org.apache.doris.analysis.ArithmeticExpr;
import org.apache.doris.analysis.BinaryPredicate;
@@ -32,7 +32,6 @@ import org.apache.doris.nereids.trees.NodeType;
import org.apache.doris.nereids.trees.expressions.Arithmetic;
import org.apache.doris.nereids.trees.expressions.Between;
import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
-import org.apache.doris.nereids.trees.expressions.DefaultExpressionVisitor;
import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.GreaterThan;
@@ -44,6 +43,7 @@ import org.apache.doris.nereids.trees.expressions.Not;
import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.functions.BoundFunction;
+import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionVisitor;
import org.apache.doris.nereids.types.BooleanType;
import org.apache.doris.nereids.types.DataType;
import org.apache.doris.nereids.types.DoubleType;
@@ -132,7 +132,7 @@ public class ExpressionTranslator extends DefaultExpressionVisitor<Expr, PlanTra
} else if (dataType instanceof DoubleType) {
return new FloatLiteral((Double) literal.getValue(), Type.DOUBLE);
} else if (dataType instanceof IntegerType) {
- return new IntLiteral((Long) literal.getValue());
+ return new IntLiteral((Integer) literal.getValue());
} else if (dataType instanceof NullType) {
return new NullLiteral();
} else if (dataType instanceof StringType) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
similarity index 96%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/PhysicalPlanTranslator.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 41d3955b8c..04abd987cb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/PhysicalPlanTranslator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.plans.translator;
+package org.apache.doris.nereids.glue.translator;
import org.apache.doris.analysis.AggregateInfo;
import org.apache.doris.analysis.BaseTableRef;
@@ -30,6 +30,7 @@ import org.apache.doris.analysis.TupleDescriptor;
import org.apache.doris.analysis.TupleId;
import org.apache.doris.catalog.OlapTable;
import org.apache.doris.catalog.Table;
+import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.operators.plans.JoinType;
import org.apache.doris.nereids.operators.plans.physical.PhysicalAggregation;
import org.apache.doris.nereids.operators.plans.physical.PhysicalFilter;
@@ -63,6 +64,8 @@ import org.apache.doris.planner.SortNode;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.HashSet;
@@ -79,6 +82,7 @@ import java.util.stream.Collectors;
* </STRONG>
*/
public class PhysicalPlanTranslator extends PlanOperatorVisitor<PlanFragment, PlanTranslatorContext> {
+ private static final Logger LOG = LogManager.getLogger(PhysicalPlanTranslator.class);
public void translatePlan(PhysicalPlan physicalPlan, PlanTranslatorContext context) {
visit(physicalPlan, context);
@@ -169,6 +173,12 @@ public class PhysicalPlanTranslator extends PlanOperatorVisitor<PlanFragment, Pl
TableRef ref = new TableRef(tableName, null, null);
BaseTableRef tableRef = new BaseTableRef(ref, olapTable, tableName);
tupleDescriptor.setRef(tableRef);
+ olapScanNode.setSelectedPartitionIds(physicalOlapScan.getSelectedPartitionId());
+ try {
+ olapScanNode.updateScanRangeInfoByNewMVSelector(physicalOlapScan.getSelectedIndexId(), false, "");
+ } catch (Exception e) {
+ throw new AnalysisException(e.getMessage());
+ }
exec(olapScanNode::init);
olapScanNode.addConjuncts(execConjunctsList);
context.addScanNode(olapScanNode);
@@ -287,6 +297,7 @@ public class PhysicalPlanTranslator extends PlanOperatorVisitor<PlanFragment, Pl
return result;
}
+ // TODO: generate expression mapping when be project could do in ExecNode
@Override
public PlanFragment visitPhysicalProject(
PhysicalUnaryPlan<PhysicalProject, Plan> projectPlan, PlanTranslatorContext context) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/PlanTranslatorContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
similarity index 98%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/PlanTranslatorContext.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
index c12a01a70e..6002c07bf1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/translator/PlanTranslatorContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.plans.translator;
+package org.apache.doris.nereids.glue.translator;
import org.apache.doris.analysis.DescriptorTable;
import org.apache.doris.analysis.Expr;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/AnalyzeRulesJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/AnalyzeRulesJob.java
similarity index 81%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/AnalyzeRulesJob.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/AnalyzeRulesJob.java
index 1f7a01708f..ed8bba9b0b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/AnalyzeRulesJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/AnalyzeRulesJob.java
@@ -15,19 +15,24 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids;
+package org.apache.doris.nereids.jobs;
+import org.apache.doris.nereids.PlannerContext;
import org.apache.doris.nereids.rules.analysis.BindRelation;
import org.apache.doris.nereids.rules.analysis.BindSlotReference;
import com.google.common.collect.ImmutableList;
/**
- * Execute the analyze job.
+ * Execute the analysis job.
*/
public class AnalyzeRulesJob extends BatchRulesJob {
- AnalyzeRulesJob(PlannerContext plannerContext) {
+ /**
+ * Execute the analysis job
+ * @param plannerContext planner context for execute job
+ */
+ public AnalyzeRulesJob(PlannerContext plannerContext) {
super(plannerContext);
rulesJob.addAll(ImmutableList.of(
bottomUpBatch(ImmutableList.of(
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/BatchRulesJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/BatchRulesJob.java
similarity index 84%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/BatchRulesJob.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/BatchRulesJob.java
index bc68d92fe9..c2a9fed4e5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/BatchRulesJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/BatchRulesJob.java
@@ -15,9 +15,9 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids;
+package org.apache.doris.nereids.jobs;
-import org.apache.doris.nereids.jobs.Job;
+import org.apache.doris.nereids.PlannerContext;
import org.apache.doris.nereids.jobs.cascades.OptimizeGroupJob;
import org.apache.doris.nereids.jobs.rewrite.RewriteBottomUpJob;
import org.apache.doris.nereids.jobs.rewrite.RewriteTopDownJob;
@@ -43,10 +43,10 @@ public class BatchRulesJob {
this.plannerContext = Objects.requireNonNull(plannerContext, "plannerContext can not null");
}
- protected Job<Plan> bottomUpBatch(List<RuleFactory> ruleFactories) {
+ protected Job<Plan> bottomUpBatch(List<RuleFactory<Plan>> ruleFactories) {
List<Rule<Plan>> rules = new ArrayList<>();
- for (RuleFactory ruleFactory : ruleFactories) {
- rules.add((Rule<Plan>) ruleFactory.buildRules());
+ for (RuleFactory<Plan> ruleFactory : ruleFactories) {
+ rules.addAll(ruleFactory.buildRules());
}
Collections.reverse(rules);
return new RewriteBottomUpJob(
@@ -55,10 +55,10 @@ public class BatchRulesJob {
plannerContext);
}
- protected Job<Plan> topDownBatch(List<RuleFactory> ruleFactories) {
+ protected Job<Plan> topDownBatch(List<RuleFactory<Plan>> ruleFactories) {
List<Rule<Plan>> rules = new ArrayList<>();
- for (RuleFactory ruleFactory : ruleFactories) {
- rules.add((Rule<Plan>) ruleFactory.buildRules());
+ for (RuleFactory<Plan> ruleFactory : ruleFactories) {
+ rules.addAll(ruleFactory.buildRules());
}
Collections.reverse(rules);
return new RewriteTopDownJob(
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/OptimizeRulesJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/OptimizeRulesJob.java
similarity index 87%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/OptimizeRulesJob.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/OptimizeRulesJob.java
index 80ed619a16..5402444e7d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/OptimizeRulesJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/OptimizeRulesJob.java
@@ -15,7 +15,9 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids;
+package org.apache.doris.nereids.jobs;
+
+import org.apache.doris.nereids.PlannerContext;
import com.google.common.collect.ImmutableList;
@@ -23,7 +25,7 @@ import com.google.common.collect.ImmutableList;
* cascade optimizer added.
*/
public class OptimizeRulesJob extends BatchRulesJob {
- OptimizeRulesJob(PlannerContext plannerContext) {
+ public OptimizeRulesJob(PlannerContext plannerContext) {
super(plannerContext);
rulesJob.addAll(ImmutableList.of(
optimize()
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
index 4e99db0151..d2e3e2e86c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
@@ -38,7 +38,7 @@ import java.util.Optional;
* Representation for group in cascades optimizer.
*/
public class Group {
- private final GroupId groupId = GroupId.newPlanSetId();
+ private final GroupId groupId;
private final List<GroupExpression> logicalExpressions = Lists.newArrayList();
private final List<GroupExpression> physicalExpressions = Lists.newArrayList();
@@ -56,7 +56,8 @@ public class Group {
*
* @param groupExpression first {@link GroupExpression} in this Group
*/
- public Group(GroupExpression groupExpression, LogicalProperties logicalProperties) {
+ public Group(GroupId groupId, GroupExpression groupExpression, LogicalProperties logicalProperties) {
+ this.groupId = groupId;
if (groupExpression.getOperator() instanceof LogicalOperator) {
this.logicalExpressions.add(groupExpression);
} else {
@@ -230,6 +231,6 @@ public class Group {
@Override
public String toString() {
- return "Group{" + getLogicalExpression().getOperator() + "}";
+ return "Group[" + groupId + "]";
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupId.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupId.java
index b3842f06b9..ee2b8ff87a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupId.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupId.java
@@ -17,43 +17,38 @@
package org.apache.doris.nereids.memo;
-import java.util.Objects;
-import java.util.UUID;
-import java.util.concurrent.atomic.AtomicLong;
+import org.apache.doris.common.Id;
+import org.apache.doris.common.IdGenerator;
/**
* UUID for {@link Group}.
*/
-public class GroupId {
- private static final AtomicLong CURRENT_ID = new AtomicLong();
- private static final UUID JVM_ID = UUID.randomUUID();
-
- private final long id;
- private final UUID jvmId;
-
- public GroupId(long id, UUID jvmId) {
- this.id = id;
- this.jvmId = jvmId;
+public class GroupId extends Id<GroupId> {
+ protected GroupId(int id) {
+ super(id);
}
- public static GroupId newPlanSetId() {
- return new GroupId(CURRENT_ID.getAndIncrement(), JVM_ID);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- GroupId groupId = (GroupId) o;
- return id == groupId.id && jvmId.equals(groupId.jvmId);
+ /**
+ * create a group id generator.
+ *
+ * @return group id generator
+ */
+ public static IdGenerator<GroupId> createGenerator() {
+ return new IdGenerator<GroupId>() {
+ @Override
+ public GroupId getNextId() {
+ return new GroupId(nextId++);
+ }
+
+ @Override
+ public GroupId getMaxId() {
+ return new GroupId(nextId - 1);
+ }
+ };
}
@Override
- public int hashCode() {
- return Objects.hash(id, jvmId);
+ public String toString() {
+ return "GroupId#" + id;
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
index b125a85ec8..5924a75bdc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.memo;
+import org.apache.doris.common.IdGenerator;
import org.apache.doris.nereids.properties.LogicalProperties;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.plans.GroupPlan;
@@ -35,8 +36,10 @@ import javax.annotation.Nullable;
* Representation for memo in cascades optimizer.
*/
public class Memo {
+ // generate group id in memo is better for test, since we can reproduce exactly same Memo.
+ private final IdGenerator<GroupId> groupIdGenerator = GroupId.createGenerator();
private final List<Group> groups = Lists.newArrayList();
- // we could not use Set, because Set has no get method.
+ // we could not use Set, because Set does not have get method.
private final Map<GroupExpression, GroupExpression> groupExpressions = Maps.newHashMap();
private Group root;
@@ -132,7 +135,7 @@ public class Memo {
target.addGroupExpression(groupExpression);
}
} else {
- Group group = new Group(groupExpression, logicalProperties);
+ Group group = new Group(groupIdGenerator.getNextId(), groupExpression, logicalProperties);
Preconditions.checkArgument(!groups.contains(group), "new group with already exist output");
groups.add(group);
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/AbstractOperator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/AbstractOperator.java
index 6dbe1d85c7..c3a4098f84 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/AbstractOperator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/AbstractOperator.java
@@ -17,7 +17,6 @@
package org.apache.doris.nereids.operators;
-import org.apache.doris.nereids.OperatorVisitor;
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.PlanOperatorVisitor;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/Operator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/Operator.java
index 78524674af..1e85102971 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/Operator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/Operator.java
@@ -17,7 +17,6 @@
package org.apache.doris.nereids.operators;
-import org.apache.doris.nereids.OperatorVisitor;
import org.apache.doris.nereids.memo.GroupExpression;
import org.apache.doris.nereids.trees.TreeNode;
import org.apache.doris.nereids.trees.plans.Plan;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/OperatorVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/OperatorVisitor.java
similarity index 96%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/OperatorVisitor.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/operators/OperatorVisitor.java
index d2a7c4ef6e..d08a028125 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/OperatorVisitor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/operators/OperatorVisitor.java
@@ -15,9 +15,8 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids;
+package org.apache.doris.nereids.operators;
-import org.apache.doris.nereids.operators.Operator;
import org.apache.doris.nereids.operators.plans.physical.PhysicalAggregation;
import org.apache.doris.nereids.operators.plans.physical.PhysicalFilter;
import org.apache.doris.nereids.operators.plans.physical.PhysicalHashJoin;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index e63601dc65..18a0737742 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -99,6 +99,7 @@ import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.RuleNode;
import org.antlr.v4.runtime.tree.TerminalNode;
+import java.util.Collections;
import java.util.List;
import java.util.Optional;
@@ -191,7 +192,7 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
.map(RuleContext::getText)
.collect(ImmutableList.toImmutableList());
} else {
- target = Lists.newArrayList();
+ target = Collections.emptyList();
}
return new UnboundStar(target);
});
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
index 0b12b65d1c..9a190fe9bf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/NereidsParser.java
@@ -20,9 +20,9 @@ package org.apache.doris.nereids.parser;
import org.apache.doris.analysis.StatementBase;
import org.apache.doris.nereids.DorisLexer;
import org.apache.doris.nereids.DorisParser;
+import org.apache.doris.nereids.glue.LogicalPlanAdapter;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
-import org.apache.doris.nereids.trees.plans.logical.LogicalPlanAdapter;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
index 55ff1121c8..c40a3bbb83 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java
@@ -19,9 +19,12 @@ package org.apache.doris.nereids.rules;
import org.apache.doris.nereids.rules.exploration.join.JoinCommutative;
import org.apache.doris.nereids.rules.exploration.join.JoinLeftAssociative;
+import org.apache.doris.nereids.rules.implementation.LogicalAggToPhysicalHashAgg;
import org.apache.doris.nereids.rules.implementation.LogicalFilterToPhysicalFilter;
import org.apache.doris.nereids.rules.implementation.LogicalJoinToHashJoin;
+import org.apache.doris.nereids.rules.implementation.LogicalOlapScanToPhysicalOlapScan;
import org.apache.doris.nereids.rules.implementation.LogicalProjectToPhysicalProject;
+import org.apache.doris.nereids.rules.implementation.LogicalSortToPhysicalHeapSort;
import org.apache.doris.nereids.trees.TreeNode;
import org.apache.doris.nereids.trees.plans.Plan;
@@ -40,9 +43,12 @@ public class RuleSet {
.build();
public static final List<Rule<Plan>> IMPLEMENTATION_RULES = planRuleFactories()
+ .add(new LogicalAggToPhysicalHashAgg())
+ .add(new LogicalFilterToPhysicalFilter())
.add(new LogicalJoinToHashJoin())
+ .add(new LogicalOlapScanToPhysicalOlapScan())
.add(new LogicalProjectToPhysicalProject())
- .add(new LogicalFilterToPhysicalFilter())
+ .add(new LogicalSortToPhysicalHeapSort())
.build();
public List<Rule<Plan>> getExplorationRules() {
@@ -54,7 +60,7 @@ public class RuleSet {
}
public static RuleFactories<Plan> planRuleFactories() {
- return new RuleFactories();
+ return new RuleFactories<>();
}
/**
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindFunction.java
index 6d51d70a67..e6e1dc3dd0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindFunction.java
@@ -22,10 +22,10 @@ import org.apache.doris.nereids.operators.plans.logical.LogicalAggregate;
import org.apache.doris.nereids.operators.plans.logical.LogicalProject;
import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
-import org.apache.doris.nereids.trees.expressions.DefaultExpressionRewriter;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.functions.Sum;
+import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
import org.apache.doris.nereids.trees.plans.Plan;
import com.google.common.collect.ImmutableList;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSlotReference.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSlotReference.java
index a6cc5e9afb..1f13ee2e6b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSlotReference.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSlotReference.java
@@ -31,10 +31,10 @@ import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
import org.apache.doris.nereids.trees.NodeType;
import org.apache.doris.nereids.trees.expressions.Alias;
-import org.apache.doris.nereids.trees.expressions.DefaultExpressionRewriter;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
import org.apache.doris.nereids.trees.plans.Plan;
import com.google.common.base.Preconditions;
@@ -168,7 +168,7 @@ public class BindSlotReference implements AnalysisRuleFactory {
@Override
public Expression visitUnboundStar(UnboundStar unboundStar, Void context) {
- if (!(plan instanceof LogicalProject)) {
+ if (!(plan.getOperator() instanceof LogicalProject)) {
throw new AnalysisException("UnboundStar must exists in Projection");
}
List<String> qualifier = unboundStar.getQualifier();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/AbstractExpressionRewriteRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/AbstractExpressionRewriteRule.java
index f17fb1430c..eb3ef44e7a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/AbstractExpressionRewriteRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rewrite/AbstractExpressionRewriteRule.java
@@ -17,8 +17,8 @@
package org.apache.doris.nereids.rules.expression.rewrite;
-import org.apache.doris.nereids.trees.expressions.DefaultExpressionRewriter;
import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
/**
* Base class of expression rewrite rule.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java
index 429c495623..32c3f47e46 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushPredicateThroughJoin.java
@@ -27,7 +27,7 @@ import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Literal;
import org.apache.doris.nereids.trees.expressions.Slot;
-import org.apache.doris.nereids.trees.expressions.SlotExtractor;
+import org.apache.doris.nereids.trees.expressions.visitor.SlotExtractor;
import org.apache.doris.nereids.trees.plans.GroupPlan;
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.logical.LogicalBinaryPlan;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Add.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Add.java
index dac9d919e2..95cca317aa 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Add.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Add.java
@@ -17,6 +17,9 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.nereids.exceptions.UnboundException;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+
import com.google.common.base.Preconditions;
import java.util.List;
@@ -42,6 +45,11 @@ public class Add<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_TYPE extends Ex
return new Add<>(children.get(0), children.get(1));
}
+ @Override
+ public boolean nullable() throws UnboundException {
+ return left().nullable() || right().nullable();
+ }
+
@Override
public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
return visitor.visitAdd(this, context);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java
index dacf7146e0..2dc5bce7e7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Alias.java
@@ -49,6 +49,11 @@ public class Alias<CHILD_TYPE extends Expression> extends NamedExpression
this.qualifier = ImmutableList.of();
}
+ @Override
+ public Slot toSlot() throws UnboundException {
+ return new SlotReference(exprId, name, child().getDataType(), child().nullable(), qualifier);
+ }
+
@Override
public String getName() throws UnboundException {
return name;
@@ -64,11 +69,6 @@ public class Alias<CHILD_TYPE extends Expression> extends NamedExpression
return qualifier;
}
- @Override
- public Slot toSlot() throws UnboundException {
- return new SlotReference(exprId, name, child().getDataType(), child().nullable(), qualifier);
- }
-
@Override
public DataType getDataType() throws UnboundException {
return child().getDataType();
@@ -84,14 +84,14 @@ public class Alias<CHILD_TYPE extends Expression> extends NamedExpression
return child().nullable();
}
- @Override
- public String toString() {
- return child().toString() + " AS " + name;
- }
-
@Override
public Expression withChildren(List<Expression> children) {
Preconditions.checkArgument(children.size() == 1);
return new Alias<>(children.get(0), name);
}
+
+ @Override
+ public String toString() {
+ return child().toString() + " AS " + name;
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Arithmetic.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Arithmetic.java
index b4f55c7cd5..674d77ad62 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Arithmetic.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Arithmetic.java
@@ -20,7 +20,9 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.analysis.ArithmeticExpr;
import org.apache.doris.analysis.ArithmeticExpr.Operator;
+import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
import java.util.Objects;
@@ -139,10 +141,6 @@ public abstract class Arithmetic extends Expression {
}
}
- public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
- return visitor.visitArithmetic(this, context);
- }
-
@Override
public DataType getDataType() {
// TODO: split Unary and Binary arithmetic
@@ -157,6 +155,19 @@ public abstract class Arithmetic extends Expression {
}
}
+ @Override
+ public boolean nullable() throws UnboundException {
+ if (op.isUnary()) {
+ return child(0).nullable();
+ } else {
+ return child(0).nullable() || child(1).nullable();
+ }
+ }
+
+ public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
+ return visitor.visitArithmetic(this, context);
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Between.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Between.java
index 882622387c..3fb10e891d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Between.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Between.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.BooleanType;
import org.apache.doris.nereids.types.DataType;
@@ -60,6 +61,11 @@ public class Between<
return BooleanType.INSTANCE;
}
+ @Override
+ public boolean nullable() throws UnboundException {
+ return lowerBound.nullable() || upperBound.nullable();
+ }
+
@Override
public String sql() {
return compareExpr.sql() + " BETWEEN " + lowerBound.sql() + " AND " + upperBound.sql();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ComparisonPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ComparisonPredicate.java
index f00c59039f..ee09b1a0a0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ComparisonPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ComparisonPredicate.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.BooleanType;
import org.apache.doris.nereids.types.DataType;
@@ -46,6 +47,11 @@ public abstract class ComparisonPredicate<LEFT_CHILD_TYPE extends Expression, RI
return BooleanType.INSTANCE;
}
+ @Override
+ public boolean nullable() throws UnboundException {
+ return left().nullable() || right().nullable();
+ }
+
@Override
public String sql() {
String nodeType = getType().toString();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CompoundPredicate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CompoundPredicate.java
index 39dcc2f4f4..8c5995c265 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CompoundPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/CompoundPredicate.java
@@ -17,7 +17,9 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import java.util.List;
import java.util.Objects;
@@ -47,9 +49,8 @@ public class CompoundPredicate<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_T
}
@Override
- public String toString() {
- String nodeType = getType().toString();
- return nodeType + "(" + left() + ", " + right() + ")";
+ public boolean nullable() throws UnboundException {
+ return left().nullable() || right().nullable();
}
@Override
@@ -57,11 +58,9 @@ public class CompoundPredicate<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_T
return visitor.visitCompoundPredicate(this, context);
}
- public NodeType flip() {
- if (getType() == NodeType.AND) {
- return NodeType.OR;
- }
- return NodeType.AND;
+ @Override
+ public Expression withChildren(List<Expression> children) {
+ return new CompoundPredicate<>(getType(), children.get(0), children.get(1));
}
@Override
@@ -78,8 +77,16 @@ public class CompoundPredicate<LEFT_CHILD_TYPE extends Expression, RIGHT_CHILD_T
}
@Override
- public Expression withChildren(List<Expression> children) {
- return new CompoundPredicate<>(getType(), children.get(0), children.get(1));
+ public String toString() {
+ String nodeType = getType().toString();
+ return nodeType + "(" + left() + ", " + right() + ")";
+ }
+
+ public NodeType flip() {
+ if (getType() == NodeType.AND) {
+ return NodeType.OR;
+ }
+ return NodeType.AND;
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Divide.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Divide.java
index 9486843f8e..eb84f78760 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Divide.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Divide.java
@@ -17,6 +17,8 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+
import com.google.common.base.Preconditions;
import java.util.List;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/EqualTo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/EqualTo.java
index b61a595094..01dce277e1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/EqualTo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/EqualTo.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import com.google.common.base.Preconditions;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
index a16638326e..70d5a53805 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.AbstractTreeNode;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
import org.slf4j.Logger;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThan.java
index 1af6121118..e00889ff2f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThan.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import com.google.common.base.Preconditions;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThanEqual.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThanEqual.java
index 5b4c7fdf44..e0cf57c7c9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThanEqual.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/GreaterThanEqual.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import com.google.common.base.Preconditions;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThan.java
index 87149ff9df..4351cf64b6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThan.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import com.google.common.base.Preconditions;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThanEqual.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThanEqual.java
index 76c6f316d3..85e2d157ab 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThanEqual.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/LessThanEqual.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import com.google.common.base.Preconditions;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Literal.java
index 0d958f38c2..cfad056871 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Literal.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Literal.java
@@ -17,10 +17,9 @@
package org.apache.doris.nereids.trees.expressions;
-import org.apache.doris.analysis.Expr;
-import org.apache.doris.analysis.IntLiteral;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.BooleanType;
import org.apache.doris.nereids.types.DataType;
import org.apache.doris.nereids.types.IntegerType;
@@ -72,21 +71,12 @@ public class Literal extends Expression implements LeafExpression {
}
}
- public Object getValue() {
- return value;
+ public static Literal of(Object value) {
+ return new Literal(value);
}
- /**
- * Convert to legacy literal expression in Doris.
- *
- * @return legacy literal expression in Doris
- */
- public Expr toExpr() {
- if (dataType instanceof IntegerType) {
- return new IntLiteral((Integer) value);
- } else {
- return null;
- }
+ public Object getValue() {
+ return value;
}
@Override
@@ -95,17 +85,13 @@ public class Literal extends Expression implements LeafExpression {
}
@Override
- public boolean nullable() throws UnboundException {
- return value == null;
- }
-
- public static Literal of(Object value) {
- return new Literal(value);
+ public String sql() {
+ return value.toString();
}
@Override
- public boolean isConstant() {
- return true;
+ public boolean nullable() throws UnboundException {
+ return value == null;
}
@Override
@@ -114,8 +100,8 @@ public class Literal extends Expression implements LeafExpression {
}
@Override
- public String sql() {
- return value.toString();
+ public boolean isConstant() {
+ return true;
}
@Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Mod.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Mod.java
index f26e2ffa81..0ff3c95810 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Mod.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Mod.java
@@ -17,6 +17,8 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+
import com.google.common.base.Preconditions;
import java.util.List;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Multiply.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Multiply.java
index 47036cfb39..8dcd98037a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Multiply.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Multiply.java
@@ -17,6 +17,8 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+
import com.google.common.base.Preconditions;
import java.util.List;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java
index 87a873481a..bbbc839ea3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NamedExpressionUtil.java
@@ -26,9 +26,9 @@ public class NamedExpressionUtil {
/**
* Tool class for generate next ExprId.
*/
- private static IdGenerator<ExprId> idIdGenerator = ExprId.createGenerator();
+ private static final IdGenerator<ExprId> ID_GENERATOR = ExprId.createGenerator();
public static ExprId newExprId() {
- return idIdGenerator.getNextId();
+ return ID_GENERATOR.getNextId();
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Not.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Not.java
index 88968711c0..3a976991c0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Not.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Not.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import com.google.common.base.Preconditions;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullSafeEqual.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullSafeEqual.java
index 637f33c119..7a72c1ae0d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullSafeEqual.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/NullSafeEqual.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import com.google.common.base.Preconditions;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
index ba4a97eb0d..f4bb1269c3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotReference.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.expressions;
import org.apache.doris.catalog.Column;
import org.apache.doris.nereids.trees.NodeType;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
import com.google.common.base.Preconditions;
@@ -124,9 +125,8 @@ public class SlotReference extends Slot {
return Objects.hash(exprId, name, qualifier, nullable);
}
- // TODO: return real org.apache.doris.catalog.Column
public Column getColumn() {
- return null;
+ return new Column(name, dataType.toCatalogDataType());
}
@Override
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Subtract.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Subtract.java
index 1f4e5c08cd..e6c2046103 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Subtract.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Subtract.java
@@ -17,6 +17,8 @@
package org.apache.doris.nereids.trees.expressions;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
+
import com.google.common.base.Preconditions;
import java.util.List;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/AggregateFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/AggregateFunction.java
index 6f80ffd519..8b581a475e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/AggregateFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/AggregateFunction.java
@@ -18,7 +18,7 @@
package org.apache.doris.nereids.trees.expressions.functions;
import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.ExpressionVisitor;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import org.apache.doris.nereids.types.DataType;
/** AggregateFunction. */
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/BoundFunction.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/BoundFunction.java
index 465f5833a8..70a1d60669 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/BoundFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/BoundFunction.java
@@ -20,7 +20,7 @@ package org.apache.doris.nereids.trees.expressions.functions;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.trees.NodeType;
import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.ExpressionVisitor;
+import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
import java.util.List;
import java.util.Objects;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionRewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/DefaultExpressionRewriter.java
similarity index 90%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionRewriter.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/DefaultExpressionRewriter.java
index b46a1d21a8..08ce694b20 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionRewriter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/DefaultExpressionRewriter.java
@@ -6,7 +6,7 @@
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
@@ -15,7 +15,9 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.expressions;
+package org.apache.doris.nereids.trees.expressions.visitor;
+
+import org.apache.doris.nereids.trees.expressions.Expression;
import java.util.ArrayList;
import java.util.List;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/DefaultExpressionVisitor.java
similarity index 90%
copy from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionVisitor.java
copy to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/DefaultExpressionVisitor.java
index c94ead46e8..85c19feea9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionVisitor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/DefaultExpressionVisitor.java
@@ -15,7 +15,9 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.expressions;
+package org.apache.doris.nereids.trees.expressions.visitor;
+
+import org.apache.doris.nereids.trees.expressions.Expression;
/**
* Use the visitor to iterate over all expressions for expression.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
similarity index 77%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionVisitor.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
index 5a6c6517a9..0d054433ee 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/ExpressionVisitor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/ExpressionVisitor.java
@@ -6,7 +6,7 @@
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
@@ -15,12 +15,34 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.expressions;
+package org.apache.doris.nereids.trees.expressions.visitor;
import org.apache.doris.nereids.analyzer.UnboundAlias;
import org.apache.doris.nereids.analyzer.UnboundFunction;
import org.apache.doris.nereids.analyzer.UnboundSlot;
import org.apache.doris.nereids.analyzer.UnboundStar;
+import org.apache.doris.nereids.trees.expressions.Add;
+import org.apache.doris.nereids.trees.expressions.Alias;
+import org.apache.doris.nereids.trees.expressions.Arithmetic;
+import org.apache.doris.nereids.trees.expressions.Between;
+import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
+import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
+import org.apache.doris.nereids.trees.expressions.Divide;
+import org.apache.doris.nereids.trees.expressions.EqualTo;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.GreaterThan;
+import org.apache.doris.nereids.trees.expressions.GreaterThanEqual;
+import org.apache.doris.nereids.trees.expressions.LessThan;
+import org.apache.doris.nereids.trees.expressions.LessThanEqual;
+import org.apache.doris.nereids.trees.expressions.Literal;
+import org.apache.doris.nereids.trees.expressions.Mod;
+import org.apache.doris.nereids.trees.expressions.Multiply;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
+import org.apache.doris.nereids.trees.expressions.Not;
+import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
+import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
+import org.apache.doris.nereids.trees.expressions.Subtract;
import org.apache.doris.nereids.trees.expressions.functions.AggregateFunction;
import org.apache.doris.nereids.trees.expressions.functions.BoundFunction;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/IterationVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/IterationVisitor.java
similarity index 78%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/IterationVisitor.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/IterationVisitor.java
index 34c3baac12..9462da90ce 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/IterationVisitor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/IterationVisitor.java
@@ -15,8 +15,29 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.expressions;
-
+package org.apache.doris.nereids.trees.expressions.visitor;
+
+import org.apache.doris.nereids.trees.expressions.Add;
+import org.apache.doris.nereids.trees.expressions.Alias;
+import org.apache.doris.nereids.trees.expressions.Arithmetic;
+import org.apache.doris.nereids.trees.expressions.Between;
+import org.apache.doris.nereids.trees.expressions.ComparisonPredicate;
+import org.apache.doris.nereids.trees.expressions.CompoundPredicate;
+import org.apache.doris.nereids.trees.expressions.Divide;
+import org.apache.doris.nereids.trees.expressions.EqualTo;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.GreaterThan;
+import org.apache.doris.nereids.trees.expressions.GreaterThanEqual;
+import org.apache.doris.nereids.trees.expressions.LessThan;
+import org.apache.doris.nereids.trees.expressions.LessThanEqual;
+import org.apache.doris.nereids.trees.expressions.Literal;
+import org.apache.doris.nereids.trees.expressions.Mod;
+import org.apache.doris.nereids.trees.expressions.Multiply;
+import org.apache.doris.nereids.trees.expressions.NamedExpression;
+import org.apache.doris.nereids.trees.expressions.Not;
+import org.apache.doris.nereids.trees.expressions.NullSafeEqual;
+import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.Subtract;
import org.apache.doris.nereids.trees.expressions.functions.AggregateFunction;
import org.apache.doris.nereids.trees.expressions.functions.BoundFunction;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotExtractor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/SlotExtractor.java
similarity index 89%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotExtractor.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/SlotExtractor.java
index 68f0b8d2de..a09e57d0a8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/SlotExtractor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/visitor/SlotExtractor.java
@@ -15,7 +15,11 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.expressions;
+package org.apache.doris.nereids.trees.expressions.visitor;
+
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
import com.clearspring.analytics.util.Lists;
import com.google.common.collect.Sets;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java
index 24ae434f5f..92bbe79651 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DataType.java
@@ -23,6 +23,7 @@ import org.apache.doris.catalog.MultiRowType;
import org.apache.doris.catalog.ScalarType;
import org.apache.doris.catalog.StructType;
import org.apache.doris.catalog.Type;
+import org.apache.doris.nereids.exceptions.AnalysisException;
/**
* Abstract class for all data type in Nereids.
@@ -30,6 +31,7 @@ import org.apache.doris.catalog.Type;
public abstract class DataType {
/**
* Convert data type in Doris catalog to data type in Nereids.
+ * TODO: throw exception when cannot convert catalog type to Nereids type
*
* @param catalogType data type in Doris catalog
* @return data type in Nereids
@@ -38,27 +40,33 @@ public abstract class DataType {
if (catalogType instanceof ScalarType) {
ScalarType scalarType = (ScalarType) catalogType;
switch (scalarType.getPrimitiveType()) {
+ case BOOLEAN:
+ return BooleanType.INSTANCE;
case INT:
return IntegerType.INSTANCE;
case BIGINT:
return BigIntType.INSTANCE;
case DOUBLE:
return DoubleType.INSTANCE;
+ case VARCHAR:
+ return VarcharType.createVarcharType(scalarType.getLength());
case STRING:
return StringType.INSTANCE;
+ case NULL_TYPE:
+ return NullType.INSTANCE;
default:
- return null;
+ throw new AnalysisException("Nereids do not support type: " + scalarType.getPrimitiveType());
}
} else if (catalogType instanceof MapType) {
- return null;
+ throw new AnalysisException("Nereids do not support map type.");
} else if (catalogType instanceof StructType) {
- return null;
+ throw new AnalysisException("Nereids do not support struct type.");
} else if (catalogType instanceof ArrayType) {
- return null;
+ throw new AnalysisException("Nereids do not support array type.");
} else if (catalogType instanceof MultiRowType) {
- return null;
+ throw new AnalysisException("Nereids do not support multi row type.");
} else {
- return null;
+ throw new AnalysisException("Nereids do not support type: " + catalogType);
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/VarcharType.java
similarity index 63%
rename from fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionVisitor.java
rename to fe/fe-core/src/main/java/org/apache/doris/nereids/types/VarcharType.java
index c94ead46e8..ef8abf89d9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/DefaultExpressionVisitor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/VarcharType.java
@@ -15,17 +15,27 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.doris.nereids.trees.expressions;
+package org.apache.doris.nereids.types;
+
+import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.Type;
/**
- * Use the visitor to iterate over all expressions for expression.
+ * Varchar type in Nereids.
*/
-public class DefaultExpressionVisitor<R, C> extends ExpressionVisitor<R, C> {
+public class VarcharType extends DataType {
+ private final int len;
+
+ public VarcharType(int len) {
+ this.len = len;
+ }
+
+ public static VarcharType createVarcharType(int len) {
+ return new VarcharType(len);
+ }
+
@Override
- public R visit(Expression expr, C context) {
- for (Expression child : expr.children()) {
- child.accept(this, context);
- }
- return null;
+ public Type toCatalogDataType() {
+ return ScalarType.createVarcharType(len);
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
index 923c6b0d81..7df0cc38de 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
@@ -357,8 +357,16 @@ public class OlapScanNode extends ScanNode {
}
}
+ /**
+ * Init OlapScanNode, ONLY used for Nereids. Should NOT use this function in anywhere else.
+ */
public void init() throws UserException {
- computePartitionInfo();
+ selectedPartitionNum = selectedPartitionIds.size();
+ try {
+ getScanRangeLocations();
+ } catch (AnalysisException e) {
+ throw new UserException(e.getMessage());
+ }
}
/**
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
index fcf5f8787a..4c0c871066 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
@@ -61,9 +61,9 @@ import org.apache.logging.log4j.Logger;
import java.io.IOException;
import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousCloseException;
+import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.UUID;
@@ -173,20 +173,13 @@ public class ConnectProcessor {
private void handleQuery() {
MetricRepo.COUNTER_REQUEST_ALL.increase(1L);
// convert statement to Java string
- String originStmt = null;
- try {
- byte[] bytes = packetBuf.array();
- int ending = packetBuf.limit() - 1;
- while (ending >= 1 && bytes[ending] == '\0') {
- ending--;
- }
- originStmt = new String(bytes, 1, ending, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- // impossible
- LOG.error("UTF8 is not supported in this environment.");
- ctx.getState().setError(ErrorCode.ERR_UNKNOWN_CHARACTER_SET, "Unsupported character set(UTF-8)");
- return;
+ byte[] bytes = packetBuf.array();
+ int ending = packetBuf.limit() - 1;
+ while (ending >= 1 && bytes[ending] == '\0') {
+ ending--;
}
+ String originStmt = new String(bytes, 1, ending, StandardCharsets.UTF_8);
+
String sqlHash = DigestUtils.md5Hex(originStmt);
ctx.setSqlHash(sqlHash);
ctx.getAuditEventBuilder().reset();
@@ -208,11 +201,14 @@ public class ConnectProcessor {
try {
stmts = nereidsParser.parseSQL(originStmt);
} catch (Exception e) {
- LOG.warn("SQL : {}, parse failed by new parser", originStmt, e);
+ // TODO: We should catch all exception here until we support all query syntax.
+ LOG.warn(" Fallback to stale planner."
+ + " Nereids cannot process this statement: \"{}\".", originStmt, e);
}
}
+ // stmts == null when Nereids cannot planner this query or Nereids is disabled.
if (stmts == null) {
- stmts = analyze(originStmt);
+ stmts = parse(originStmt);
}
for (int i = 0; i < stmts.size(); ++i) {
alreadyAddedToAuditInfoList = false;
@@ -272,7 +268,7 @@ public class ConnectProcessor {
}
// analyze the origin stmt and return multi-statements
- private List<StatementBase> analyze(String originStmt) throws AnalysisException, DdlException {
+ private List<StatementBase> parse(String originStmt) throws AnalysisException, DdlException {
LOG.debug("the originStmts are: {}", originStmt);
// Parse statement with parser generated by CUP&FLEX
SqlScanner input = new SqlScanner(new StringReader(originStmt), ctx.getSessionVariable().getSqlMode());
@@ -297,16 +293,10 @@ public class ConnectProcessor {
}
// Get the column definitions of a table
+ @SuppressWarnings("rawtypes")
private void handleFieldList() throws IOException {
// Already get command code.
- String tableName = null;
- try {
- tableName = new String(MysqlProto.readNulTerminateString(packetBuf), "UTF-8");
- } catch (UnsupportedEncodingException e) {
- // Impossible!!!
- LOG.error("Unknown UTF-8 character set.");
- return;
- }
+ String tableName = new String(MysqlProto.readNulTerminateString(packetBuf), StandardCharsets.UTF_8);
if (Strings.isNullOrEmpty(tableName)) {
ctx.getState().setError(ErrorCode.ERR_UNKNOWN_TABLE, "Empty tableName");
return;
@@ -395,7 +385,7 @@ public class ConnectProcessor {
// When any request is completed, it will generally need to send a response packet to the client
// This method is used to send a response packet to the client
private void finalizeCommand() throws IOException {
- ByteBuffer packet = null;
+ ByteBuffer packet;
if (executor != null && executor.isForwardToMaster()
&& ctx.getState().getStateType() != QueryState.MysqlStateType.ERR) {
ShowResultSet resultSet = executor.getShowResultSet();
@@ -520,7 +510,7 @@ public class ConnectProcessor {
) {
result.setQueryId(ctx.queryId());
}
- result.setMaxJournalId(Catalog.getCurrentCatalog().getMaxJournalId().longValue());
+ result.setMaxJournalId(Catalog.getCurrentCatalog().getMaxJournalId());
result.setPacket(getResultPacket());
if (executor != null && executor.getProxyResultSet() != null) {
result.setResultSet(executor.getProxyResultSet().tothrift());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 26fe08b4d1..0957826bf6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -979,8 +979,13 @@ public class SessionVariable implements Serializable, Writable {
this.enableArrayType = enableArrayType;
}
+ /**
+ * Nereids only support vectorized engine.
+ *
+ * @return true if both nereids and vectorized engine are enabled
+ */
public boolean isEnableNereids() {
- return enableNereids;
+ return enableNereids && enableVectorizedEngine;
}
public void setEnableNereids(boolean enableNereids) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index b50f77fb3e..34321cee03 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -31,6 +31,7 @@ import org.apache.doris.analysis.LiteralExpr;
import org.apache.doris.analysis.LockTablesStmt;
import org.apache.doris.analysis.NullLiteral;
import org.apache.doris.analysis.OutFileClause;
+import org.apache.doris.analysis.Queriable;
import org.apache.doris.analysis.QueryStmt;
import org.apache.doris.analysis.RedirectStatus;
import org.apache.doris.analysis.SelectListItem;
@@ -88,7 +89,7 @@ import org.apache.doris.mysql.MysqlEofPacket;
import org.apache.doris.mysql.MysqlSerializer;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.nereids.NereidsPlanner;
-import org.apache.doris.nereids.trees.plans.logical.LogicalPlanAdapter;
+import org.apache.doris.nereids.glue.LogicalPlanAdapter;
import org.apache.doris.planner.OlapScanNode;
import org.apache.doris.planner.OriginalPlanner;
import org.apache.doris.planner.Planner;
@@ -301,6 +302,20 @@ public class StmtExecutor implements ProfileWriter {
return parsedStmt != null && parsedStmt instanceof QueryStmt;
}
+ /**
+ * Used for audit in ConnectProcessor.
+ *
+ * TODO: There are three interface in StatementBase be called when doing audit:
+ * toDigest needAuditEncryption when parsedStmt is not a query
+ * and isValuesOrConstantSelect when parsedStmt is instance of InsertStmt.
+ * toDigest: is used to compute Statement fingerprint for blocking some queries
+ * needAuditEncryption: when this interface return true,
+ * log statement use toSql function instead of log original string
+ * isValuesOrConstantSelect: when this interface return true, original string is truncated at 1024
+ *
+ * @return parsed and analyzed statement for Stale planner.
+ * an unresolved LogicalPlan wrapped with a LogicalPlanAdapter for Nereids.
+ */
public StatementBase getParsedStmt() {
return parsedStmt;
}
@@ -359,9 +374,9 @@ public class StmtExecutor implements ProfileWriter {
parsedStmt.analyze(analyzer);
}
- if (parsedStmt instanceof QueryStmt) {
+ if (parsedStmt instanceof QueryStmt || parsedStmt instanceof LogicalPlanAdapter) {
context.getState().setIsQuery(true);
- if (!((QueryStmt) parsedStmt).isExplain()) {
+ if (!parsedStmt.isExplain()) {
// sql/sqlHash block
try {
Catalog.getCurrentCatalog().getSqlBlockRuleMgr().matchSql(
@@ -400,7 +415,7 @@ public class StmtExecutor implements ProfileWriter {
}
handleQueryStmt();
// explain query stmt do not have profile
- if (!((QueryStmt) parsedStmt).isExplain()) {
+ if (!parsedStmt.isExplain()) {
writeProfile(true);
}
break;
@@ -509,6 +524,11 @@ public class StmtExecutor implements ProfileWriter {
}
}
+ /**
+ * get variables in stmt.
+ * TODO: only support select stmt now. need to support Nereids.
+ * @throws DdlException
+ */
private void analyzeVariablesInStmt() throws DdlException {
SessionVariable sessionVariable = context.getSessionVariable();
if (parsedStmt != null && parsedStmt instanceof SelectStmt) {
@@ -573,7 +593,8 @@ public class StmtExecutor implements ProfileWriter {
if (parsedStmt instanceof QueryStmt
|| parsedStmt instanceof InsertStmt
- || parsedStmt instanceof CreateTableAsSelectStmt) {
+ || parsedStmt instanceof CreateTableAsSelectStmt
+ || parsedStmt instanceof LogicalPlanAdapter) {
Map<Long, TableIf> tableMap = Maps.newTreeMap();
QueryStmt queryStmt;
Set<String> parentViewNameSet = Sets.newHashSet();
@@ -584,7 +605,7 @@ public class StmtExecutor implements ProfileWriter {
CreateTableAsSelectStmt parsedStmt = (CreateTableAsSelectStmt) this.parsedStmt;
queryStmt = parsedStmt.getQueryStmt();
queryStmt.getTables(analyzer, tableMap, parentViewNameSet);
- } else {
+ } else if (parsedStmt instanceof InsertStmt) {
InsertStmt insertStmt = (InsertStmt) parsedStmt;
insertStmt.getTables(analyzer, tableMap, parentViewNameSet);
}
@@ -748,7 +769,9 @@ public class StmtExecutor implements ProfileWriter {
} else {
planner = new OriginalPlanner(analyzer);
}
- if (parsedStmt instanceof QueryStmt || parsedStmt instanceof InsertStmt) {
+ if (parsedStmt instanceof QueryStmt
+ || parsedStmt instanceof InsertStmt
+ || parsedStmt instanceof LogicalPlanAdapter) {
planner.plan(parsedStmt, tQueryOptions);
}
// TODO(zc):
@@ -915,7 +938,7 @@ public class StmtExecutor implements ProfileWriter {
String columnName = columnLabels.get(i);
if (expr instanceof LiteralExpr) {
columns.add(new Column(columnName, PrimitiveType.VARCHAR));
- data.add(((LiteralExpr) expr).getStringValue());
+ data.add(expr.getStringValue());
} else {
return false;
}
@@ -929,7 +952,7 @@ public class StmtExecutor implements ProfileWriter {
private void handleQueryStmt() throws Exception {
// Every time set no send flag and clean all data in buffer
context.getMysqlChannel().reset();
- QueryStmt queryStmt = (QueryStmt) parsedStmt;
+ Queriable queryStmt = (Queriable) parsedStmt;
QueryDetail queryDetail = new QueryDetail(context.getStartTime(),
DebugUtil.printId(context.queryId()),
@@ -969,7 +992,7 @@ public class StmtExecutor implements ProfileWriter {
}
- private void sendResult(boolean isOutfileQuery, boolean isSendFields, QueryStmt queryStmt, MysqlChannel channel,
+ private void sendResult(boolean isOutfileQuery, boolean isSendFields, Queriable queryStmt, MysqlChannel channel,
CacheAnalyzer cacheAnalyzer, InternalService.PFetchCacheResult cacheResult) throws Exception {
// 1. If this is a query with OUTFILE clause, eg: select * from tbl1 into outfile xxx,
// We will not send real query result to client. Instead, we only send OK to client with
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org