This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 6dca968e96a branch-2.1:[fix](planner)Fix the concurrency issue caused 
by Expr setting member… (#52194)
6dca968e96a is described below

commit 6dca968e96a3e06458e3bd2672a2d6bbd475f689
Author: zhangdong <[email protected]>
AuthorDate: Wed Jun 25 11:45:27 2025 +0800

    branch-2.1:[fix](planner)Fix the concurrency issue caused by Expr setting 
member… (#52194)
    
    … variables (#51389)
    
    pick: https://github.com/apache/doris/pull/51389
---
 .../org/apache/doris/analysis/AnalyticExpr.java    |  36 ++++++
 .../org/apache/doris/analysis/AnalyticWindow.java  |  34 ++++++
 .../org/apache/doris/analysis/ArithmeticExpr.java  |  13 ++
 .../org/apache/doris/analysis/ArrayLiteral.java    |  11 ++
 .../apache/doris/analysis/BetweenPredicate.java    |  11 ++
 .../org/apache/doris/analysis/BinaryPredicate.java |   9 ++
 .../doris/analysis/BitmapFilterPredicate.java      |  10 ++
 .../org/apache/doris/analysis/BoolLiteral.java     |   8 ++
 .../java/org/apache/doris/analysis/CaseExpr.java   |  25 ++++
 .../java/org/apache/doris/analysis/CastExpr.java   |  19 ++-
 .../org/apache/doris/analysis/ColumnRefExpr.java   |   8 ++
 .../apache/doris/analysis/CompoundPredicate.java   |  14 +++
 .../doris/analysis/CreateMaterializedViewStmt.java |  13 +-
 .../org/apache/doris/analysis/DateLiteral.java     |   8 ++
 .../org/apache/doris/analysis/DecimalLiteral.java  |   8 ++
 .../apache/doris/analysis/DefaultValueExpr.java    |   8 ++
 .../org/apache/doris/analysis/EncryptKeyRef.java   |  10 ++
 .../org/apache/doris/analysis/ExistsPredicate.java |  15 +++
 .../main/java/org/apache/doris/analysis/Expr.java  |  36 +++---
 .../org/apache/doris/analysis/FloatLiteral.java    |   8 ++
 .../apache/doris/analysis/FunctionCallExpr.java    | 134 +++++++++++++++++++++
 .../org/apache/doris/analysis/IPv4Literal.java     |   8 ++
 .../org/apache/doris/analysis/IPv6Literal.java     |   8 ++
 .../apache/doris/analysis/ImportColumnDesc.java    |   2 +-
 .../org/apache/doris/analysis/InPredicate.java     |  17 +++
 .../apache/doris/analysis/InformationFunction.java |   8 ++
 .../java/org/apache/doris/analysis/IntLiteral.java |   8 ++
 .../org/apache/doris/analysis/IsNullPredicate.java |   9 ++
 .../org/apache/doris/analysis/JsonLiteral.java     |   8 ++
 .../doris/analysis/LambdaFunctionCallExpr.java     |  47 ++++++++
 .../apache/doris/analysis/LambdaFunctionExpr.java  |  22 ++++
 .../org/apache/doris/analysis/LargeIntLiteral.java |   8 ++
 .../org/apache/doris/analysis/LikePredicate.java   |   9 ++
 .../org/apache/doris/analysis/MVColumnItem.java    |   2 +-
 .../java/org/apache/doris/analysis/MapLiteral.java |  14 +++
 .../org/apache/doris/analysis/MatchPredicate.java  |   9 ++
 .../java/org/apache/doris/analysis/MaxLiteral.java |   8 ++
 .../org/apache/doris/analysis/NullLiteral.java     |   8 ++
 .../org/apache/doris/analysis/OrderByElement.java  |  25 ++++
 .../org/apache/doris/analysis/PlaceHolderExpr.java |  11 ++
 .../java/org/apache/doris/analysis/SlotRef.java    |  45 ++++++-
 .../org/apache/doris/analysis/StringLiteral.java   |   8 ++
 .../org/apache/doris/analysis/StructLiteral.java   |  10 ++
 .../java/org/apache/doris/analysis/Subquery.java   |   8 ++
 .../doris/analysis/TimestampArithmeticExpr.java    |  41 +++++++
 .../doris/analysis/TupleIsNullPredicate.java       |   8 ++
 .../org/apache/doris/analysis/VariableExpr.java    |  18 +++
 .../org/apache/doris/catalog/AliasFunction.java    |   4 +-
 .../doris/catalog/MaterializedIndexMeta.java       |   2 +-
 .../doris/load/routineload/RoutineLoadJob.java     |  12 +-
 .../mv/AbstractSelectMaterializedIndexRule.java    |   9 +-
 .../mv/SelectMaterializedIndexWithAggregate.java   |   2 +-
 .../trees/expressions/functions/udf/AliasUdf.java  |   2 +-
 .../org/apache/doris/planner/OlapTableSink.java    |   1 -
 .../analysis/CreateMaterializedViewStmtTest.java   |   2 +-
 .../java/org/apache/doris/analysis/ExprTest.java   |  44 +++++--
 .../rules/rewrite/mv/SelectMvIndexTest.java        |  14 +--
 .../org/apache/doris/rewrite/FEFunctionsTest.java  |   5 +-
 58 files changed, 829 insertions(+), 75 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java
index 390d0a349fb..c76f479516c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticExpr.java
@@ -26,6 +26,8 @@ import org.apache.doris.catalog.AggregateFunction;
 import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.TreeNode;
@@ -908,6 +910,40 @@ public class AnalyticExpr extends Expr {
         return sb.toString();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        if (sqlString != null) {
+            return sqlString;
+        }
+        StringBuilder sb = new StringBuilder();
+        sb.append(fnCall.toSql(disableTableName, needExternalSql, tableType, 
table)).append(" OVER (");
+        boolean needsSpace = false;
+        if (!partitionExprs.isEmpty()) {
+            sb.append("PARTITION BY ").append(exprListToSql(partitionExprs));
+            needsSpace = true;
+        }
+        if (!orderByElements.isEmpty()) {
+            List<String> orderByStrings = Lists.newArrayList();
+            for (OrderByElement e : orderByElements) {
+                orderByStrings.add(e.toSql(disableTableName, needExternalSql, 
tableType, table));
+            }
+            if (needsSpace) {
+                sb.append(" ");
+            }
+            sb.append("ORDER BY ").append(Joiner.on(", 
").join(orderByStrings));
+            needsSpace = true;
+        }
+        if (window != null) {
+            if (needsSpace) {
+                sb.append(" ");
+            }
+            sb.append(window.toSql(disableTableName, needExternalSql, 
tableType, table));
+        }
+        sb.append(")");
+        return sb.toString();
+    }
+
     @Override
     public String toDigestImpl() {
         StringBuilder sb = new StringBuilder();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticWindow.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticWindow.java
index 47e756578d8..c2ee5176d5e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticWindow.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyticWindow.java
@@ -20,6 +20,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TAnalyticWindow;
 import org.apache.doris.thrift.TAnalyticWindowBoundary;
@@ -172,6 +174,18 @@ public class AnalyticWindow {
             return sb.toString();
         }
 
+        public String toSql(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+                TableIf table) {
+            StringBuilder sb = new StringBuilder();
+
+            if (expr != null) {
+                sb.append(expr.toSql(disableTableName, needExternalSql, 
tableType, table)).append(" ");
+            }
+
+            sb.append(type.toString());
+            return sb.toString();
+        }
+
         public String toDigest() {
             StringBuilder sb = new StringBuilder();
 
@@ -320,6 +334,26 @@ public class AnalyticWindow {
         return sb.toString();
     }
 
+    public String toSql(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        if (toSqlString != null) {
+            return toSqlString;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        sb.append(type.toString()).append(" ");
+
+        if (rightBoundary == null) {
+            sb.append(leftBoundary.toSql(disableTableName, needExternalSql, 
tableType, table));
+        } else {
+            sb.append("BETWEEN ").append(leftBoundary.toSql(disableTableName, 
needExternalSql, tableType, table))
+                    .append(" AND ");
+            sb.append(rightBoundary.toSql(disableTableName, needExternalSql, 
tableType, table));
+        }
+
+        return sb.toString();
+    }
+
     public String toDigest() {
         StringBuilder sb = new StringBuilder();
         sb.append(type.toString()).append(" ");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java
index 08324a3480a..13b35ed2f7b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java
@@ -26,6 +26,8 @@ import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarFunction;
 import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
@@ -268,6 +270,17 @@ public class ArithmeticExpr extends Expr {
         }
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        if (children.size() == 1) {
+            return op.toString() + " " + getChild(0).toSql(disableTableName, 
needExternalSql, tableType, table);
+        } else {
+            return "(" + getChild(0).toSql(disableTableName, needExternalSql, 
tableType, table) + " " + op.toString()
+                    + " " + getChild(1).toSql(disableTableName, 
needExternalSql, tableType, table) + ")";
+        }
+    }
+
     @Override
     public String toDigestImpl() {
         if (children.size() == 1) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
index 5d4407ea865..199424d1e39 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ArrayLiteral.java
@@ -18,6 +18,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.ArrayType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -118,6 +120,15 @@ public class ArrayLiteral extends LiteralExpr {
         return "[" + StringUtils.join(list, ", ") + "]";
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        List<String> list = new ArrayList<>(children.size());
+        children.forEach(v -> list.add(v.toSqlImpl(disableTableName, 
needExternalSql, tableType, table)));
+
+        return "[" + StringUtils.join(list, ", ") + "]";
+    }
+
     @Override
     public String toDigestImpl() {
         List<String> list = new ArrayList<>(children.size());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BetweenPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BetweenPredicate.java
index 4f24e7fdf01..16500598ca8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BetweenPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BetweenPredicate.java
@@ -20,6 +20,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
 
@@ -88,6 +90,15 @@ public class BetweenPredicate extends Predicate {
                 + children.get(1).toSql() + " AND " + children.get(2).toSql();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        String notStr = (isNotBetween) ? "NOT " : "";
+        return children.get(0).toSql(disableTableName, needExternalSql, 
tableType, table) + " " + notStr + "BETWEEN "
+                + children.get(1).toSql(disableTableName, needExternalSql, 
tableType, table) + " AND " + children.get(2)
+                .toSql(disableTableName, needExternalSql, tableType, table);
+    }
+
     @Override
     public String toDigestImpl() {
         String notStr = (isNotBetween) ? "NOT " : "";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
index 6935578ad30..dd526dc6180 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BinaryPredicate.java
@@ -26,6 +26,8 @@ import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarFunction;
 import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.catalog.TypeUtils;
 import org.apache.doris.common.AnalysisException;
@@ -282,6 +284,13 @@ public class BinaryPredicate extends Predicate implements 
Writable {
         return getChild(0).toSql() + " " + op.toString() + " " + 
getChild(1).toSql();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getChild(0).toSql(disableTableName, needExternalSql, tableType, 
table) + " " + op.toString() + " "
+                + getChild(1).toSql(disableTableName, needExternalSql, 
tableType, table);
+    }
+
     @Override
     public String toDigestImpl() {
         return getChild(0).toDigest() + " " + op.toString() + " " + 
getChild(1).toDigest();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BitmapFilterPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BitmapFilterPredicate.java
index 611506aa97f..bd18aa9aabc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BitmapFilterPredicate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BitmapFilterPredicate.java
@@ -18,6 +18,8 @@
 package org.apache.doris.analysis;
 
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.thrift.TExprNode;
@@ -84,6 +86,14 @@ public class BitmapFilterPredicate extends Predicate {
                 .toSql() + ")";
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        return (notIn ? "not " : "") + "BitmapFilterPredicate(" + 
children.get(0)
+                .toSql(disableTableName, needExternalSql, tableType, table) + 
", " + children.get(1)
+                .toSql(disableTableName, needExternalSql, tableType, table) + 
")";
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         Preconditions.checkArgument(false, "`toThrift` in 
BitmapFilterPredicate should not be reached!");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/BoolLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BoolLiteral.java
index 47d9d2cfbb1..0d5221807d3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BoolLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BoolLiteral.java
@@ -21,6 +21,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -101,6 +103,12 @@ public class BoolLiteral extends LiteralExpr {
         return value ? "TRUE" : "FALSE";
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return value ? "TRUE" : "FALSE";
+    }
+
     @Override
     public String getStringValue() {
         return value ? "1" : "0";
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
index 51feb0bed73..2189c5b1314 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CaseExpr.java
@@ -20,6 +20,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TCaseExpr;
@@ -145,6 +147,29 @@ public class CaseExpr extends Expr {
         return output.toString();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        StringBuilder output = new StringBuilder("CASE");
+        int childIdx = 0;
+        if (hasCaseExpr) {
+            output.append(' ')
+                    .append(children.get(childIdx++).toSql(disableTableName, 
needExternalSql, tableType, table));
+        }
+        while (childIdx + 2 <= children.size()) {
+            output.append(
+                    " WHEN " + 
children.get(childIdx++).toSql(disableTableName, needExternalSql, tableType, 
table));
+            output.append(
+                    " THEN " + 
children.get(childIdx++).toSql(disableTableName, needExternalSql, tableType, 
table));
+        }
+        if (hasElseExpr) {
+            output.append(" ELSE " + children.get(children.size() - 1)
+                    .toSql(disableTableName, needExternalSql, tableType, 
table));
+        }
+        output.append(" END");
+        return output.toString();
+    }
+
     @Override
     public String toDigestImpl() {
         StringBuilder sb = new StringBuilder("CASE");
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
index 1ce183ed4d4..d0aa09b3cdb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CastExpr.java
@@ -27,6 +27,8 @@ import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarFunction;
 import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.catalog.TypeUtils;
 import org.apache.doris.common.AnalysisException;
@@ -215,9 +217,6 @@ public class CastExpr extends Expr {
 
     @Override
     public String toSqlImpl() {
-        if (needExternalSql) {
-            return getChild(0).toSql();
-        }
         if (isAnalyzed) {
             return "CAST(" + getChild(0).toSql() + " AS " + type.toSql() + ")";
         } else {
@@ -226,6 +225,20 @@ public class CastExpr extends Expr {
         }
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType, TableIf table) {
+        if (needExternalSql) {
+            return getChild(0).toSql(disableTableName, needExternalSql, 
tableType, table);
+        }
+        if (isAnalyzed) {
+            return "CAST(" + getChild(0).toSql(disableTableName, 
needExternalSql, tableType, table) + " AS "
+                    + type.toSql() + ")";
+        } else {
+            return "CAST(" + getChild(0).toSql(disableTableName, 
needExternalSql, tableType, table) + " AS "
+                    + (isImplicit ? type.toString() : targetTypeDef.toSql()) + 
")";
+        }
+    }
+
     @Override
     public String toDigestImpl() {
         boolean isVerbose = ConnectContext.get() != null
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java
index f07e6664128..49d5fb13728 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.thrift.TColumnRef;
@@ -93,6 +95,12 @@ public class ColumnRefExpr extends Expr {
         return columnName;
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        return columnName;
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         msg.node_type = TExprNodeType.COLUMN_REF;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
index 8e6b0b31573..16a04a1c7ee 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
@@ -22,6 +22,8 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.ScalarFunction;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
@@ -94,6 +96,18 @@ public class CompoundPredicate extends Predicate {
         }
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        if (children.size() == 1) {
+            Preconditions.checkState(op == Operator.NOT);
+            return "NOT " + getChild(0).toSql(disableTableName, 
needExternalSql, tableType, table);
+        } else {
+            return getChild(0).toSql(disableTableName, needExternalSql, 
tableType, table) + " " + op.toString() + " "
+                    + getChild(1).toSql(disableTableName, needExternalSql, 
tableType, table);
+        }
+    }
+
     @Override
     public String toDigestImpl() {
         if (children.size() == 1) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
index f1b7862df7e..f1769dca38e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java
@@ -272,11 +272,11 @@ public class CreateMaterializedViewStmt extends DdlStmt {
             SelectListItem selectListItem = selectList.getItems().get(i);
 
             Expr selectListItemExpr = selectListItem.getExpr();
-            selectListItemExpr.setDisableTableName(true);
+            selectListItemExpr.disableTableName();
             if (!(selectListItemExpr instanceof SlotRef) && 
!(selectListItemExpr instanceof FunctionCallExpr)
                     && !(selectListItemExpr instanceof ArithmeticExpr)) {
                 throw new AnalysisException("The materialized view only 
support the single column or function expr. "
-                        + "Error column: " + selectListItemExpr.toSql());
+                        + "Error column: " + 
selectListItemExpr.toSqlWithoutTbl());
             }
 
             if (!isReplay && selectListItemExpr.hasAutoInc()) {
@@ -297,14 +297,14 @@ public class CreateMaterializedViewStmt extends DdlStmt {
                 if (!isReplay && selectListItemExpr.containsAggregate()) {
                     throw new AnalysisException(
                             "The materialized view's expr calculations cannot 
be included outside aggregate functions"
-                                    + ", expr: " + selectListItemExpr.toSql());
+                                    + ", expr: " + 
selectListItemExpr.toSqlWithoutTbl());
                 }
                 List<SlotRef> slots = new ArrayList<>();
                 selectListItemExpr.collect(SlotRef.class, slots);
                 if (!isReplay && slots.size() == 0) {
                     throw new AnalysisException(
                             "The materialized view contain constant expr is 
disallowed, expr: "
-                                    + selectListItemExpr.toSql());
+                                    + selectListItemExpr.toSqlWithoutTbl());
                 }
                 if (meetAggregate) {
                     throw new AnalysisException("The aggregate column should 
be after the single column");
@@ -423,7 +423,8 @@ public class CreateMaterializedViewStmt extends DdlStmt {
 
             if (!mvColumnItem.getDefineExpr().equals(orderByElement)) {
                 throw new AnalysisException("The order of columns in order by 
clause must be same as "
-                        + "the order of columns in select list, " + 
mvColumnItem.getDefineExpr().toSql() + " vs "
+                        + "the order of columns in select list, " + 
mvColumnItem.getDefineExpr().toSqlWithoutTbl()
+                        + " vs "
                         + orderByElement.toSql());
             }
             Preconditions.checkState(mvColumnItem.getAggregationType() == 
null);
@@ -604,7 +605,7 @@ public class CreateMaterializedViewStmt extends DdlStmt {
         for (SelectListItem selectListItem : selectList.getItems()) {
             Expr selectListItemExpr = selectListItem.getExpr();
             Expr expr = selectListItemExpr;
-            String name = 
mvColumnBuilder(MaterializedIndexMeta.normalizeName(expr.toSql()));
+            String name = 
mvColumnBuilder(MaterializedIndexMeta.normalizeName(expr.toSqlWithoutTbl()));
             if (selectListItemExpr instanceof FunctionCallExpr) {
                 FunctionCallExpr functionCallExpr = (FunctionCallExpr) 
selectListItemExpr;
                 switch 
(functionCallExpr.getFnName().getFunction().toLowerCase()) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
index 0b90d2da2e0..9f6bdab4485 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
@@ -22,6 +22,8 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -674,6 +676,12 @@ public class DateLiteral extends LiteralExpr {
         return "'" + getStringValue() + "'";
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return "'" + getStringValue() + "'";
+    }
+
     private void fillPaddedValue(char[] buffer, int start, long value, int 
length) {
         int end = start + length;
         for (int i = end - 1; i >= start; i--) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
index feb1e2f91b7..ad3b3fe3cf9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
@@ -19,6 +19,8 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
@@ -271,6 +273,12 @@ public class DecimalLiteral extends NumericLiteralExpr {
         return getStringValue();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getStringValue();
+    }
+
     @Override
     public String getStringValue() {
         return value.toPlainString();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/DefaultValueExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/DefaultValueExpr.java
index 4552e6f84fc..140d798c1a3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DefaultValueExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DefaultValueExpr.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
 
@@ -31,6 +33,12 @@ public class DefaultValueExpr extends Expr {
         return null;
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        return null;
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java
index 01e6ffcc8ef..a9546edca8a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java
@@ -20,6 +20,8 @@ package org.apache.doris.analysis;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.EncryptKey;
 import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.ErrorCode;
@@ -93,6 +95,14 @@ public class EncryptKeyRef extends Expr {
         return sb.toString();
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(encryptKeyName.toSql());
+        return sb.toString();
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         // no operation
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExistsPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExistsPredicate.java
index a0b08430f97..fabcad040fa 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExistsPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExistsPredicate.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.thrift.TExprNode;
 
 import com.google.common.base.Preconditions;
@@ -70,6 +72,19 @@ public class ExistsPredicate extends Predicate {
         return strBuilder.toString();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        StringBuilder strBuilder = new StringBuilder();
+        if (notExists) {
+            strBuilder.append("NOT ");
+
+        }
+        strBuilder.append("EXISTS ");
+        strBuilder.append(getChild(0).toSql(disableTableName, needExternalSql, 
tableType, table));
+        return strBuilder.toString();
+    }
+
     @Override
     public String toDigestImpl() {
         StringBuilder strBuilder = new StringBuilder();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
index 4bba9eef74d..4f675c300b9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
@@ -91,9 +91,6 @@ public abstract class Expr extends TreeNode<Expr> implements 
ParseNode, Cloneabl
     public static final String DEFAULT_EXPR_NAME = "expr";
 
     protected boolean disableTableName = false;
-    protected boolean needExternalSql = false;
-    protected TableType tableType = null;
-    protected TableIf inputTable = null;
 
     // to be used where we can't come up with a better estimate
     public static final double DEFAULT_SELECTIVITY = 0.1;
@@ -916,31 +913,26 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
     }
 
     public String toSql() {
+        if (disableTableName) {
+            return toSqlWithoutTbl();
+        }
         return (printSqlInParens) ? "(" + toSqlImpl() + ")" : toSqlImpl();
     }
 
-    public void setDisableTableName(boolean value) {
-        disableTableName = value;
-        for (Expr child : children) {
-            child.setDisableTableName(value);
-        }
+    public String toSql(boolean disableTableName, boolean needExternalSql, 
TableType tableType, TableIf table) {
+        return (printSqlInParens) ? "(" + toSqlImpl(disableTableName, 
needExternalSql, tableType, table) + ")"
+                : toSqlImpl(disableTableName, needExternalSql, tableType, 
table);
     }
 
-    public void setExternalContext(boolean needExternalSql, TableType 
tableType, TableIf inputTable) {
-        this.needExternalSql = needExternalSql;
-        this.tableType = tableType;
-        this.inputTable = inputTable;
-
+    public void disableTableName() {
+        disableTableName = true;
         for (Expr child : children) {
-            child.setExternalContext(needExternalSql, tableType, inputTable);
+            child.disableTableName();
         }
     }
 
     public String toSqlWithoutTbl() {
-        setDisableTableName(true);
-        String result = toSql();
-        setDisableTableName(false);
-        return result;
+        return toSql(true, false, null, null);
     }
 
     public String toDigest() {
@@ -953,6 +945,9 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
      */
     protected abstract String toSqlImpl();
 
+    protected abstract String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table);
+
     /**
      * !!!!!! Important !!!!!!
      * Subclasses should override this method if
@@ -963,10 +958,7 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
     }
 
     public String toExternalSql(TableType tableType, TableIf table) {
-        setExternalContext(true, tableType, table);
-        String result = toSql();
-        setExternalContext(false, null, null);
-        return result;
+        return toSql(false, true, tableType, table);
     }
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
index 743cf3da82a..fe38f775857 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FloatLiteral.java
@@ -19,6 +19,8 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
@@ -132,6 +134,12 @@ public class FloatLiteral extends NumericLiteralExpr {
         return getStringValue();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getStringValue();
+    }
+
     @Override
     public String getStringValue() {
         // TODO: Here is weird use float to represent TIME type
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 6ef80c193ba..ae3f8f7d3e6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -35,6 +35,8 @@ import org.apache.doris.catalog.ScalarFunction;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.StructField;
 import org.apache.doris.catalog.StructType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.ErrorCode;
@@ -660,6 +662,92 @@ public class FunctionCallExpr extends Expr {
         return sb.toString();
     }
 
+    private String paramsToSql(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("(");
+
+        if (fnParams.isStar()) {
+            sb.append("*");
+        }
+        if (fnParams.isDistinct()) {
+            sb.append("DISTINCT ");
+        }
+        int len = children.size();
+
+        if (fnName.getFunction().equalsIgnoreCase("char")) {
+            for (int i = 1; i < len; ++i) {
+                sb.append(children.get(i).toSql(disableTableName, 
needExternalSql, tableType, table));
+                if (i < len - 1) {
+                    sb.append(", ");
+                }
+            }
+            sb.append(" using ");
+            String encodeType = children.get(0).toSql(disableTableName, 
needExternalSql, tableType, table);
+            if (encodeType.charAt(0) == '\'') {
+                encodeType = encodeType.substring(1, encodeType.length());
+            }
+            if (encodeType.charAt(encodeType.length() - 1) == '\'') {
+                encodeType = encodeType.substring(0, encodeType.length() - 1);
+            }
+            sb.append(encodeType).append(")");
+            return sb.toString();
+        }
+
+        // XXX_diff are used by nereids only
+        if (fnName.getFunction().equalsIgnoreCase("years_diff") || 
fnName.getFunction().equalsIgnoreCase("months_diff")
+                || fnName.getFunction().equalsIgnoreCase("days_diff")
+                || fnName.getFunction().equalsIgnoreCase("hours_diff")
+                || fnName.getFunction().equalsIgnoreCase("minutes_diff")
+                || fnName.getFunction().equalsIgnoreCase("seconds_diff")
+                || fnName.getFunction().equalsIgnoreCase("milliseconds_diff")
+                || fnName.getFunction().equalsIgnoreCase("microseconds_diff")) 
{
+            sb.append(children.get(0).toSql(disableTableName, needExternalSql, 
tableType, table)).append(", ");
+            sb.append(children.get(1).toSql(disableTableName, needExternalSql, 
tableType, table)).append(")");
+            return sb.toString();
+        }
+        // used by nereids END
+
+        if (fnName.getFunction().equalsIgnoreCase("json_array")
+                || fnName.getFunction().equalsIgnoreCase("json_object")
+                || fnName.getFunction().equalsIgnoreCase("json_insert")
+                || fnName.getFunction().equalsIgnoreCase("json_replace")
+                || fnName.getFunction().equalsIgnoreCase("json_set")) {
+            len = len - 1;
+        }
+
+        for (int i = 0; i < len; ++i) {
+            if (i != 0) {
+                if (fnName.getFunction().equalsIgnoreCase("group_concat")
+                        && orderByElements.size() > 0 && i == len - 
orderByElements.size()) {
+                    sb.append(" ");
+                } else {
+                    sb.append(", ");
+                }
+            }
+            if (ConnectContext.get() != null && 
ConnectContext.get().getState().isQuery() && i == 1
+                    && (fnName.getFunction().equalsIgnoreCase("aes_decrypt")
+                    || fnName.getFunction().equalsIgnoreCase("aes_encrypt")
+                    || fnName.getFunction().equalsIgnoreCase("sm4_decrypt")
+                    || fnName.getFunction().equalsIgnoreCase("sm4_encrypt"))) {
+                sb.append("\'***\'");
+                continue;
+            } else if (orderByElements.size() > 0 && i == len - 
orderByElements.size()) {
+                sb.append("ORDER BY ");
+            }
+            sb.append(children.get(i).toSql(disableTableName, needExternalSql, 
tableType, table));
+            if (orderByElements.size() > 0 && i >= len - 
orderByElements.size()) {
+                if (orderByElements.get(i - len + 
orderByElements.size()).getIsAsc()) {
+                    sb.append(" ASC");
+                } else {
+                    sb.append(" DESC");
+                }
+            }
+        }
+        sb.append(")");
+        return sb.toString();
+    }
+
     @Override
     public String toSqlImpl() {
         Expr expr;
@@ -694,6 +782,52 @@ public class FunctionCallExpr extends Expr {
         return sb.toString();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        Expr expr;
+        if (originStmtFnExpr != null) {
+            expr = originStmtFnExpr;
+        } else {
+            expr = this;
+        }
+        StringBuilder sb = new StringBuilder();
+
+        // when function is like or regexp, the expr generated sql should be 
like this
+        // eg: child1 like child2
+        if (fnName.getFunction().equalsIgnoreCase("like")
+                || fnName.getFunction().equalsIgnoreCase("regexp")) {
+            sb.append(children.get(0).toSql(disableTableName, needExternalSql, 
tableType, table));
+            sb.append(" ");
+            sb.append(((FunctionCallExpr) expr).fnName);
+            sb.append(" ");
+            sb.append(children.get(1).toSql(disableTableName, needExternalSql, 
tableType, table));
+        } else if (fnName.getFunction().equalsIgnoreCase("encryptkeyref")) {
+            sb.append("key ");
+            for (int i = 0; i < children.size(); i++) {
+                String str = ((StringLiteral) children.get(i)).getValue();
+                if (str.isEmpty()) {
+                    continue;
+                }
+                sb.append(str);
+                sb.append(".");
+            }
+            sb.deleteCharAt(sb.length() - 1);
+        } else {
+            sb.append(((FunctionCallExpr) expr).fnName);
+            sb.append(paramsToSql(disableTableName, needExternalSql, 
tableType, table));
+            if (fnName.getFunction().equalsIgnoreCase("json_quote")
+                    || fnName.getFunction().equalsIgnoreCase("json_array")
+                    || fnName.getFunction().equalsIgnoreCase("json_object")
+                    || fnName.getFunction().equalsIgnoreCase("json_insert")
+                    || fnName.getFunction().equalsIgnoreCase("json_replace")
+                    || fnName.getFunction().equalsIgnoreCase("json_set")) {
+                return forJSON(sb.toString());
+            }
+        }
+        return sb.toString();
+    }
+
     private String paramsToDigest() {
         StringBuilder sb = new StringBuilder();
         sb.append("(");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/IPv4Literal.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/IPv4Literal.java
index 2d83a247ff9..8e708c93345 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IPv4Literal.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IPv4Literal.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -115,6 +117,12 @@ public class IPv4Literal extends LiteralExpr {
         return "\"" + getStringValue() + "\"";
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        return "\"" + getStringValue() + "\"";
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         msg.node_type = TExprNodeType.IPV4_LITERAL;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/IPv6Literal.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/IPv6Literal.java
index ad5023934ce..e69ff34c78a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IPv6Literal.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IPv6Literal.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -81,6 +83,12 @@ public class IPv6Literal extends LiteralExpr {
         return "\"" + getStringValue() + "\"";
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        return "\"" + getStringValue() + "\"";
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         msg.node_type = TExprNodeType.IPV6_LITERAL;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ImportColumnDesc.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ImportColumnDesc.java
index 13040bdcb5c..cd98236d40d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ImportColumnDesc.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ImportColumnDesc.java
@@ -77,7 +77,7 @@ public class ImportColumnDesc {
         StringBuilder sb = new StringBuilder();
         sb.append(columnName);
         if (expr != null) {
-            sb.append("=").append(expr.toSql());
+            sb.append("=").append(expr.toSqlWithoutTbl());
         }
         return sb.toString();
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
index ed040efcbe4..89085da976e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
@@ -25,6 +25,8 @@ import org.apache.doris.catalog.Function.NullableMode;
 import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarFunction;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Reference;
@@ -279,6 +281,21 @@ public class InPredicate extends Predicate {
         return strBuilder.toString();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        StringBuilder strBuilder = new StringBuilder();
+        String notStr = (isNotIn) ? "NOT " : "";
+        strBuilder.append(
+                getChild(0).toSql(disableTableName, needExternalSql, 
tableType, table) + " " + notStr + "IN (");
+        for (int i = 1; i < children.size(); ++i) {
+            strBuilder.append(getChild(i).toSql(disableTableName, 
needExternalSql, tableType, table));
+            strBuilder.append((i + 1 != children.size()) ? ", " : "");
+        }
+        strBuilder.append(")");
+        return strBuilder.toString();
+    }
+
     @Override
     public String toDigestImpl() {
         StringBuilder strBuilder = new StringBuilder();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java
index fba837ee66c..84ed70a3d6f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/InformationFunction.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.cluster.ClusterNamespace;
 import org.apache.doris.common.AnalysisException;
@@ -91,6 +93,12 @@ public class InformationFunction extends Expr {
         return funcType + "()";
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return funcType + "()";
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (this == obj) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
index 3c0d9abc344..1e5a09f7bfd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IntLiteral.java
@@ -18,6 +18,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -300,6 +302,12 @@ public class IntLiteral extends NumericLiteralExpr {
         return getStringValue();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getStringValue();
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         msg.node_type = TExprNodeType.INT_LITERAL;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
index 11a53ea5565..5a62cf812bc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/IsNullPredicate.java
@@ -24,6 +24,8 @@ import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.Function.NullableMode;
 import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.ScalarFunction;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
@@ -106,6 +108,13 @@ public class IsNullPredicate extends Predicate {
         return getChild(0).toSql() + (isNotNull ? " IS NOT NULL" : " IS NULL");
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getChild(0).toSql(disableTableName, needExternalSql, tableType, 
table) + (isNotNull ? " IS NOT NULL"
+                : " IS NULL");
+    }
+
     @Override
     public String toDigestImpl() {
         return getChild(0).toDigest() + (isNotNull ? " IS NOT NULL" : " IS 
NULL");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/JsonLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/JsonLiteral.java
index f0d0816484a..f8120338495 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/JsonLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/JsonLiteral.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -83,6 +85,12 @@ public class JsonLiteral extends LiteralExpr {
         return false;
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return "'" + value.replaceAll("'", "''") + "'";
+    }
+
     @Override
     public String toSqlImpl() {
         return "'" + value.replaceAll("'", "''") + "'";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java
index 5b908493a7c..fe28b0d4d61 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java
@@ -20,6 +20,8 @@ package org.apache.doris.analysis;
 import org.apache.doris.catalog.ArrayType;
 import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.Function.NullableMode;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
@@ -347,4 +349,49 @@ public class LambdaFunctionCallExpr extends 
FunctionCallExpr {
         sb.append(")");
         return sb.toString();
     }
+
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        StringBuilder sb = new StringBuilder();
+
+        String fnName = getFnName().getFunction();
+        if (fn != null) {
+            // `array_last` will be replaced with `element_at` function after 
analysis.
+            // At this moment, using the name `array_last` would generate 
invalid SQL.
+            fnName = fn.getFunctionName().getFunction();
+        }
+        sb.append(fnName);
+        sb.append("(");
+        int childSize = children.size();
+        Expr lastExpr = getChild(childSize - 1);
+        // eg: select array_map(x->x>10, k1) from table,
+        // but we need analyze each param, so change the function like this in 
parser
+        // array_map(x->x>10, k1) ---> array_map(k1, x->x>10),
+        // so maybe the lambda expr is the end position. and need this check.
+        boolean lastIsLambdaExpr = (lastExpr instanceof LambdaFunctionExpr);
+        if (lastIsLambdaExpr) {
+            sb.append(lastExpr.toSql(disableTableName, needExternalSql, 
tableType, table));
+            sb.append(", ");
+        }
+        for (int i = 0; i < childSize - 1; ++i) {
+            sb.append(getChild(i).toSql(disableTableName, needExternalSql, 
tableType, table));
+            if (i != childSize - 2) {
+                sb.append(", ");
+            }
+        }
+        // and some functions is only implement as a normal array function;
+        // but also want use as lambda function, select 
array_sortby(x->x,['b','a','c']);
+        // so we convert to: array_sortby(array('b', 'a', 'c'), array_map(x -> 
`x`, array('b', 'a', 'c')))
+        if (!lastIsLambdaExpr) {
+            if (childSize > 1) {
+                // some functions don't have lambda expr, so don't need to add 
","
+                // such as array_exists(array_map(x->x>3, [1,2,3,6,34,3,11]))
+                sb.append(", ");
+            }
+            sb.append(lastExpr.toSql(disableTableName, needExternalSql, 
tableType, table));
+        }
+        sb.append(")");
+        return sb.toString();
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionExpr.java
index ce958040579..515b0ae7f4e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LambdaFunctionExpr.java
@@ -18,6 +18,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.ArrayType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
@@ -137,6 +139,26 @@ public class LambdaFunctionExpr extends Expr {
         return res;
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        String nameStr = "";
+        Expr lambdaExpr = slotExpr.get(0);
+        int exprSize = names.size();
+        for (int i = 0; i < exprSize; ++i) {
+            nameStr = nameStr + names.get(i);
+            if (i != exprSize - 1) {
+                nameStr = nameStr + ",";
+            }
+        }
+        if (exprSize > 1) {
+            nameStr = "(" + nameStr + ")";
+        }
+        String res = String.format("%s -> %s", nameStr,
+                lambdaExpr.toSql(disableTableName, needExternalSql, tableType, 
table));
+        return res;
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         msg.setNodeType(TExprNodeType.LAMBDA_FUNCTION_EXPR);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
index 797fee180f7..0134e2dbb62 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java
@@ -18,6 +18,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -212,6 +214,12 @@ public class LargeIntLiteral extends NumericLiteralExpr {
         return getStringValue();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getStringValue();
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         msg.node_type = TExprNodeType.LARGE_INT_LITERAL;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java
index e81772d8744..ba3021def4e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LikePredicate.java
@@ -23,6 +23,8 @@ package org.apache.doris.analysis;
 import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.ScalarFunction;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
@@ -108,6 +110,13 @@ public class LikePredicate extends Predicate {
         return getChild(0).toSql() + " " + op.toString() + " " + 
getChild(1).toSql();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getChild(0).toSql(disableTableName, needExternalSql, tableType, 
table) + " " + op.toString() + " "
+                + getChild(1).toSql(disableTableName, needExternalSql, 
tableType, table);
+    }
+
     @Override
     public String toDigestImpl() {
         return getChild(0).toDigest() + " " + op.toString() + " " + 
getChild(1).toDigest();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/MVColumnItem.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVColumnItem.java
index a9e11458582..e1439450d64 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/MVColumnItem.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/MVColumnItem.java
@@ -87,7 +87,7 @@ public class MVColumnItem {
     }
 
     public MVColumnItem(Expr defineExpr) throws AnalysisException {
-        this.name = 
CreateMaterializedViewStmt.mvColumnBuilder(defineExpr.toSql());
+        this.name = 
CreateMaterializedViewStmt.mvColumnBuilder(defineExpr.toSqlWithoutTbl());
 
         if (this.name == null) {
             throw new AnalysisException("defineExpr.toSql() is null");
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/MapLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MapLiteral.java
index 03441eeb1f6..cf8e837252d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/MapLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/MapLiteral.java
@@ -18,6 +18,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.MapType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -206,6 +208,18 @@ public class MapLiteral extends LiteralExpr {
         return "MAP{" + StringUtils.join(list, ", ") + "}";
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        List<String> list = new ArrayList<>(children.size());
+        for (int i = 0; i < children.size() && i + 1 < children.size(); i += 
2) {
+            list.add(
+                    children.get(i).toSqlImpl(disableTableName, 
needExternalSql, tableType, table) + ":" + children.get(
+                            i + 1).toSqlImpl(disableTableName, 
needExternalSql, tableType, table));
+        }
+        return "MAP{" + StringUtils.join(list, ", ") + "}";
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         msg.node_type = TExprNodeType.MAP_LITERAL;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/MatchPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MatchPredicate.java
index e7149f13437..f19b96a97b9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/MatchPredicate.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/MatchPredicate.java
@@ -24,6 +24,8 @@ import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.Index;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.ScalarFunction;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
@@ -215,6 +217,13 @@ public class MatchPredicate extends Predicate {
         return getChild(0).toSql() + " " + op.toString() + " " + 
getChild(1).toSql();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getChild(0).toSql(disableTableName, needExternalSql, tableType, 
table) + " " + op.toString() + " "
+                + getChild(1).toSql(disableTableName, needExternalSql, 
tableType, table);
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         msg.node_type = TExprNodeType.MATCH_PRED;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/MaxLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/MaxLiteral.java
index 3fd79667b4a..72e589b5d78 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/MaxLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/MaxLiteral.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.FormatOptions;
 import org.apache.doris.thrift.TExprNode;
 
@@ -59,6 +61,12 @@ public final class MaxLiteral extends LiteralExpr {
         return "MAXVALUE";
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return "MAXVALUE";
+    }
+
     @Override
     public String toString() {
         return toSql();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/NullLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/NullLiteral.java
index 1ba5a43b4ee..2f5dedaa6a9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/NullLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/NullLiteral.java
@@ -21,6 +21,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -98,6 +100,12 @@ public class NullLiteral extends LiteralExpr {
         return getStringValue();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return getStringValue();
+    }
+
     @Override
     public String getStringValue() {
         return "NULL";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/OrderByElement.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/OrderByElement.java
index 39b8bd328d3..ca5c3a782b7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/OrderByElement.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/OrderByElement.java
@@ -20,6 +20,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 
 import com.google.common.collect.Lists;
@@ -137,6 +139,29 @@ public class OrderByElement {
         return strBuilder.toString();
     }
 
+    public String toSql(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        StringBuilder strBuilder = new StringBuilder();
+        strBuilder.append(expr.toSql(disableTableName, needExternalSql, 
tableType, table));
+        strBuilder.append(isAsc ? " ASC" : " DESC");
+
+        // When ASC and NULLS LAST or DESC and NULLS FIRST, we do not print 
NULLS FIRST/LAST
+        // because it is the default behavior and we want to avoid printing 
NULLS FIRST/LAST
+        // whenever possible as it is incompatible with Hive (SQL 
compatibility with Hive is
+        // important for views).
+        if (nullsFirstParam != null) {
+            if (isAsc && nullsFirstParam) {
+                // If ascending, nulls are last by default, so only add if 
nulls first.
+                strBuilder.append(" NULLS FIRST");
+            } else if (!isAsc && !nullsFirstParam) {
+                // If descending, nulls are first by default, so only add if 
nulls last.
+                strBuilder.append(" NULLS LAST");
+            }
+        }
+
+        return strBuilder.toString();
+    }
+
     public String toDigest() {
         StringBuilder strBuilder = new StringBuilder();
         strBuilder.append(expr.toDigest());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/PlaceHolderExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/PlaceHolderExpr.java
index 06a02853a6e..fb5acbf7476 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/PlaceHolderExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/PlaceHolderExpr.java
@@ -19,6 +19,8 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.MysqlColType;
 import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -189,6 +191,15 @@ public class PlaceHolderExpr extends LiteralExpr {
         return "_placeholder_(" + this.lExpr.toSqlImpl() + ")";
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        if (this.lExpr == null) {
+            return "?";
+        }
+        return "_placeholder_(" + this.lExpr.toSqlImpl(disableTableName, 
needExternalSql, tableType, table) + ")";
+    }
+
     // @Override
     public Expr reset() {
         this.lExpr = null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
index 92f5224e0bc..70cf383db6c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
@@ -239,8 +239,49 @@ public class SlotRef extends Expr {
 
     @Override
     public String toSqlImpl() {
+        StringBuilder sb = new StringBuilder();
+        String subColumnPaths = "";
+        if (subColPath != null && !subColPath.isEmpty()) {
+            subColumnPaths = "." + String.join(".", subColPath);
+        }
+        if (tblName != null) {
+            return tblName.toSql() + "." + label + subColumnPaths;
+        } else if (label != null) {
+            if (ConnectContext.get() != null
+                    && ConnectContext.get().getState().isNereids()
+                    && !ConnectContext.get().getState().isQuery()
+                    && ConnectContext.get().getSessionVariable() != null
+                    && desc != null) {
+                return label + "[#" + desc.getId().asInt() + "]";
+            } else {
+                return label;
+            }
+        } else if (desc == null) {
+            // virtual slot of an alias function
+            // when we try to translate an alias function to Nereids style, 
the desc in the place holding slotRef
+            // is null, and we just need the name of col.
+            return "`" + col + "`";
+        } else if (desc.getSourceExprs() != null) {
+            if ((ToSqlContext.get() == null || 
ToSqlContext.get().isNeedSlotRefId())) {
+                if (desc.getId().asInt() != 1) {
+                    sb.append("<slot " + desc.getId().asInt() + ">");
+                }
+            }
+            for (Expr expr : desc.getSourceExprs()) {
+                sb.append(" ");
+                sb.append(expr.toSql());
+            }
+            return sb.toString();
+        } else {
+            return "<slot " + desc.getId().asInt() + ">" + sb.toString();
+        }
+    }
+
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf inputTable) {
         if (needExternalSql) {
-            return toExternalSqlImpl();
+            return toExternalSqlImpl(tableType, inputTable);
         }
 
         if (disableTableName && label != null) {
@@ -288,7 +329,7 @@ public class SlotRef extends Expr {
         }
     }
 
-    private String toExternalSqlImpl() {
+    private String toExternalSqlImpl(TableType tableType, TableIf inputTable) {
         if (col != null) {
             if (tableType.equals(TableType.JDBC_EXTERNAL_TABLE) || 
tableType.equals(TableType.JDBC) || tableType
                     .equals(TableType.ODBC)) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
index 2284e9e547c..1624c022aee 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StringLiteral.java
@@ -21,6 +21,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.PrimitiveType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
@@ -134,6 +136,12 @@ public class StringLiteral extends LiteralExpr {
         return "'" + value.replaceAll("'", "''") + "'";
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return "'" + value.replaceAll("'", "''") + "'";
+    }
+
     @Override
     protected void toThrift(TExprNode msg) {
         if (value == null) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
index bee455d79e3..c435fa47dbf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
@@ -19,6 +19,8 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.StructField;
 import org.apache.doris.catalog.StructType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FormatOptions;
@@ -82,6 +84,14 @@ public class StructLiteral extends LiteralExpr {
         return "STRUCT(" + StringUtils.join(list, ", ") + ")";
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        List<String> list = new ArrayList<>(children.size());
+        children.forEach(v -> list.add(v.toSqlImpl(disableTableName, 
needExternalSql, tableType, table)));
+        return "STRUCT(" + StringUtils.join(list, ", ") + ")";
+    }
+
     @Override
     public String toDigestImpl() {
         List<String> list = new ArrayList<>(children.size());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Subquery.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Subquery.java
index f9900b8f606..8d2a440c4d5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Subquery.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Subquery.java
@@ -23,6 +23,8 @@ package org.apache.doris.analysis;
 import org.apache.doris.catalog.MultiRowType;
 import org.apache.doris.catalog.StructField;
 import org.apache.doris.catalog.StructType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.thrift.TExprNode;
@@ -61,6 +63,12 @@ public class Subquery extends Expr {
         return "(" + stmt.toSql() + ")";
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return "(" + stmt.toSql() + ")";
+    }
+
     @Override
     public String toDigestImpl() {
         return "(" + stmt.toDigest() + ")";
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java
index 2a44ddebca2..acb4ec74cb2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java
@@ -22,6 +22,8 @@ import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.Function.NullableMode;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarType;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
@@ -401,6 +403,45 @@ public class TimestampArithmeticExpr extends Expr {
         return strBuilder.toString();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        StringBuilder strBuilder = new StringBuilder();
+        if (funcName != null) {
+            if (funcName.equalsIgnoreCase("TIMESTAMPDIFF") || 
funcName.equalsIgnoreCase("TIMESTAMPADD")) {
+                strBuilder.append(funcName).append("(");
+                strBuilder.append(timeUnitIdent).append(", ");
+                strBuilder.append(getChild(1).toSql(disableTableName, 
needExternalSql, tableType, table)).append(", ");
+                strBuilder.append(getChild(0).toSql(disableTableName, 
needExternalSql, tableType, table)).append(")");
+                return strBuilder.toString();
+            }
+            // Function-call like version.
+            strBuilder.append(funcName).append("(");
+            strBuilder.append(getChild(0).toSql(disableTableName, 
needExternalSql, tableType, table)).append(", ");
+            strBuilder.append("INTERVAL ");
+            strBuilder.append(getChild(1).toSql(disableTableName, 
needExternalSql, tableType, table));
+            strBuilder.append(" ").append(timeUnitIdent);
+            strBuilder.append(")");
+            return strBuilder.toString();
+        }
+        if (intervalFirst) {
+            // Non-function-call like version with interval as first operand.
+            strBuilder.append("INTERVAL ");
+            strBuilder.append(getChild(1).toSql(disableTableName, 
needExternalSql, tableType, table) + " ");
+            strBuilder.append(timeUnitIdent);
+            strBuilder.append(" ").append(op.toString()).append(" ");
+            strBuilder.append(getChild(0).toSql(disableTableName, 
needExternalSql, tableType, table));
+        } else {
+            // Non-function-call like version with interval as second operand.
+            strBuilder.append(getChild(0).toSql(disableTableName, 
needExternalSql, tableType, table));
+            strBuilder.append(" " + op.toString() + " ");
+            strBuilder.append("INTERVAL ");
+            strBuilder.append(getChild(1).toSql(disableTableName, 
needExternalSql, tableType, table) + " ");
+            strBuilder.append(timeUnitIdent);
+        }
+        return strBuilder.toString();
+    }
+
     @Override
     public String toDigestImpl() {
         StringBuilder strBuilder = new StringBuilder();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/TupleIsNullPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TupleIsNullPredicate.java
index 203f0629c8f..9ad88aef7cb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/TupleIsNullPredicate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TupleIsNullPredicate.java
@@ -20,6 +20,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.thrift.TExprNode;
@@ -192,6 +194,12 @@ public class TupleIsNullPredicate extends Predicate {
         return "TupleIsNull(" + Joiner.on(",").join(tupleIds) + ")";
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        return "TupleIsNull(" + Joiner.on(",").join(tupleIds) + ")";
+    }
+
     /**
      * Recursive function that replaces all 'IF(TupleIsNull(), NULL, e)' exprs 
in
      * 'expr' with e and returns the modified expr.
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/VariableExpr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/VariableExpr.java
index 85204952e55..8c5093900fb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/VariableExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/VariableExpr.java
@@ -17,6 +17,8 @@
 
 package org.apache.doris.analysis;
 
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
@@ -203,6 +205,22 @@ public class VariableExpr extends Expr {
         return sb.toString();
     }
 
+    @Override
+    public String toSqlImpl(boolean disableTableName, boolean needExternalSql, 
TableType tableType,
+            TableIf table) {
+        StringBuilder sb = new StringBuilder();
+        if (setType == SetType.USER) {
+            sb.append("@");
+        } else {
+            sb.append("@@");
+            if (setType == SetType.GLOBAL) {
+                sb.append("GLOBAL.");
+            }
+        }
+        sb.append(name);
+        return sb.toString();
+    }
+
     @Override
     public String toString() {
         return toSql();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/AliasFunction.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/AliasFunction.java
index 882689dbfa8..aa20e1362e9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/AliasFunction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/AliasFunction.java
@@ -249,7 +249,7 @@ public class AliasFunction extends Function {
                 .append(" WITH PARAMETER(")
                 .append(getParamsSting(parameters))
                 .append(") AS ")
-                .append(originFunction.toSql())
+                .append(originFunction.toSqlWithoutTbl())
                 .append(";");
         return sb.toString();
     }
@@ -284,7 +284,7 @@ public class AliasFunction extends Function {
         Map<String, String> properties = new HashMap<>();
         properties.put("parameter", getParamsSting(parameters));
         setSlotRefLabel(originFunction);
-        String functionStr = originFunction.toSql();
+        String functionStr = originFunction.toSqlWithoutTbl();
         functionStr = functionStr.replaceAll("'", "`");
         properties.put("origin_function", functionStr);
         return new Gson().toJson(properties);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
index ca52afd3b6d..68cf52a9249 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndexMeta.java
@@ -111,7 +111,7 @@ public class MaterializedIndexMeta implements Writable, 
GsonPostProcessable {
     public void setWhereClause(Expr whereClause) {
         this.whereClause = whereClause;
         if (this.whereClause != null) {
-            this.whereClause.setDisableTableName(true);
+            this.whereClause.disableTableName();
         }
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
 
b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
index 98fc579bf9c..edef9358e00 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
@@ -1635,7 +1635,7 @@ public abstract class RoutineLoadJob extends 
AbstractTxnStateChangeCallback impl
         }
         // 4.3.where_predicates
         if (whereExpr != null) {
-            sb.append("WHERE ").append(whereExpr.toSql()).append(",\n");
+            sb.append("WHERE 
").append(whereExpr.toSqlWithoutTbl()).append(",\n");
         }
         // 4.4.partitions
         if (partitions != null) {
@@ -1643,7 +1643,7 @@ public abstract class RoutineLoadJob extends 
AbstractTxnStateChangeCallback impl
         }
         // 4.5.delete_on_predicates
         if (deleteCondition != null) {
-            sb.append("DELETE ON 
").append(deleteCondition.toSql()).append(",\n");
+            sb.append("DELETE ON 
").append(deleteCondition.toSqlWithoutTbl()).append(",\n");
         }
         // 4.6.source_sequence
         if (sequenceCol != null) {
@@ -1651,7 +1651,7 @@ public abstract class RoutineLoadJob extends 
AbstractTxnStateChangeCallback impl
         }
         // 4.7.preceding_predicates
         if (precedingFilter != null) {
-            sb.append("PRECEDING FILTER 
").append(precedingFilter.toSql()).append(",\n");
+            sb.append("PRECEDING FILTER 
").append(precedingFilter.toSqlWithoutTbl()).append(",\n");
         }
         // remove the last ,
         if (sb.charAt(sb.length() - 2) == ',') {
@@ -1744,8 +1744,8 @@ public abstract class RoutineLoadJob extends 
AbstractTxnStateChangeCallback impl
                 ? STAR_STRING : 
Joiner.on(",").join(partitions.getPartitionNames()));
         jobProperties.put("columnToColumnExpr", columnDescs == null
                 ? STAR_STRING : Joiner.on(",").join(columnDescs.descs));
-        jobProperties.put("precedingFilter", precedingFilter == null ? 
STAR_STRING : precedingFilter.toSql());
-        jobProperties.put("whereExpr", whereExpr == null ? STAR_STRING : 
whereExpr.toSql());
+        jobProperties.put("precedingFilter", precedingFilter == null ? 
STAR_STRING : precedingFilter.toSqlWithoutTbl());
+        jobProperties.put("whereExpr", whereExpr == null ? STAR_STRING : 
whereExpr.toSqlWithoutTbl());
         if (getFormat().equalsIgnoreCase("json")) {
             jobProperties.put(PROPS_FORMAT, "json");
         } else {
@@ -1766,7 +1766,7 @@ public abstract class RoutineLoadJob extends 
AbstractTxnStateChangeCallback impl
         jobProperties.put(LoadStmt.EXEC_MEM_LIMIT, 
String.valueOf(execMemLimit));
         jobProperties.put(LoadStmt.KEY_IN_PARAM_MERGE_TYPE, 
mergeType.toString());
         jobProperties.put(LoadStmt.KEY_IN_PARAM_DELETE_CONDITION,
-                deleteCondition == null ? STAR_STRING : 
deleteCondition.toSql());
+                deleteCondition == null ? STAR_STRING : 
deleteCondition.toSqlWithoutTbl());
         jobProperties.putAll(this.jobProperties);
         Gson gson = new GsonBuilder().disableHtmlEscaping().create();
         return gson.toJson(jobProperties);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java
index 24e6981faf9..24993e1cf00 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java
@@ -169,9 +169,10 @@ public abstract class AbstractSelectMaterializedIndexRule {
         // Here we use toSqlWithoutTbl because the output of toSql() is 
slot#[0] in Nereids
         Set<String> indexConjuncts = 
PlanNode.splitAndCompoundPredicateToConjuncts(meta.getWhereClause()).stream()
                 .map(e -> {
-                    e.setDisableTableName(true);
+                    e.disableTableName();
                     return e;
-                }).map(e -> new 
NereidsParser().parseExpression(e.toSql()).toSql()).collect(Collectors.toSet());
+                }).map(e -> new 
NereidsParser().parseExpression(e.toSqlWithoutTbl()).toSql())
+                .collect(Collectors.toSet());
 
         for (String indexConjunct : indexConjuncts) {
             if (predicateExprSql.contains(indexConjunct)) {
@@ -506,10 +507,10 @@ public abstract class AbstractSelectMaterializedIndexRule 
{
         return new SlotContext(baseSlotToMvSlot, mvNameToMvSlot,
                 
PlanNode.splitAndCompoundPredicateToConjuncts(meta.getWhereClause()).stream()
                         .map(e -> {
-                            e.setDisableTableName(true);
+                            e.disableTableName();
                             return e;
                         })
-                        .map(e -> new 
NereidsParser().parseExpression(e.toSql()))
+                        .map(e -> new 
NereidsParser().parseExpression(e.toSqlWithoutTbl()))
                         .collect(Collectors.toSet()));
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
index 3975d7171b9..0bde801e7e0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java
@@ -1037,7 +1037,7 @@ public class SelectMaterializedIndexWithAggregate extends 
AbstractSelectMaterial
     private PreAggStatus checkPredicates(List<Expression> predicates, 
CheckContext checkContext) {
         Set<String> indexConjuncts = PlanNode
                 
.splitAndCompoundPredicateToConjuncts(checkContext.getMeta().getWhereClause()).stream()
-                .map(e -> new 
NereidsParser().parseExpression(e.toSql()).toSql()).collect(Collectors.toSet());
+                .map(e -> new 
NereidsParser().parseExpression(e.toSqlWithoutTbl()).toSql()).collect(Collectors.toSet());
         return disablePreAggIfContainsAnyValueColumn(
                 predicates.stream().filter(e -> 
!indexConjuncts.contains(e.toSql())).collect(Collectors.toList()),
                 checkContext, "Predicate %s contains value column %s");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdf.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdf.java
index c8b7a3c721a..2b965ca90b2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdf.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdf.java
@@ -80,7 +80,7 @@ public class AliasUdf extends ScalarFunction implements 
ExplicitlyCastableSignat
      * translate catalog alias function to nereids alias function
      */
     public static void translateToNereidsFunction(String dbName, AliasFunction 
function) {
-        String functionSql = function.getOriginFunction().toSql();
+        String functionSql = function.getOriginFunction().toSqlWithoutTbl();
         Expression parsedFunction = new 
NereidsParser().parseExpression(functionSql);
 
         AliasUdf aliasUdf = new AliasUdf(
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java
index 92fc65144ba..b42d9cb1cb5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapTableSink.java
@@ -330,7 +330,6 @@ public class OlapTableSink extends DataSink {
                     || table.getState() == 
OlapTable.OlapTableState.SCHEMA_CHANGE) {
                 throw new AnalysisException("Can't do partial update when 
table is doing schema change.");
             }
-
             for (String s : partialUpdateInputColumns) {
                 schemaParam.addToPartialUpdateInputColumns(s);
             }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateMaterializedViewStmtTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateMaterializedViewStmtTest.java
index 2692b35ab70..0dd1239deee 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateMaterializedViewStmtTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateMaterializedViewStmtTest.java
@@ -356,7 +356,7 @@ public class CreateMaterializedViewStmtTest {
                 selectStmt.analyze(analyzer);
                 selectStmt.getSelectList();
                 result = selectList;
-                slotRef1.toSql();
+                slotRef1.toSqlWithoutTbl();
                 result = "k1";
             }
         };
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java
index 4baa73b860b..bd4af0a4bcf 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java
@@ -44,19 +44,23 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 
 public class ExprTest {
     private static final String internalCtl = 
InternalCatalog.INTERNAL_CATALOG_NAME;
 
     @Test
     public void testGetTableNameToColumnNames(@Mocked Analyzer analyzer,
-                                              @Injectable SlotDescriptor 
slotDesc1,
-                                              @Injectable SlotDescriptor 
slotDesc2,
-                                              @Injectable TupleDescriptor 
tupleDescriptor1,
-                                              @Injectable TupleDescriptor 
tupleDescriptor2,
-                                              @Injectable Table tableA,
-                                              @Injectable Table tableB) throws 
AnalysisException {
+            @Injectable SlotDescriptor slotDesc1,
+            @Injectable SlotDescriptor slotDesc2,
+            @Injectable TupleDescriptor tupleDescriptor1,
+            @Injectable TupleDescriptor tupleDescriptor2,
+            @Injectable Table tableA,
+            @Injectable Table tableB) throws AnalysisException {
         TableName tableAName = new TableName(internalCtl, "test", "tableA");
         TableName tableBName = new TableName(internalCtl, "test", "tableB");
         SlotRef tableAColumn1 = new SlotRef(tableAName, "c1");
@@ -190,7 +194,7 @@ public class ExprTest {
         Expr r7 = new DateLiteral(2020, 10, 23, 0, 0, 0, Type.DATETIMEV2);
         Expr r8 = new DateLiteral(2020, 10, 23, 0, 0, 0, 
ScalarType.createDatetimeV2Type(3));
 
-        //list1 equal list2
+        // list1 equal list2
         List<Expr> list1 = new ArrayList<>();
         List<Expr> list2 = new ArrayList<>();
         list1.add(r1);
@@ -209,7 +213,7 @@ public class ExprTest {
         list2.add(r8);
         Assert.assertTrue(Expr.equalSets(list1, list2));
 
-        //list3 not equal list4
+        // list3 not equal list4
         list2.add(r4);
         Assert.assertFalse(Expr.equalSets(list1, list2));
     }
@@ -219,7 +223,7 @@ public class ExprTest {
         Expr cast = new CastExpr(Type.DATETIME, new IntLiteral(10000101));
         FunctionCallExpr call = new FunctionCallExpr("leap", 
Lists.newArrayList(cast));
         call.uncheckedCastChild(Type.DATETIME, 0);
-        //do not cast a castExpr
+        // do not cast a castExpr
         Assertions.assertTrue(call.getChild(0).getChild(0) instanceof 
IntLiteral);
     }
 
@@ -280,4 +284,26 @@ public class ExprTest {
         Assert.assertTrue(expr instanceof IntLiteral);
         Assert.assertEquals(intLiteral, expr);
     }
+
+    @Test
+    public void testToSql() throws InterruptedException {
+        String toSqlValue = "`db1`.`table1`.`c1`";
+        String toSqlWithoutTblValue = "`c1`";
+        TableName tableName = new TableName(internalCtl, "db1", "table1");
+        SlotRef slotRef = new SlotRef(tableName, "c1");
+        ExecutorService executor = Executors.newFixedThreadPool(10);
+
+        for (int i = 0; i < 100; i++) {
+            executor.submit(() -> {
+                Random random = new Random();
+                if (random.nextInt() % 2 == 0) {
+                    Assert.assertEquals(toSqlValue, slotRef.toSql());
+                } else {
+                    Assert.assertEquals(toSqlWithoutTblValue, 
slotRef.toSqlWithoutTbl());
+                }
+            });
+        }
+        executor.shutdown();
+        executor.awaitTermination(1, TimeUnit.MINUTES);
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMvIndexTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMvIndexTest.java
index bc8df2ab0f7..812dc2ea769 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMvIndexTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMvIndexTest.java
@@ -167,21 +167,11 @@ class SelectMvIndexTest extends 
BaseMaterializedIndexSelectTest implements MemoP
         createMv(createMVSql);
         ConnectContext.get().getState().setNereids(true);
         Env.getCurrentEnv().getCurrentCatalog().getDbOrAnalysisException("db1")
-                        
.getOlapTableOrDdlException(EMPS_TABLE_NAME).getIndexIdToMeta()
-                        .forEach((id, meta) -> {
-                            if (meta.getWhereClause() != null) {
-                                
meta.getWhereClause().setDisableTableName(false);
-                            }
-                        });
+                        
.getOlapTableOrDdlException(EMPS_TABLE_NAME).getIndexIdToMeta();
         testMv(query1, EMPS_MV_NAME);
         ConnectContext.get().getState().setNereids(false);
         Env.getCurrentEnv().getCurrentCatalog().getDbOrAnalysisException("db1")
-                .getOlapTableOrDdlException(EMPS_TABLE_NAME).getIndexIdToMeta()
-                .forEach((id, meta) -> {
-                    if (meta.getWhereClause() != null) {
-                        meta.getWhereClause().setDisableTableName(true);
-                    }
-                });
+                
.getOlapTableOrDdlException(EMPS_TABLE_NAME).getIndexIdToMeta();
     }
 
     @Test
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java
index b405d787219..6f4035f9202 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/rewrite/FEFunctionsTest.java
@@ -708,8 +708,9 @@ public class FEFunctionsTest {
 
     @Test
     public void timeNowTest() throws AnalysisException {
-        String curTimeString = FEFunctions.curTime().toSqlImpl().replace("'", 
"");
-        String currentTimestampString = 
FEFunctions.currentTimestamp().toSqlImpl().replace("'", "");
+        String curTimeString = FEFunctions.curTime().toSqlImpl(false, false, 
null, null).replace("'", "");
+        String currentTimestampString = 
FEFunctions.currentTimestamp().toSqlImpl(false, false, null, null)
+                .replace("'", "");
 
         ZonedDateTime zonedDateTime = 
ZonedDateTime.now(TimeUtils.getTimeZone().toZoneId());
         DateTimeFormatter formatter = null;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to