[fix](nereids) Remove Nondeterministic to avoid ambiguity when decide a expression is nondeterministic or not (#39801) (#40130)

## Proposed changes

commitId: 2b715a7e
pr: https://github.com/apache/doris/pull/39801
This commit is contained in:
seawinde
2024-08-30 07:51:42 +08:00
committed by GitHub
parent b86e4e8498
commit e072ce7f68
19 changed files with 130 additions and 53 deletions

View File

@ -46,7 +46,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;
@ -400,7 +400,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;
}
}

View File

@ -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();

View File

@ -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);
}
}

View File

@ -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());
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
@ -47,7 +46,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(() -> {
@ -141,4 +140,9 @@ public abstract class TableValuedFunction extends BoundFunction
public String toString() {
return toSql();
}
@Override
public boolean isDeterministic() {
return false;
}
}

View File

@ -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)) {

View File

@ -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());
}
}

View File

@ -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)