This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.1 by this push:
new 34882045ff3 branch-3.1: [fix](nereids) set
CompoundPredicate.nullableFromNereids after flattern and/or #54353 (#54704)
34882045ff3 is described below
commit 34882045ff37664683c8811585862031543c8c95
Author: minghong <[email protected]>
AuthorDate: Thu Aug 14 11:55:54 2025 +0800
branch-3.1: [fix](nereids) set CompoundPredicate.nullableFromNereids after
flattern and/or #54353 (#54704)
picked from #54353
---
.../main/java/org/apache/doris/analysis/Expr.java | 4 ++++
.../glue/translator/ExpressionTranslator.java | 11 +++++++++++
.../glue/translator/ExpressionTranslatorTest.java | 23 ++++++++++++++++++++++
3 files changed, 38 insertions(+)
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 ee3fdbe9027..653fb92003a 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
@@ -2608,5 +2608,9 @@ public abstract class Expr extends TreeNode<Expr>
implements ParseNode, Cloneabl
public void setNullableFromNereids(boolean nullable) {
nullableFromNereids = Optional.of(nullable);
}
+
+ public Optional<Boolean> getNullableFromNereids() {
+ return nullableFromNereids;
+ }
}
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 74ed16f135a..6b914435ce8 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
@@ -326,6 +326,15 @@ public class ExpressionTranslator extends
DefaultExpressionVisitor<Expr, PlanTra
}
}
+ private boolean computeCompoundPredicateNullable(CompoundPredicate cp) {
+ Expr left = cp.getChild(0);
+ Expr right = cp.getChild(1);
+ return left.getNullableFromNereids().isPresent() &&
left.getNullableFromNereids().get()
+ || !left.getNullableFromNereids().isPresent() && left.isNullable()
+ || right.getNullableFromNereids().isPresent() &&
right.getNullableFromNereids().get()
+ || !right.getNullableFromNereids().isPresent() &&
right.isNullable();
+ }
+
private Expr toBalancedTree(int low, int high, List<Expr> children,
CompoundPredicate.Operator op) {
Deque<Frame> stack = new ArrayDeque<>();
@@ -348,6 +357,7 @@ public class ExpressionTranslator extends
DefaultExpressionVisitor<Expr, PlanTra
Expr left = children.get(l);
Expr right = children.get(h);
CompoundPredicate cp = new CompoundPredicate(op, left,
right);
+
cp.setNullableFromNereids(computeCompoundPredicateNullable(cp));
results.push(cp);
stack.pop();
} else {
@@ -364,6 +374,7 @@ public class ExpressionTranslator extends
DefaultExpressionVisitor<Expr, PlanTra
Expr right = results.pop();
Expr left = results.pop();
CompoundPredicate cp = new
CompoundPredicate(currentFrame.op, left, right);
+
cp.setNullableFromNereids(computeCompoundPredicateNullable(cp));
results.push(cp);
}
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/ExpressionTranslatorTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/ExpressionTranslatorTest.java
index ccfbce80589..b8ab98411bd 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/ExpressionTranslatorTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/ExpressionTranslatorTest.java
@@ -21,15 +21,20 @@ import org.apache.doris.analysis.ArithmeticExpr;
import org.apache.doris.analysis.ArithmeticExpr.Operator;
import org.apache.doris.analysis.Expr;
import org.apache.doris.analysis.IntLiteral;
+import org.apache.doris.analysis.SlotRef;
import org.apache.doris.catalog.Function.NullableMode;
import org.apache.doris.catalog.Type;
import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.trees.expressions.BitNot;
import org.apache.doris.nereids.trees.expressions.MatchAny;
+import org.apache.doris.nereids.trees.expressions.Or;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
import org.apache.doris.nereids.trees.expressions.literal.VarcharLiteral;
+import org.apache.doris.nereids.types.IntegerType;
+import com.google.common.collect.ImmutableList;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -51,4 +56,22 @@ public class ExpressionTranslatorTest {
ExpressionTranslator translator = ExpressionTranslator.INSTANCE;
Assertions.assertThrows(AnalysisException.class, () ->
translator.visitMatch(matchAny, null));
}
+
+ @Test
+ public void testFlattenAndOrNullable() {
+ SlotReference a = new SlotReference("a", IntegerType.INSTANCE, true);
+ SlotReference b = new SlotReference("b", IntegerType.INSTANCE, false);
+ SlotReference c = new SlotReference("c", IntegerType.INSTANCE, false);
+ Or or = new Or(ImmutableList.of(a, b, c));
+ ExpressionTranslator translator = ExpressionTranslator.INSTANCE;
+ PlanTranslatorContext context = new PlanTranslatorContext();
+
+ context.addExprIdSlotRefPair(a.getExprId(), new SlotRef(Type.VARCHAR,
true));
+ context.addExprIdSlotRefPair(b.getExprId(), new SlotRef(Type.VARCHAR,
false));
+ context.addExprIdSlotRefPair(c.getExprId(), new SlotRef(Type.VARCHAR,
false));
+
+ Expr actual = translator.visitOr(or, context);
+
Assertions.assertTrue(actual.getChild(0).getNullableFromNereids().isPresent()
+ && actual.getNullableFromNereids().get());
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]