This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new f2475136b40 [fix](Nereids) set operation output nullable maybe wrong 
(#39109) (#39444)
f2475136b40 is described below

commit f2475136b4083cb9d1983e894280e636b76ab781
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Fri Aug 16 11:39:17 2024 +0800

    [fix](Nereids) set operation output nullable maybe wrong (#39109) (#39444)
    
    pick from master #39109
    
    when first regulator child output nullable is not right, we may get
    wrong nullable output, and lead be crash
---
 .../nereids/rules/rewrite/AdjustNullable.java      | 15 ++---
 .../adjust_nullable/set_operation.groovy           | 67 ++++++++++++++++++++--
 2 files changed, 65 insertions(+), 17 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustNullable.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustNullable.java
index 03274defb75..b3c0d77b1e7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustNullable.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AdjustNullable.java
@@ -26,7 +26,6 @@ import 
org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.OrderExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
-import org.apache.doris.nereids.trees.expressions.functions.ExpressionTrait;
 import org.apache.doris.nereids.trees.expressions.functions.Function;
 import 
org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
 import org.apache.doris.nereids.trees.plans.Plan;
@@ -57,7 +56,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * because some rule could change output's nullable.
@@ -145,8 +143,10 @@ public class AdjustNullable extends 
DefaultPlanRewriter<Map<ExprId, Slot>> imple
         ImmutableList.Builder<List<SlotReference>> newChildrenOutputs = 
ImmutableList.builder();
         List<Boolean> inputNullable = null;
         if (!setOperation.children().isEmpty()) {
-            inputNullable = setOperation.getRegularChildOutput(0).stream()
-                    
.map(ExpressionTrait::nullable).collect(Collectors.toList());
+            inputNullable = 
Lists.newArrayListWithCapacity(setOperation.getOutputs().size());
+            for (int i = 0; i < setOperation.getOutputs().size(); i++) {
+                inputNullable.add(false);
+            }
             for (int i = 0; i < setOperation.arity(); i++) {
                 List<Slot> childOutput = setOperation.child(i).getOutput();
                 List<SlotReference> setChildOutput = 
setOperation.getRegularChildOutput(i);
@@ -262,13 +262,6 @@ public class AdjustNullable extends 
DefaultPlanRewriter<Map<ExprId, Slot>> imple
         return inputs.stream().map(i -> updateExpression(i, 
replaceMap)).collect(ImmutableSet.toImmutableSet());
     }
 
-    private Map<ExprId, Slot> collectChildrenOutputMap(LogicalPlan plan) {
-        return plan.children().stream()
-                .map(Plan::getOutputSet)
-                .flatMap(Set::stream)
-                .collect(Collectors.toMap(NamedExpression::getExprId, s -> s));
-    }
-
     private static class SlotReferenceReplacer extends 
DefaultExpressionRewriter<Map<ExprId, Slot>> {
         public static SlotReferenceReplacer INSTANCE = new 
SlotReferenceReplacer();
 
diff --git 
a/regression-test/suites/nereids_rules_p0/adjust_nullable/set_operation.groovy 
b/regression-test/suites/nereids_rules_p0/adjust_nullable/set_operation.groovy
index 1eba278c6b4..0d3017b939c 100644
--- 
a/regression-test/suites/nereids_rules_p0/adjust_nullable/set_operation.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/adjust_nullable/set_operation.groovy
@@ -18,29 +18,84 @@
 suite("test_set_operation_adjust_nullable") {
 
     sql """
-        DROP TABLE IF EXISTS t1
+        DROP TABLE IF EXISTS set_operation_t1
     """
     sql """
-        DROP TABLE IF EXISTS t2
+        DROP TABLE IF EXISTS set_operation_t2
     """
 
     sql """
-        CREATE TABLE t1(c1 varchar) DISTRIBUTED BY hash(c1) PROPERTIES 
("replication_num" = "1");
+        CREATE TABLE set_operation_t1(c1 varchar) DISTRIBUTED BY hash(c1) 
PROPERTIES ("replication_num" = "1");
     """
 
     sql """
-        CREATE TABLE t2(c2 date) DISTRIBUTED BY hash(c2) PROPERTIES 
("replication_num" = "1");
+        CREATE TABLE set_operation_t2(c2 date) DISTRIBUTED BY hash(c2) 
PROPERTIES ("replication_num" = "1");
     """
 
     sql """
-        insert into t1 values('+06-00');
+        insert into set_operation_t1 values('+06-00');
     """
 
     sql """
-        insert into t2 values('1990-11-11');
+        insert into set_operation_t2 values('1990-11-11');
     """
 
     sql """
         SELECT c1, c1 FROM t1 EXCEPT SELECT c2, c2 FROM t2;
     """
+
+    // do not use regulator child output nullable as init nullable info
+
+    sql """
+        DROP TABLE IF EXISTS set_operation_t1
+    """
+    sql """
+        DROP TABLE IF EXISTS set_operation_t2
+    """
+
+    sql """
+        create table set_operation_t1 (
+            pk int,
+            c1 char(25)  not null  ,
+            c2 varchar(100)  null  ,
+        )
+        distributed by hash(pk) buckets 10
+        properties("replication_num" = "1");
+    """
+
+    sql """insert into set_operation_t1 values (1, '1', '1');"""
+
+    sql """
+        create table set_operation_t2 (
+            c3 varchar(100)  not null  ,
+            pk int
+        )
+        distributed by hash(pk) buckets 10
+        properties("replication_num" = "1");
+    """
+
+    sql """insert into set_operation_t2 values ('1', 1);"""
+
+    sql """
+        select
+            c2,
+            c1
+        from
+            set_operation_t1
+        order by
+            1,
+            2 asc
+        limit
+            0
+        union distinct
+        select
+            c3,
+            c3
+        from
+            set_operation_t2
+        except
+        select
+            'LDvlqYTfrq',
+            'rVdUjeSaJW';
+    """
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to