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

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit aefb7ce49f5521beb3a7eb22797462cc6426a1bb
Author: starocean999 <[email protected]>
AuthorDate: Wed Feb 15 12:44:20 2023 +0800

    [fix](fe)should check slot from both lhs and rhs of outputSmap of join node 
for colocate join (#16738)
    
    colocated join is depended on if the both side of the join conjuncts are 
simple column with same distribution policy etc. So the key is to figure out 
the original source column in scan node if there is one. To do that, we should 
check the slot from both lhs and rhs of outputSmap in join node.
---
 .../org/apache/doris/planner/HashJoinNode.java     |  6 ++-
 .../correctness_p0/test_colocate_join.groovy       | 46 +++++++++++++++++++++-
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
index 2fc14357a9..e3dd215de3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
@@ -849,7 +849,11 @@ public class HashJoinNode extends JoinNodeBase {
             if (mappedExpr != null && mappedExpr instanceof SlotRef) {
                 return (SlotRef) mappedExpr;
             } else {
-                return null;
+                if (outputSmap.containsMappingFor(slotRef)) {
+                    return slotRef;
+                } else {
+                    return null;
+                }
             }
         } else {
             return slotRef;
diff --git a/regression-test/suites/correctness_p0/test_colocate_join.groovy 
b/regression-test/suites/correctness_p0/test_colocate_join.groovy
index 63d84f5b99..45e4e57bd3 100644
--- a/regression-test/suites/correctness_p0/test_colocate_join.groovy
+++ b/regression-test/suites/correctness_p0/test_colocate_join.groovy
@@ -19,6 +19,9 @@ suite("test_colocate_join") {
     sql """ DROP TABLE IF EXISTS `test_colo1` """
     sql """ DROP TABLE IF EXISTS `test_colo2` """
     sql """ DROP TABLE IF EXISTS `test_colo3` """
+    sql """ DROP TABLE IF EXISTS `test_colo4` """
+    sql """ DROP TABLE IF EXISTS `test_colo5` """
+
     sql """
         CREATE TABLE `test_colo1` (
         `id` varchar(64) NULL,
@@ -36,6 +39,7 @@ suite("test_colocate_join") {
         "disable_auto_compaction" = "false"
         );
     """
+
     sql """
         CREATE TABLE `test_colo2` (
         `id` varchar(64) NULL,
@@ -72,12 +76,52 @@ suite("test_colocate_join") {
         );
     """
 
+    sql """
+        CREATE TABLE `test_colo4` (
+        `id` varchar(64) NULL,
+        `name` varchar(64) NULL,
+        `age` int NULL
+        ) ENGINE=OLAP
+        DUPLICATE KEY(`id`,`name`)
+        COMMENT 'OLAP'
+        DISTRIBUTED BY HASH(`id`,`name`) BUCKETS 4
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1",
+        "colocate_with" = "group",
+        "in_memory" = "false",
+        "storage_format" = "V2",
+        "disable_auto_compaction" = "false"
+        );
+    """
+
+    sql """
+        CREATE TABLE `test_colo5` (
+        `id` varchar(64) NULL,
+        `name` varchar(64) NULL,
+        `age` int NULL
+        ) ENGINE=OLAP
+        DUPLICATE KEY(`id`,`name`)
+        COMMENT 'OLAP'
+        DISTRIBUTED BY HASH(`id`,`name`) BUCKETS 4
+        PROPERTIES (
+        "replication_allocation" = "tag.location.default: 1",
+        "colocate_with" = "group",
+        "in_memory" = "false",
+        "storage_format" = "V2",
+        "disable_auto_compaction" = "false"
+        );
+    """
+
     sql """insert into test_colo1 values('1','a',12);"""
     sql """insert into test_colo2 values('1','a',12);"""
     sql """insert into test_colo3 values('1','a',12);"""
+    sql """insert into test_colo4 values('1','a',12);"""
+    sql """insert into test_colo5 values('1','a',12);"""
 
     explain {
-        sql("select a.id,a.name,b.id,b.name,c.id,c.name from test_colo1 a 
inner join test_colo2 b on a.id = b.id and a.name = b.name inner join 
test_colo3 c on a.id=c.id and a.name= c.name")
+        sql("select * from test_colo1 a inner join test_colo2 b on a.id = b.id 
and a.name = b.name inner join test_colo3 c on a.id=c.id and a.name= c.name 
inner join test_colo4 d on a.id=d.id and a.name= d.name inner join test_colo5 e 
on a.id=e.id and a.name= e.name;")
+        contains "8:VHASH JOIN\n  |  join op: INNER JOIN(COLOCATE[])[]"
+        contains "6:VHASH JOIN\n  |  join op: INNER JOIN(COLOCATE[])[]"
         contains "4:VHASH JOIN\n  |  join op: INNER JOIN(COLOCATE[])[]"
         contains "2:VHASH JOIN\n  |  join op: INNER JOIN(COLOCATE[])[]"
     }


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

Reply via email to