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