From bb3a0fd30e2bbe58f181b9b37bbee867b6e3245a Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Fri, 24 May 2024 02:24:40 +0800 Subject: [PATCH] [fix](nereids)should use nereids expr's nullable info when call Expr's toThrift method (#35274) --- .../java/org/apache/doris/analysis/Expr.java | 8 +- .../glue/translator/ExpressionTranslator.java | 134 +++++++++++++----- 2 files changed, 104 insertions(+), 38 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java index c31bacbf87..9adf1bf13e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java @@ -97,6 +97,8 @@ public abstract class Expr extends TreeNode implements ParseNode, Cloneabl public static final float FUNCTION_CALL_COST = 10; + protected Optional nullableFromNereids = Optional.empty(); + // returns true if an Expr is a non-analytic aggregate. private static final com.google.common.base.Predicate IS_AGGREGATE_PREDICATE = new com.google.common.base.Predicate() { @@ -998,7 +1000,7 @@ public abstract class Expr extends TreeNode implements ParseNode, Cloneabl } } msg.output_scale = getOutputScale(); - msg.setIsNullable(isNullable()); + msg.setIsNullable(nullableFromNereids.isPresent() ? nullableFromNereids.get() : isNullable()); toThrift(msg); container.addToNodes(msg); for (Expr child : children) { @@ -2603,5 +2605,9 @@ public abstract class Expr extends TreeNode implements ParseNode, Cloneabl public boolean isZeroLiteral() { return this instanceof LiteralExpr && ((LiteralExpr) this).isZero(); } + + public void setNullableFromNereids(boolean nullable) { + nullableFromNereids = Optional.of(nullable); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java index 6c7a1bd82c..2482bb50e3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/ExpressionTranslator.java @@ -140,47 +140,57 @@ public class ExpressionTranslator extends DefaultExpressionVisitor translate(e, context)) .collect(Collectors.toList()); boolean allConstant = inPredicate.getOptions().stream().allMatch(Expression::isConstant); - return new org.apache.doris.analysis.InPredicate( + org.apache.doris.analysis.InPredicate in = new org.apache.doris.analysis.InPredicate( inPredicate.getCompareExpr().accept(this, context), inList, true, allConstant); + in.setNullableFromNereids(inPredicate.nullable()); + return in; } else if (not.child() instanceof EqualTo) { EqualTo equalTo = (EqualTo) not.child(); - return new BinaryPredicate(Operator.NE, + BinaryPredicate ne = new BinaryPredicate(Operator.NE, equalTo.child(0).accept(this, context), equalTo.child(1).accept(this, context), equalTo.getDataType().toCatalogDataType(), NullableMode.DEPEND_ON_ARGUMENT); + ne.setNullableFromNereids(equalTo.nullable()); + return ne; } else if (not.child() instanceof InSubquery || not.child() instanceof Exists) { return new BoolLiteral(true); } else if (not.child() instanceof IsNull) { - return new IsNullPredicate(((IsNull) not.child()).child().accept(this, context), true, true); + IsNullPredicate isNull = new IsNullPredicate( + ((IsNull) not.child()).child().accept(this, context), true, true); + isNull.setNullableFromNereids(not.child().nullable()); + return isNull; } else { - return new CompoundPredicate(CompoundPredicate.Operator.NOT, + CompoundPredicate cp = new CompoundPredicate(CompoundPredicate.Operator.NOT, not.child(0).accept(this, context), null); + cp.setNullableFromNereids(not.nullable()); + return cp; } } @@ -329,18 +348,22 @@ public class ExpressionTranslator extends DefaultExpressionVisitor e.accept(this, context)) .collect(Collectors.toList()); boolean allConstant = inPredicate.getOptions().stream().allMatch(Expression::isConstant); - return new org.apache.doris.analysis.InPredicate( + org.apache.doris.analysis.InPredicate in = new org.apache.doris.analysis.InPredicate( inPredicate.getCompareExpr().accept(this, context), inList, false, allConstant); + in.setNullableFromNereids(inPredicate.nullable()); + return in; } @Override @@ -419,6 +448,7 @@ public class ExpressionTranslator extends DefaultExpressionVisitor arguments = lambda.getLambdaArguments().stream().map(e -> e.accept(this, context)) .collect(Collectors.toList()); - return new LambdaFunctionExpr(func, lambda.getLambdaArgumentNames(), arguments); + LambdaFunctionExpr functionExpr = new LambdaFunctionExpr(func, lambda.getLambdaArgumentNames(), arguments); + functionExpr.setNullableFromNereids(lambda.nullable()); + return functionExpr; } @Override @@ -471,7 +503,10 @@ public class ExpressionTranslator extends DefaultExpressionVisitor e.getDataType().isDateV2LikeType())) { nullableMode = NullableMode.DEPEND_ON_ARGUMENT; } - return new TimestampArithmeticExpr(arithmetic.getFuncName(), arithmetic.getOp(), + TimestampArithmeticExpr timestampArithmeticExpr = new TimestampArithmeticExpr( + arithmetic.getFuncName(), arithmetic.getOp(), arithmetic.left().accept(this, context), arithmetic.right().accept(this, context), - arithmetic.getTimeUnit().toString(), arithmetic.getDataType().toCatalogDataType(), nullableMode); + arithmetic.getTimeUnit().toString(), arithmetic.getDataType().toCatalogDataType(), + nullableMode); + timestampArithmeticExpr.setNullableFromNereids(arithmetic.nullable()); + return timestampArithmeticExpr; } @Override @@ -583,7 +633,9 @@ public class ExpressionTranslator extends DefaultExpressionVisitor expression.accept(this, context)) .collect(Collectors.toList())); - return new FunctionCallExpr(udf.getCatalogFunction(), exprs); + FunctionCallExpr functionCallExpr = new FunctionCallExpr(udf.getCatalogFunction(), exprs); + functionCallExpr.setNullableFromNereids(udf.nullable()); + return functionCallExpr; } @Override @@ -655,7 +712,9 @@ public class ExpressionTranslator extends DefaultExpressionVisitor expression.accept(this, context)) .collect(Collectors.toList())); - return new FunctionCallExpr(udaf.getCatalogFunction(), exprs); + FunctionCallExpr functionCallExpr = new FunctionCallExpr(udaf.getCatalogFunction(), exprs); + functionCallExpr.setNullableFromNereids(udaf.nullable()); + return functionCallExpr; } // TODO: Supports for `distinct` @@ -698,6 +757,7 @@ public class ExpressionTranslator extends DefaultExpressionVisitor