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

kxiao 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 dac95f13750 [fix](nereids)fix bug of eliminate outer join (#32679)
dac95f13750 is described below

commit dac95f13750894a53e55bef751fe876bc1de66b4
Author: starocean999 <[email protected]>
AuthorDate: Fri Mar 22 19:10:53 2024 +0800

    [fix](nereids)fix bug of eliminate outer join (#32679)
---
 .../nereids/rules/rewrite/EliminateOuterJoin.java  |  6 ++--
 .../doris/nereids/stats/StatsCalculator.java       |  8 ++---
 .../data/nereids_p0/join/test_outer_join.out       | 37 ++++++++++++++++++++++
 .../suites/nereids_p0/join/test_outer_join.groovy  | 36 +++++++++++++++++++++
 4 files changed, 81 insertions(+), 6 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateOuterJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateOuterJoin.java
index 8c4069badc5..228db1bad37 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateOuterJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateOuterJoin.java
@@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.rewrite;
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.trees.expressions.EqualPredicate;
+import org.apache.doris.nereids.trees.expressions.EqualTo;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.IsNull;
 import org.apache.doris.nereids.trees.expressions.Not;
@@ -89,7 +90,8 @@ public class EliminateOuterJoin extends OneRewriteRuleFactory 
{
                  * TODO: is_not_null can also be inferred from A < B and so on
                  */
                 conjunctsChanged |= join.getHashJoinConjuncts().stream()
-                        .map(EqualPredicate.class::cast)
+                        .filter(EqualTo.class::isInstance)
+                        .map(EqualTo.class::cast)
                         .map(equalTo -> 
JoinUtils.swapEqualToForChildrenOrder(equalTo, join.left().getOutputSet()))
                         .anyMatch(equalTo -> 
createIsNotNullIfNecessary(equalTo, conjuncts));
 
@@ -97,7 +99,7 @@ public class EliminateOuterJoin extends OneRewriteRuleFactory 
{
                         join.left().getOutput(),
                         join.right().getOutput());
                 conjunctsChanged |= join.getOtherJoinConjuncts().stream()
-                        .filter(EqualPredicate.class::isInstance)
+                        .filter(EqualTo.class::isInstance)
                         .filter(equalTo -> 
checker.isHashJoinCondition((EqualPredicate) equalTo))
                         .map(equalTo -> 
JoinUtils.swapEqualToForChildrenOrder((EqualPredicate) equalTo,
                                 join.left().getOutputSet()))
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
index 03f15e5441b..f9b767f40c8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
@@ -806,7 +806,7 @@ public class StatsCalculator extends 
DefaultPlanVisitor<Statistics, Void> {
                             .setNumNulls(stats.numNulls < 0 ? stats.numNulls : 
stats.numNulls * groupingSetNum)
                             .setDataSize(stats.dataSize < 0 ? stats.dataSize : 
stats.dataSize * groupingSetNum);
                     return Pair.of(kv.getKey(), 
columnStatisticBuilder.build());
-                }).collect(Collectors.toMap(Pair::key, Pair::value));
+                }).collect(Collectors.toMap(Pair::key, Pair::value, (item1, 
item2) -> item1));
         return new Statistics(rowCount < 0 ? rowCount : rowCount * 
groupingSetNum, columnStatisticMap);
     }
 
@@ -827,7 +827,7 @@ public class StatsCalculator extends 
DefaultPlanVisitor<Statistics, Void> {
                     // TODO: compute the literal size
                     return Pair.of(project.toSlot(), statistic);
                 })
-                .collect(Collectors.toMap(Pair::key, Pair::value));
+                .collect(Collectors.toMap(Pair::key, Pair::value, (item1, 
item2) -> item1));
         int rowCount = 1;
         return new Statistics(rowCount, columnStatsMap);
     }
@@ -842,7 +842,7 @@ public class StatsCalculator extends 
DefaultPlanVisitor<Statistics, Void> {
                             .setAvgSizeByte(0);
                     return Pair.of(project.toSlot(), columnStat.build());
                 })
-                .collect(Collectors.toMap(Pair::key, Pair::value));
+                .collect(Collectors.toMap(Pair::key, Pair::value, (item1, 
item2) -> item1));
         int rowCount = 0;
         return new Statistics(rowCount, columnStatsMap);
     }
@@ -995,7 +995,7 @@ public class StatsCalculator extends 
DefaultPlanVisitor<Statistics, Void> {
                         }
                     }
                     return Pair.of(expr.toSlot(), value);
-                }).collect(Collectors.toMap(Pair::key, Pair::value));
+                }).collect(Collectors.toMap(Pair::key, Pair::value, (item1, 
item2) -> item1));
         columnStatisticMap.putAll(childColumnStats);
         return new Statistics(stats.getRowCount(), columnStatisticMap);
     }
diff --git a/regression-test/data/nereids_p0/join/test_outer_join.out 
b/regression-test/data/nereids_p0/join/test_outer_join.out
index 9ae6731b347..a008ace73ad 100644
--- a/regression-test/data/nereids_p0/join/test_outer_join.out
+++ b/regression-test/data/nereids_p0/join/test_outer_join.out
@@ -10,3 +10,40 @@
 
 -- !join --
 
+-- !select --
+0      \N      \N
+0      \N      \N
+0      \N      \N
+0      \N      \N
+0      \N      \N
+7      \N      \N
+7      \N      \N
+7      \N      \N
+7      \N      \N
+7      \N      \N
+8      -7357378        \N
+8      -7357378        \N
+8      -7357378        \N
+8      -7357378        \N
+8      -7357378        \N
+12     -1066765        \N
+12     -1066765        \N
+12     -1066765        \N
+12     -1066765        \N
+12     -1066765        \N
+13     -4828168        \N
+13     -4828168        \N
+13     -4828168        \N
+13     -4828168        \N
+13     -4828168        \N
+14     \N      \N
+14     \N      \N
+14     \N      \N
+14     \N      \N
+14     \N      \N
+17     -67     \N
+17     -67     \N
+17     -67     \N
+17     -67     \N
+17     -67     \N
+
diff --git a/regression-test/suites/nereids_p0/join/test_outer_join.groovy 
b/regression-test/suites/nereids_p0/join/test_outer_join.groovy
index 562326175e9..06d87246e70 100644
--- a/regression-test/suites/nereids_p0/join/test_outer_join.groovy
+++ b/regression-test/suites/nereids_p0/join/test_outer_join.groovy
@@ -84,4 +84,40 @@ suite("test_outer_join", "nereids_p0") {
     sql "DROP TABLE IF EXISTS ${tbl1}"
     sql "DROP TABLE IF EXISTS ${tbl2}"
     sql "DROP TABLE IF EXISTS ${tbl3}"
+
+    sql """DROP TABLE IF EXISTS 
table_20_undef_partitions2_keys3_properties4_distributed_by511"""
+    sql """DROP TABLE IF EXISTS 
table_20_undef_partitions2_keys3_properties4_distributed_by5"""
+    sql """DROP TABLE IF EXISTS 
table_20_undef_partitions2_keys3_properties4_distributed_by52"""
+
+    sql """create table 
table_20_undef_partitions2_keys3_properties4_distributed_by511 (
+        pk int,
+        col_int_undef_signed int   ,
+        col_int_undef_signed2 int   
+        ) engine=olap
+        DUPLICATE KEY(pk, col_int_undef_signed)
+        distributed by hash(pk) buckets 10
+        properties("replication_num" = "1");"""
+    sql """create table 
table_20_undef_partitions2_keys3_properties4_distributed_by5 (
+        col_int_undef_signed int/*agg_type_placeholder*/   ,
+        col_int_undef_signed2 int/*agg_type_placeholder*/   ,
+        pk int/*agg_type_placeholder*/
+        ) engine=olap
+        distributed by hash(pk) buckets 10
+        properties("replication_num" = "1");"""
+    sql """create table 
table_20_undef_partitions2_keys3_properties4_distributed_by52 (
+        pk int,
+        col_int_undef_signed int   ,
+        col_int_undef_signed2 int   
+        ) engine=olap
+        DUPLICATE KEY(pk, col_int_undef_signed)
+        distributed by hash(pk) buckets 10
+        properties("replication_num" = "1");"""
+
+    sql """insert into 
table_20_undef_partitions2_keys3_properties4_distributed_by511(pk,col_int_undef_signed,col_int_undef_signed2)
 values 
(0,null,null),(1,-107,-2457422),(2,8286200,null),(3,18368,4386195),(4,-10561,7625),(5,null,4867223),(6,-31,28390),(7,null,null),(8,null,-7357378),(9,3603478,21),(10,4000423,118),(11,8153660,2),(12,null,-1066765),(13,null,-4828168),(14,-5083340,null),(15,85,-394),(16,3350274,-4843280),(17,-2460711,-67),(18,-24998,-113),(19,-72,-3137671);"""
+    sql """insert into 
table_20_undef_partitions2_keys3_properties4_distributed_by5(pk,col_int_undef_signed,col_int_undef_signed2)
 values 
(0,6447625,-1027468),(1,null,null),(2,31378,null),(3,9,8081971),(4,-7503885,null),(5,null,-20883),(6,null,110),(7,12780,-22854),(8,null,121),(9,7121676,113),(10,-13201,29890),(11,null,-72),(12,8150635,null),(13,null,-49),(14,8319897,null),(15,3239704,null),(16,-8463,21764),(17,null,-17255),(18,7123047,-110),(19,null,10);"""
+    sql """insert into 
table_20_undef_partitions2_keys3_properties4_distributed_by52(pk,col_int_undef_signed,col_int_undef_signed2)
 values 
(0,112,-15490),(1,973,-5913694),(2,null,-2259045),(3,null,null),(4,123,8378),(5,95,-16),(6,26099,-7768794),(7,31987,-2510),(8,null,28),(9,-50,-25696),(10,7367,37),(11,2707848,11007),(12,3,4023643),(13,-6478416,null),(14,4705,null),(15,-2399593,null),(16,-3102,4779393),(17,89,null),(18,-3296249,53),(19,26846,108);"""
+    qt_select """SELECT T1.pk, T1.col_int_undef_signed2, T2 . 
col_int_undef_signed FROM 
table_20_undef_partitions2_keys3_properties4_distributed_by511 AS T1  
+                LEFT JOIN  
table_20_undef_partitions2_keys3_properties4_distributed_by5 AS T2 ON 
T1.col_int_undef_signed  >=  T2.col_int_undef_signed2  
+                RIGHT JOIN  
table_20_undef_partitions2_keys3_properties4_distributed_by52 AS T3 ON 
T2.col_int_undef_signed2  <=>  T3.col_int_undef_signed2 
+                WHERE T3.pk  >=  1  AND  T1.pk  <>  5 order by 1, 2, 3;"""
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to