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]

Reply via email to