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