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

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new acf5540a9f [fix](planner)Fix colocate query failed #16459
acf5540a9f is described below

commit acf5540a9fcaf4e0565e8566119eeea5b31cea82
Author: wangbo <[email protected]>
AuthorDate: Tue Feb 14 18:51:28 2023 +0800

    [fix](planner)Fix colocate query failed #16459
    
    Issue Number: close #16458
    Co-authored-by: [email protected] <[email protected]>
---
 .../apache/doris/planner/DistributedPlanner.java   | 10 +++-
 .../org/apache/doris/planner/OlapScanNode.java     |  4 ++
 .../correctness_p0/test_colocate_join.groovy       | 68 ++++++++++++++++++++++
 3 files changed, 80 insertions(+), 2 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/DistributedPlanner.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/DistributedPlanner.java
index 89c491165a..66027f558e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/DistributedPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/DistributedPlanner.java
@@ -539,8 +539,14 @@ public class DistributedPlanner {
         // they are naturally colocate relationship no need to check colocate 
group
         Collection<Long> leftPartitions = leftRoot.getSelectedPartitionIds();
         Collection<Long> rightPartitions = rightRoot.getSelectedPartitionIds();
-        boolean noNeedCheckColocateGroup = (leftTable.getId() == 
rightTable.getId())
-                && (leftPartitions.equals(rightPartitions)) && 
(leftPartitions.size() <= 1);
+
+        // For UT or no partition is selected, getSelectedIndexId() == -1, see 
selectMaterializedView()
+        boolean hitSameIndex = (leftTable.getId() == rightTable.getId())
+                && (leftRoot.getSelectedIndexId() != -1 && 
rightRoot.getSelectedIndexId() != -1)
+                && (leftRoot.getSelectedIndexId() == 
rightRoot.getSelectedIndexId());
+
+        boolean noNeedCheckColocateGroup = hitSameIndex && 
(leftPartitions.equals(rightPartitions))
+                && (leftPartitions.size() <= 1);
 
         if (!noNeedCheckColocateGroup) {
             ColocateTableIndex colocateIndex = Env.getCurrentColocateIndex();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
index 84ad12ee62..e18c907b60 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
@@ -321,6 +321,10 @@ public class OlapScanNode extends ScanNode {
         this.selectedIndexId = olapTable.getBaseIndexId();
     }
 
+    public long getSelectedIndexId() {
+        return selectedIndexId;
+    }
+
     /**
      * This method is mainly used to update scan range info in OlapScanNode by 
the
      * new materialized selector.
diff --git a/regression-test/suites/correctness_p0/test_colocate_join.groovy 
b/regression-test/suites/correctness_p0/test_colocate_join.groovy
index 6b1e81eb80..63d84f5b99 100644
--- a/regression-test/suites/correctness_p0/test_colocate_join.groovy
+++ b/regression-test/suites/correctness_p0/test_colocate_join.groovy
@@ -81,4 +81,72 @@ suite("test_colocate_join") {
         contains "4:VHASH JOIN\n  |  join op: INNER JOIN(COLOCATE[])[]"
         contains "2:VHASH JOIN\n  |  join op: INNER JOIN(COLOCATE[])[]"
     }
+
+    /* test join same table but hit different rollup, should disable colocate 
join */
+    sql """ DROP TABLE IF EXISTS `test_query_colocate`;"""
+
+    sql """
+            CREATE TABLE `test_query_colocate` (
+              `datekey` int(11) NULL,
+              `rollup_1_condition` int null,
+              `rollup_2_condition` int null,
+              `sum_col1` bigint(20) SUM NULL,
+              `sum_col2` bigint(20) SUM NULL
+            ) ENGINE=OLAP
+            AGGREGATE KEY(`datekey`,`rollup_1_condition`,`rollup_2_condition`)
+            COMMENT ""
+            PARTITION BY RANGE(`datekey`)
+            (PARTITION p20220102 VALUES [("20220101"), ("20220102")),
+            PARTITION p20220103 VALUES [("20220102"), ("20220103")))
+            DISTRIBUTED BY HASH(`datekey`) BUCKETS 1
+            rollup (
+            rollup_1(datekey, sum_col1),
+            rollup_2(datekey, sum_col2)
+            )
+            PROPERTIES (
+                "replication_allocation" = "tag.location.default: 1",
+                "in_memory" = "false",
+                "storage_format" = "V2"
+            )
+    """
+
+    sql """insert into test_query_colocate values
+            (20220101, 102, 200, 200, 100),
+            (20220101, 101, 200, 200, 100),
+            (20220101, 102, 202, 200, 100),
+            (20220101, 101, 202, 200, 100);"""
+
+    explain {
+        sql("select " +
+                " sum_col1,sum_col2 " +
+                "from " +
+                "(select datekey,sum(sum_col1) as sum_col1  from 
test_query_colocate where datekey=20220101 group by datekey) t1 " +
+                "left join " +
+                "(select datekey,sum(sum_col2) as sum_col2 from 
test_query_colocate where datekey=20220101 group by datekey) t2 " +
+                "on t1.datekey = t2.datekey")
+        contains "Tables are not in the same group"
+    }
+
+    sql """ DROP TABLE IF EXISTS `test_query_colocate` """
+
+    /* test no rollup is selected */
+    sql """ DROP TABLE IF EXISTS `tbl1`;"""
+    sql """ DROP TABLE IF EXISTS `tbl2`;"""
+
+    sql """
+           create table tbl1(k1 int, k2 varchar(32), v bigint sum) AGGREGATE 
KEY(k1,k2) distributed by hash(k1) buckets 1 properties('replication_num' = 
'1');
+    """
+
+    sql """
+            create table tbl2(k3 int, k4 varchar(32)) DUPLICATE KEY(k3) 
distributed by hash(k3) buckets 1 properties('replication_num' = '1');
+    """
+
+    explain {
+        sql("select * from tbl1 join tbl2 on tbl1.k1 = tbl2.k3")
+        contains "INNER JOIN"
+    }
+
+    sql """ DROP TABLE IF EXISTS `tbl1`;"""
+    sql """ DROP TABLE IF EXISTS `tbl2`;"""
+
 }


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

Reply via email to