[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:
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)) {
|
||||
|
||||
@ -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());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user