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

starocean999 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 3e6c20d196a [fix](planner)Fix the concurrency issue caused by Expr 
setting member variables (#51389)
3e6c20d196a is described below

commit 3e6c20d196a4e45330bb05b5ffaf715d49c5d297
Author: zhangdong <[email protected]>
AuthorDate: Fri Jun 20 12:09:16 2025 +0800

    [fix](planner)Fix the concurrency issue caused by Expr setting member 
variables (#51389)
    
    
    When multiple threads operate on the same member variable (e.g.,
    disableTableName in org.apache.doris.analysis.Expr#toSqlWithoutTbl) of
    the same Expr (e.g., org.apache.doris.catalog.Column#getDefineExpr), the
    resulting toSql output may not match the expected value due to
    concurrency issues.
    
    Add an overloaded toSql method in Expr, remove related member variables,
    and make toSqlWithoutTbl directly call the overloaded toSql method
---
 .../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 ++
 .../org/apache/doris/analysis/TimeV2Literal.java   |   7 ++
 .../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 +-
 .../org/apache/doris/load/BrokerFileGroup.java     |   2 +-
 .../load/routineload/KafkaRoutineLoadJob.java      |   4 +-
 .../doris/load/routineload/RoutineLoadJob.java     |  12 +-
 .../doris/nereids/rules/analysis/BindSink.java     |   2 +-
 .../mv/AbstractSelectMaterializedIndexRule.java    |   9 +-
 .../mv/SelectMaterializedIndexWithAggregate.java   |   2 +-
 .../trees/expressions/functions/udf/AliasUdf.java  |   2 +-
 .../plans/commands/CreateFunctionCommand.java      |   2 +-
 .../commands/CreateMaterializedViewCommand.java    |   6 +-
 .../trees/plans/commands/DescribeCommand.java      |   4 +-
 .../org/apache/doris/nereids/util/PlanUtils.java   |   2 +-
 .../org/apache/doris/planner/OlapTableSink.java    |   2 +-
 .../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 +-
 66 files changed, 848 insertions(+), 86 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 87681a636e2..92f303efdb0 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 6f6deafb09a..a3405462b93 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;
@@ -269,6 +271,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 b798f2f15be..7cb84743c04 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;
@@ -117,6 +119,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 5ebe1ce3e93..ad011d34519 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;
 
@@ -94,6 +96,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 0d2c664533b..968f1fa38f0 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;
@@ -285,6 +287,13 @@ public class BinaryPredicate 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/BitmapFilterPredicate.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/BitmapFilterPredicate.java
index 628b8bc7d95..a9ec2cc1f84 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 7008872abab..246b6921add 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;
@@ -106,6 +108,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 3eae897f30d..856b011b93f 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;
@@ -152,6 +154,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 f83cae85b7c..96a90c1cc75 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;
@@ -220,9 +222,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 {
@@ -231,6 +230,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 35529ea6798..5314f063786 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 dcd67598dd4..1f47022f41f 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;
@@ -100,6 +102,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 2922595fbce..e4a39e2c94f 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,12 +272,12 @@ public class CreateMaterializedViewStmt extends DdlStmt 
implements NotFallbackIn
             SelectListItem selectListItem = selectList.getItems().get(i);
 
             Expr selectListItemExpr = selectListItem.getExpr();
-            selectListItemExpr.setDisableTableName(true);
+            selectListItemExpr.disableTableName();
             Expr realItem = selectListItemExpr.unwrapExpr(false);
             if (!(realItem instanceof SlotRef) && !(realItem instanceof 
FunctionCallExpr)
                     && !(realItem 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()) {
@@ -298,14 +298,14 @@ public class CreateMaterializedViewStmt extends DdlStmt 
implements NotFallbackIn
                 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 
implements NotFallbackIn
 
             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);
@@ -607,7 +608,7 @@ public class CreateMaterializedViewStmt extends DdlStmt 
implements NotFallbackIn
         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 e881874c515..cd328781181 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;
@@ -678,6 +680,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 41d64c27ae6..e13fc019fd8 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;
@@ -275,6 +277,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 0a84657fc7b..ca746d45ba1 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 7950fe37c4b..6b00e64a2f5 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
@@ -19,6 +19,8 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.EncryptKey;
+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;
@@ -89,6 +91,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 9fd4b18980e..548c6163e86 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 db2e2e0ca0a..3a7165821e4 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
@@ -96,9 +96,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;
@@ -923,31 +920,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() {
@@ -960,6 +952,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
@@ -970,10 +965,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 074fc250967..074b0eea5ec 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;
@@ -137,6 +139,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 e2f945c6941..3d163368e64 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.Config;
@@ -669,6 +671,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;
@@ -714,6 +802,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 33a273ad52f..e3a3fd2f843 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;
@@ -118,6 +120,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 f33f1103d95..6995a76397c 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;
@@ -78,6 +80,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 e62fca2c27f..2d4aec8974a 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
@@ -80,7 +80,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 128fac0effd..f07016fc8bb 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;
@@ -285,6 +287,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 9b3e639ef65..56a085bb9d2 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;
@@ -98,6 +100,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 a33a1b741ec..22180b378dc 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.NotImplementedException;
@@ -298,6 +300,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 1b2d626f3c5..a6b183c72e6 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;
@@ -112,6 +114,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 050ec16a330..a22c2581cad 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;
@@ -84,6 +86,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 500f0585dc8..b5bc74d85f3 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;
@@ -351,4 +353,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 c171bf18c27..39a98ff49de 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;
@@ -146,6 +148,26 @@ public class LambdaFunctionExpr extends Expr {
         return res;
     }
 
+    @Override
+    protected String toSqlImpl(boolean disableTableName, boolean 
needExternalSql, TableType tableType,
+            TableIf table) {
+        String nameStr = "";
+        Expr lambdaExpr = slotExprs.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 f499d58e046..f323ccc700a 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.io.Text;
@@ -211,6 +213,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 7982c877513..099453f9889 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;
@@ -114,6 +116,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 43a40566daf..d915d741590 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
@@ -86,7 +86,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 396883699c5..d15ab9b2685 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;
@@ -196,6 +198,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 3b3d9ad7ee0..c104fd10920 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;
@@ -223,6 +225,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 03c4653833d..5753b24ab55 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;
 
@@ -58,6 +60,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 70840bb4fdb..fa5675c15ce 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.FeConstants;
@@ -101,6 +103,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 eda712552e8..a7cf5c3cd43 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;
@@ -183,6 +185,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 7ac96a9faa9..f05d84f1607 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
@@ -242,8 +242,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) {
@@ -290,7 +331,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 51f1bb53b95..02396e0a712 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;
@@ -138,6 +140,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 78437c26ce0..90ee8438060 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;
@@ -81,6 +83,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 915230eff13..bb57c6b6c6e 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/TimeV2Literal.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java
index 1a1bec2ab12..cb109213bbb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java
@@ -18,6 +18,8 @@
 package org.apache.doris.analysis;
 
 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.nereids.exceptions.AnalysisException;
 import org.apache.doris.thrift.TExprNode;
@@ -83,6 +85,11 @@ public class TimeV2Literal 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.TIMEV2_LITERAL;
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 3b2e6fdde3a..d88c13080c3 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;
@@ -411,6 +413,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 b6af33108bd..285005d84c0 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 90f6ffb0e02..29db739343a 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 4b3ab644ffc..3365b0a7c05 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
@@ -224,7 +224,7 @@ public class AliasFunction extends Function {
                 .append(" WITH PARAMETER(")
                 .append(getParamsSting(parameters))
                 .append(") AS ")
-                .append(originFunction.toSql())
+                .append(originFunction.toSqlWithoutTbl())
                 .append(";");
         return sb.toString();
     }
@@ -244,7 +244,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 6a30e771a58..0778459d0b1 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/BrokerFileGroup.java 
b/fe/fe-core/src/main/java/org/apache/doris/load/BrokerFileGroup.java
index 4aad398a781..e9cb9c027fe 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/BrokerFileGroup.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/BrokerFileGroup.java
@@ -502,7 +502,7 @@ public class BrokerFileGroup implements Writable {
             importColumnDescs = new ArrayList<>(columnExprList.size());
             for (ImportColumnDesc desc : columnExprList) {
                 Expression expression = desc.getExpr() != null
-                        ? 
NereidsLoadUtils.parseExpressionSeq(desc.getExpr().toSql()).get(0)
+                        ? 
NereidsLoadUtils.parseExpressionSeq(desc.getExpr().toSqlWithoutTbl()).get(0)
                         : null;
                 importColumnDescs.add(new 
NereidsImportColumnDesc(desc.getColumnName(), expression));
             }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaRoutineLoadJob.java
 
b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaRoutineLoadJob.java
index 654e1f9f843..bfa48210d72 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaRoutineLoadJob.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaRoutineLoadJob.java
@@ -980,14 +980,14 @@ public class KafkaRoutineLoadJob extends RoutineLoadJob {
                 ? 
NereidsLoadUtils.parseExpressionSeq(getPrecedingFilter().toSql()).get(0)
                 : null;
         Expression whereExpr = getWhereExpr() != null
-                ? 
NereidsLoadUtils.parseExpressionSeq(getWhereExpr().toSql()).get(0)
+                ? 
NereidsLoadUtils.parseExpressionSeq(getWhereExpr().toSqlWithoutTbl()).get(0)
                 : null;
         NereidsLoadTaskInfo.NereidsImportColumnDescs importColumnDescs = null;
         if (columnDescs != null) {
             importColumnDescs = new 
NereidsLoadTaskInfo.NereidsImportColumnDescs();
             for (ImportColumnDesc desc : columnDescs.descs) {
                 Expression expression = desc.getExpr() != null
-                        ? 
NereidsLoadUtils.parseExpressionSeq(desc.getExpr().toSql()).get(0)
+                        ? 
NereidsLoadUtils.parseExpressionSeq(desc.getExpr().toSqlWithoutTbl()).get(0)
                         : null;
                 importColumnDescs.descs.add(new 
NereidsImportColumnDesc(desc.getColumnName(), expression));
             }
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 b16f5ae21a7..974c7170c87 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
@@ -1757,7 +1757,7 @@ public abstract class RoutineLoadJob
         }
         // 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) {
@@ -1765,7 +1765,7 @@ public abstract class RoutineLoadJob
         }
         // 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) {
@@ -1773,7 +1773,7 @@ public abstract class RoutineLoadJob
         }
         // 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) == ',') {
@@ -1866,8 +1866,8 @@ public abstract class RoutineLoadJob
                 ? 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(FileFormatProperties.PROP_FORMAT, "json");
         } else {
@@ -1888,7 +1888,7 @@ public abstract class RoutineLoadJob
         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/analysis/BindSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
index b2a23c8ad59..71b7c69c0f8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindSink.java
@@ -866,7 +866,7 @@ public class BindSink implements AnalysisRuleFactory {
             long baseIndexId = olapTable.getBaseIndexId();
             for (Map.Entry<Long, MaterializedIndexMeta> entry : 
olapTable.getVisibleIndexIdToMeta().entrySet()) {
                 if (entry.getKey() != baseIndexId && 
entry.getValue().getWhereClause() != null) {
-                    mvWhereClauses.put(entry.getKey(), 
analyze(entry.getValue().getWhereClause().toSql()));
+                    mvWhereClauses.put(entry.getKey(), 
analyze(entry.getValue().getWhereClause().toSqlWithoutTbl()));
                 }
             }
             return mvWhereClauses;
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 3c31ce22e46..9fd32484216 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
@@ -166,9 +166,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)) {
@@ -540,10 +541,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 42f3f8dbe40..3090e375637 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
@@ -1071,7 +1071,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/nereids/trees/plans/commands/CreateFunctionCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateFunctionCommand.java
index b3f9539b2fc..461bebfe0a2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateFunctionCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateFunctionCommand.java
@@ -1025,7 +1025,7 @@ public class CreateFunctionCommand extends Command 
implements ForwardWithSync {
             SlotRef slotRef = new 
SlotRef(slotReference.getDataType().toCatalogDataType(), 
slotReference.nullable());
             slotRef.setLabel(slotReference.getName());
             slotRef.setCol(slotReference.getName());
-            slotRef.setDisableTableName(true);
+            slotRef.disableTableName();
             return slotRef;
         }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMaterializedViewCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMaterializedViewCommand.java
index 503d691e481..088e42561a0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMaterializedViewCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateMaterializedViewCommand.java
@@ -273,7 +273,7 @@ public class CreateMaterializedViewCommand extends Command 
implements ForwardWit
                 translatorContext.createSlotDesc(tupleDescriptor, 
(SlotReference) slot, olapTable);
                 SlotRef slotRef = 
translatorContext.findSlotRef(slot.getExprId());
                 slotRef.setLabel("`" + slot.getName() + "`");
-                slotRef.setDisableTableName(true);
+                slotRef.disableTableName();
             }
             return olapScan;
         }
@@ -605,12 +605,12 @@ public class CreateMaterializedViewCommand extends 
Command implements ForwardWit
             }
             Expr expr = translateToLegacyExpr(defineExpr, 
ctx.planTranslatorContext);
             return new MVColumnItem(mvDataType.toCatalogDataType(), mvAggType, 
expr,
-                    CreateMaterializedViewStmt.mvColumnBuilder(expr.toSql()));
+                    
CreateMaterializedViewStmt.mvColumnBuilder(expr.toSqlWithoutTbl()));
         }
 
         private Expr translateToLegacyExpr(Expression expression, 
PlanTranslatorContext context) {
             Expr expr = ExpressionTranslator.translate(expression, context);
-            expr.setDisableTableName(true);
+            expr.disableTableName();
             return expr;
         }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DescribeCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DescribeCommand.java
index e12dce97142..33a84e926c6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DescribeCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DescribeCommand.java
@@ -318,8 +318,8 @@ public class DescribeCommand extends ShowCommand {
                             String defineExprStr = "";
                             Expr defineExpr = column.getDefineExpr();
                             if (defineExpr != null) {
-                                
column.getDefineExpr().setDisableTableName(true);
-                                defineExprStr = defineExpr.toSql();
+                                column.getDefineExpr().disableTableName();
+                                defineExprStr = defineExpr.toSqlWithoutTbl();
                             }
 
                             List<String> row = Arrays.asList(
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/PlanUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/PlanUtils.java
index fe3a7db085a..0759122b3c8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/PlanUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/PlanUtils.java
@@ -404,7 +404,7 @@ public class PlanUtils {
             SlotRef slotRef = new 
SlotRef(slotReference.getDataType().toCatalogDataType(), 
slotReference.nullable());
             slotRef.setLabel(slotReference.getName());
             slotRef.setCol(slotReference.getName());
-            slotRef.setDisableTableName(true);
+            slotRef.disableTableName();
             return slotRef;
         }
     }
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 d124dfc4d17..f5d113e961b 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
@@ -519,7 +519,7 @@ public class OlapTableSink extends DataSink {
             if (whereClause != null) {
                 Expr expr = syncMvWhereClauses.getOrDefault(pair.getKey(), 
null);
                 if (expr == null) {
-                    throw new AnalysisException(String.format("%s is not 
analyzed", whereClause.toSql()));
+                    throw new AnalysisException(String.format("%s is not 
analyzed", whereClause.toSqlWithoutTbl()));
                 }
                 indexSchema.setWhereClause(expr.treeToThrift());
             }
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 7bd16c26070..4ba5cb63879 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
@@ -36,19 +36,23 @@ import org.junit.jupiter.api.Assertions;
 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");
@@ -182,7 +186,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);
@@ -201,7 +205,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));
     }
@@ -211,7 +215,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);
     }
 
@@ -233,4 +237,26 @@ public class ExprTest {
         Assert.assertTrue(srcSlotRef != null);
         Assert.assertTrue(srcSlotRef == slotRef);
     }
+
+    @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 41dfec8a6dd..c769e1c210c 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
@@ -168,21 +168,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