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

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

commit 2595a81d6bfdc64e5d06e46ecb357d389e0c2d1b
Author: seawinde <149132972+seawi...@users.noreply.github.com>
AuthorDate: Mon Aug 26 15:06:28 2024 +0800

    [fix](nereids) Remove Nondeterministic to avoid ambiguity when decidea 
expression is nondeterministic or not (#39801)
    
    ## Proposed changes
    
    In https://github.com/apache/doris/pull/36111, we add `isDeterministic`
    method in class `ExpressionTrait` to identify the expression is
    deterministic or not.
    
    But `unix_timestamp` doesn't extend Nondeterministic, but it is not
    deterministic when it's children is empty. and is not deterministic when
    children is not empty. If we use` instanceOf Nondeterministic `to
    indentify if expression is is not deterministic, that is confused.
    
    So we do something as fllowing:
    1. Remove Nondeterministic class, and use `isDeterministic` to indentify
    it's deterministic.
    2. Add `containsNondeterministic` method in `ExpressionTrait` to
    identify it contains nondeterministic expression or not.
    3. `isDeterministic` only identify current expression is deterministic
    or not. would identify if contains nondeterministic or not
---
 .../doris/common/NereidsSqlCacheManager.java       |  5 +++--
 .../nereids/rules/analysis/ExpressionAnalyzer.java |  7 +++---
 .../nereids/trees/expressions/Expression.java      |  3 +--
 .../expressions/functions/ExpressionTrait.java     | 26 ++++++++--------------
 .../expressions/functions/scalar/ConnectionId.java |  8 +++++--
 .../expressions/functions/scalar/CurrentDate.java  |  8 +++++--
 .../expressions/functions/scalar/CurrentTime.java  |  8 +++++--
 .../expressions/functions/scalar/CurrentUser.java  |  8 +++++--
 .../expressions/functions/scalar/Database.java     |  8 +++++--
 .../trees/expressions/functions/scalar/Now.java    |  8 +++++--
 .../trees/expressions/functions/scalar/Random.java |  8 +++++--
 .../trees/expressions/functions/scalar/User.java   |  8 +++++--
 .../expressions/functions/scalar/UtcTimestamp.java |  8 +++++--
 .../trees/expressions/functions/scalar/Uuid.java   |  8 +++++--
 .../expressions/functions/scalar/UuidNumeric.java  |  8 +++++--
 .../functions/table/TableValuedFunction.java       |  8 +++++--
 .../nereids/rules/analysis/GenerateFunction.java   |  4 ----
 .../nereids/trees/expressions/ExpressionTest.java  | 26 ++++++++++++++++++++++
 .../doris/nereids/trees/plans/PlanVisitorTest.java | 16 +++++++++++++
 19 files changed, 130 insertions(+), 53 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/NereidsSqlCacheManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/NereidsSqlCacheManager.java
index a74e7e10b97..ba2c978830a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/common/NereidsSqlCacheManager.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/common/NereidsSqlCacheManager.java
@@ -45,7 +45,7 @@ import 
org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
 import org.apache.doris.nereids.rules.expression.rules.FoldConstantRuleOnFE;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.Variable;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
+import org.apache.doris.nereids.trees.expressions.functions.ExpressionTrait;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.RelationId;
 import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
@@ -396,7 +396,8 @@ public class NereidsSqlCacheManager {
             Variable currentVariable = currentVariables.get(i);
             Variable cachedVariable = cachedUsedVariables.get(i);
             if (!Objects.equals(currentVariable, cachedVariable)
-                    || 
cachedVariable.getRealExpression().anyMatch(Nondeterministic.class::isInstance))
 {
+                    || cachedVariable.getRealExpression().anyMatch(
+                            expr -> !((ExpressionTrait) 
expr).isDeterministic())) {
                 return true;
             }
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
index 91b5bf671ca..8624ba205c5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/ExpressionAnalyzer.java
@@ -65,7 +65,6 @@ import org.apache.doris.nereids.trees.expressions.Variable;
 import org.apache.doris.nereids.trees.expressions.WhenClause;
 import org.apache.doris.nereids.trees.expressions.functions.BoundFunction;
 import org.apache.doris.nereids.trees.expressions.functions.FunctionBuilder;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Count;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.ElementAt;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Lambda;
@@ -177,11 +176,11 @@ public class ExpressionAnalyzer extends 
SubExprAnalyzer<ExpressionRewriteContext
                 @Override
                 public Expression visitBoundFunction(BoundFunction 
boundFunction, ExpressionRewriteContext context) {
                     Expression fold = super.visitBoundFunction(boundFunction, 
context);
-                    boolean unfold = fold instanceof Nondeterministic;
+                    boolean unfold = !fold.isDeterministic();
                     if (unfold) {
                         sqlCacheContext.setCannotProcessExpression(true);
                     }
-                    if (boundFunction instanceof Nondeterministic && !unfold) {
+                    if (!boundFunction.isDeterministic() && !unfold) {
                         
sqlCacheContext.addFoldNondeterministicPair(boundFunction, fold);
                     }
                     return fold;
@@ -407,7 +406,7 @@ public class ExpressionAnalyzer extends 
SubExprAnalyzer<ExpressionRewriteContext
         Optional<SqlCacheContext> sqlCacheContext = Optional.empty();
         if (wantToParseSqlFromSqlCache) {
             StatementContext statementContext = 
context.cascadesContext.getStatementContext();
-            if (buildResult.second instanceof Nondeterministic) {
+            if (!buildResult.second.isDeterministic()) {
                 hasNondeterministic = true;
             }
             sqlCacheContext = statementContext.getSqlCacheContext();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
index e355cd204cd..5bb8355477b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/Expression.java
@@ -25,7 +25,6 @@ import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.trees.AbstractTreeNode;
 import 
org.apache.doris.nereids.trees.expressions.ArrayItemReference.ArrayItemSlot;
 import org.apache.doris.nereids.trees.expressions.functions.ExpressionTrait;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import 
org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Lambda;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
@@ -350,7 +349,7 @@ public abstract class Expression extends 
AbstractTreeNode<Expression> implements
         if (this instanceof LeafExpression) {
             return this instanceof Literal;
         } else {
-            return !(this instanceof Nondeterministic) && 
ExpressionUtils.allMatch(children(), Expression::isConstant);
+            return this.isDeterministic() && 
ExpressionUtils.allMatch(children(), Expression::isConstant);
         }
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/ExpressionTrait.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/ExpressionTrait.java
index 2e69a5ecd16..daaab359e84 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/ExpressionTrait.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/ExpressionTrait.java
@@ -26,7 +26,6 @@ import org.apache.doris.nereids.types.DataType;
 import com.google.common.collect.ImmutableList;
 
 import java.util.List;
-import java.util.Optional;
 
 /**
  * ExpressionTrait.
@@ -79,23 +78,16 @@ public interface ExpressionTrait extends 
TreeNode<Expression> {
     }
 
     /**
-     * Identify the expression is deterministic or not
+     * Identify the expression itself is deterministic or not, default true
      */
     default boolean isDeterministic() {
-        boolean isDeterministic = true;
-        List<Expression> children = this.children();
-        if (children.isEmpty()) {
-            return isDeterministic;
-        }
-        for (Expression child : children) {
-            Optional<ExpressionTrait> nonDeterministic =
-                    child.collectFirst(expressionTreeNode -> 
expressionTreeNode instanceof ExpressionTrait
-                    && !((ExpressionTrait) 
expressionTreeNode).isDeterministic());
-            if (nonDeterministic.isPresent()) {
-                isDeterministic = false;
-                break;
-            }
-        }
-        return isDeterministic;
+        return true;
+    }
+
+    /**
+     * Identify the expression is containing deterministic expr or not
+     */
+    default boolean containsNondeterministic() {
+        return anyMatch(expr -> !((ExpressionTrait) expr).isDeterministic());
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ConnectionId.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ConnectionId.java
index 6f17e247c44..145e516255c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ConnectionId.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/ConnectionId.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'ConnectionId'.
  */
 public class ConnectionId extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable, Nondeterministic {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(BigIntType.INSTANCE).args()
@@ -52,4 +51,9 @@ public class ConnectionId extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitConnectionId(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentDate.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentDate.java
index bca7ffd05c4..04d42932acb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentDate.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentDate.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DateType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'current_date'. This class is generated by GenerateFunction.
  */
 public class CurrentDate extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
Nondeterministic, AlwaysNotNullable {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateType.INSTANCE).args()
@@ -55,4 +54,9 @@ public class CurrentDate extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitCurrentDate(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentTime.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentTime.java
index 2e09c36d85c..a748078eb44 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentTime.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentTime.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.TimeType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'current_time'. This class is generated by GenerateFunction.
  */
 public class CurrentTime extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
Nondeterministic, AlwaysNotNullable {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(TimeType.INSTANCE).args()
@@ -55,4 +54,9 @@ public class CurrentTime extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitCurrentTime(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentUser.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentUser.java
index 5f00e374716..081037f5c14 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentUser.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CurrentUser.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.StringType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'CurrentUser'.
  */
 public class CurrentUser extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable, Nondeterministic {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(StringType.INSTANCE).args()
@@ -52,4 +51,9 @@ public class CurrentUser extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitCurrentUser(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Database.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Database.java
index c213fc6bc5c..888eb9ccb64 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Database.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Database.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.VarcharType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'database'.
  */
 public class Database extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable, Nondeterministic {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args()
@@ -52,4 +51,9 @@ public class Database extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitDatabase(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Now.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Now.java
index 90b1f77a375..1befaa6d297 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Now.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Now.java
@@ -21,7 +21,6 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.DateTimeWithPrecision;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DateTimeType;
 import org.apache.doris.nereids.types.DateTimeV2Type;
@@ -35,7 +34,7 @@ import java.util.List;
 /**
  * ScalarFunction 'now'. This class is generated by GenerateFunction.
  */
-public class Now extends DateTimeWithPrecision implements 
ExplicitlyCastableSignature, Nondeterministic {
+public class Now extends DateTimeWithPrecision implements 
ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeType.INSTANCE).args(),
@@ -91,4 +90,9 @@ public class Now extends DateTimeWithPrecision implements 
ExplicitlyCastableSign
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitNow(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Random.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Random.java
index 5045d85c919..4c658414aa5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Random.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Random.java
@@ -21,7 +21,6 @@ import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.BigIntType;
@@ -36,7 +35,7 @@ import java.util.List;
  * ScalarFunction 'random'. This class is generated by GenerateFunction.
  */
 public class Random extends ScalarFunction
-        implements ExplicitlyCastableSignature, Nondeterministic {
+        implements ExplicitlyCastableSignature {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DoubleType.INSTANCE).args(),
@@ -119,4 +118,9 @@ public class Random extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitRandom(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/User.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/User.java
index 6cf547f8ab5..e56d12e80b7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/User.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/User.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.VarcharType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'User'.
  */
 public class User extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable, Nondeterministic {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args()
@@ -52,4 +51,9 @@ public class User extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitUser(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UtcTimestamp.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UtcTimestamp.java
index 2a775223ccd..67b4b4bc940 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UtcTimestamp.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UtcTimestamp.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DateTimeType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'utc_timestamp'. This class is generated by GenerateFunction.
  */
 public class UtcTimestamp extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
Nondeterministic, AlwaysNotNullable {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(DateTimeType.INSTANCE).args()
@@ -55,4 +54,9 @@ public class UtcTimestamp extends ScalarFunction
     public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
         return visitor.visitUtcTimestamp(this, context);
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Uuid.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Uuid.java
index 89492907832..1df31219697 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Uuid.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/Uuid.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.VarcharType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'uuid'. This class is generated by GenerateFunction.
  */
 public class Uuid extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
Nondeterministic, AlwaysNotNullable {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).args()
@@ -60,4 +59,9 @@ public class Uuid extends ScalarFunction
     public List<FunctionSignature> getSignatures() {
         return SIGNATURES;
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UuidNumeric.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UuidNumeric.java
index bbbd2e81a99..141d64bb418 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UuidNumeric.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/UuidNumeric.java
@@ -20,7 +20,6 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.functions.AlwaysNotNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.LeafExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.LargeIntType;
@@ -33,7 +32,7 @@ import java.util.List;
  * ScalarFunction 'uuid_numeric'. This class is generated by GenerateFunction.
  */
 public class UuidNumeric extends ScalarFunction
-        implements LeafExpression, ExplicitlyCastableSignature, 
Nondeterministic, AlwaysNotNullable {
+        implements LeafExpression, ExplicitlyCastableSignature, 
AlwaysNotNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             FunctionSignature.ret(LargeIntType.INSTANCE).args()
@@ -60,4 +59,9 @@ public class UuidNumeric extends ScalarFunction
     public List<FunctionSignature> getSignatures() {
         return SIGNATURES;
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/table/TableValuedFunction.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/table/TableValuedFunction.java
index bdefb2c75eb..837edf27ab1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/table/TableValuedFunction.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/table/TableValuedFunction.java
@@ -27,7 +27,6 @@ import org.apache.doris.nereids.trees.expressions.Properties;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.functions.BoundFunction;
 import org.apache.doris.nereids.trees.expressions.functions.CustomSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import org.apache.doris.nereids.trees.expressions.shape.UnaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
 import org.apache.doris.nereids.types.DataType;
@@ -48,7 +47,7 @@ import java.util.stream.Collectors;
 
 /** TableValuedFunction */
 public abstract class TableValuedFunction extends BoundFunction
-        implements UnaryExpression, CustomSignature, Nondeterministic {
+        implements UnaryExpression, CustomSignature {
 
     protected final Supplier<TableValuedFunctionIf> catalogFunctionCache = 
Suppliers.memoize(this::toCatalogFunction);
     protected final Supplier<FunctionGenTable> tableCache = 
Suppliers.memoize(() -> {
@@ -145,4 +144,9 @@ public abstract class TableValuedFunction extends 
BoundFunction
     public String toString() {
         return toSql();
     }
+
+    @Override
+    public boolean isDeterministic() {
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/GenerateFunction.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/GenerateFunction.java
index 514062b6792..2d010df4c51 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/GenerateFunction.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/GenerateFunction.java
@@ -44,7 +44,6 @@ import 
org.apache.doris.nereids.trees.expressions.functions.DecimalWiderPrecisio
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
 import org.apache.doris.nereids.trees.expressions.functions.IdenticalSignature;
 import 
org.apache.doris.nereids.trees.expressions.functions.ImplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.Nondeterministic;
 import 
org.apache.doris.nereids.trees.expressions.functions.NullOrIdenticalSignature;
 import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
@@ -739,9 +738,6 @@ public class GenerateFunction {
             interfaces.add(arityExpressionType);
         }
         interfaces.add(getComputeSignatureInterface(functionName));
-        if (functionSet.isNondeterministicFunction(functionName)) {
-            interfaces.add(Nondeterministic.class);
-        }
 
         Function function = functions.get(0);
         if (!customNullableFunctions.contains(functionName)) {
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionTest.java
index d673cfa9a0a..cb43efb0b31 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/ExpressionTest.java
@@ -17,8 +17,13 @@
 
 package org.apache.doris.nereids.trees.expressions;
 
+import org.apache.doris.nereids.trees.expressions.functions.scalar.CurrentDate;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.DaysAdd;
+import 
org.apache.doris.nereids.trees.expressions.functions.scalar.UnixTimestamp;
+import org.apache.doris.nereids.trees.expressions.literal.DateLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.StringLiteral;
+import org.apache.doris.nereids.trees.expressions.literal.VarcharLiteral;
 import org.apache.doris.nereids.types.IntegerType;
 
 import org.junit.jupiter.api.Assertions;
@@ -40,4 +45,25 @@ public class ExpressionTest {
         Assertions.assertFalse(
                 new Add(new SlotReference("a", IntegerType.INSTANCE), new 
IntegerLiteral(1)).isConstant());
     }
+
+    @Test
+    public void testContainsNondeterministic() {
+        Assertions.assertTrue(new DaysAdd(new CurrentDate(), new 
IntegerLiteral(2)).containsNondeterministic());
+        Assertions.assertTrue(new DaysAdd(
+                new UnixTimestamp(
+                        new CurrentDate(),
+                        new VarcharLiteral("%Y-%m-%d %H:%i-%s")), new 
IntegerLiteral(2))
+                .containsNondeterministic());
+        Assertions.assertTrue(new DaysAdd(
+                new UnixTimestamp(new CurrentDate()), new 
IntegerLiteral(2)).containsNondeterministic());
+
+        Assertions.assertFalse(new DaysAdd(
+                new UnixTimestamp(
+                        new DateLiteral("2024-01-01"),
+                        new VarcharLiteral("%Y-%m-%d %H:%i-%s")), new 
IntegerLiteral(2))
+                .containsNondeterministic());
+        Assertions.assertTrue(new DaysAdd(
+                new UnixTimestamp(), new 
IntegerLiteral(2)).containsNondeterministic());
+
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanVisitorTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanVisitorTest.java
index 1afbf6dbbf5..ec184080bdf 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanVisitorTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/PlanVisitorTest.java
@@ -281,6 +281,22 @@ public class PlanVisitorTest extends TestWithFeService {
                         });
     }
 
+    @Test
+    public void testContainsNondeterministic() {
+        PlanChecker.from(connectContext)
+                .checkExplain("SELECT * FROM table1 "
+                                + "LEFT SEMI JOIN table2 ON table1.c1 = 
table2.c1 "
+                                + "WHERE table1.c1 IN (SELECT c1 FROM table2) 
OR date_add(current_date(), INTERVAL 2 DAY) < '2023-01-01'",
+                        nereidsPlanner -> {
+                            // Check nondeterministic collect
+                            List<Expression> nondeterministicFunctionSet =
+                                    
MaterializedViewUtils.extractNondeterministicFunction(
+                                            nereidsPlanner.getAnalyzedPlan());
+                            Assertions.assertEquals(1, 
nondeterministicFunctionSet.size());
+                            
Assertions.assertTrue(nondeterministicFunctionSet.get(0) instanceof 
CurrentDate);
+                        });
+    }
+
     @Test
     public void testUnixTimestampWithArgsFunction() {
         PlanChecker.from(connectContext)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org


Reply via email to