This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push: new 47fff68 [Bug][ColocateJoin] Fix bug of #4287 and #4285 of Colocatejoin (#4289) 47fff68 is described below commit 47fff6841b9f8cd3d5af15a2ae4fad87b4f60712 Author: HappenLee <happen...@hotmail.com> AuthorDate: Sun Aug 9 20:48:36 2020 +0800 [Bug][ColocateJoin] Fix bug of #4287 and #4285 of Colocatejoin (#4289) 1.Table join itself should have same single partition to valid colocate join. 2.Check eqjoinConjuncts column order to valid colocate join. --- .../apache/doris/planner/DistributedPlanner.java | 24 +++++++++++++++++----- .../org/apache/doris/planner/QueryPlanTest.java | 15 ++++++++++++++ 2 files changed, 34 insertions(+), 5 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 429076f..d886677 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 @@ -45,6 +45,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -494,9 +495,14 @@ public class DistributedPlanner { OlapTable leftTable = ((OlapScanNode) leftRoot).getOlapTable(); OlapTable rightTable = ((OlapScanNode) rightRoot).getOlapTable(); - // if left table and right table is same table, they are naturally colocate relationship - // no need to check colocate group - if (leftTable.getId() != rightTable.getId()) { + // if left table and right table is same table and they select same single partition or no partition + // they are naturally colocate relationship no need to check colocate group + Collection<Long> leftPartitions = ((OlapScanNode)leftRoot).getSelectedPartitionIds(); + Collection<Long> rightPartitions = ((OlapScanNode)rightRoot).getSelectedPartitionIds(); + boolean noNeedCheckColocateGroup = (leftTable.getId() == rightTable.getId()) && (leftPartitions.equals(rightPartitions)) && + (leftPartitions.size() <= 1); + + if (!noNeedCheckColocateGroup) { ColocateTableIndex colocateIndex = Catalog.getCurrentColocateIndex(); //1 the table must be colocate @@ -533,8 +539,16 @@ public class DistributedPlanner { SlotDescriptor leftSlot = lhsJoinExpr.unwrapSlotRef().getDesc(); SlotDescriptor rightSlot = rhsJoinExpr.unwrapSlotRef().getDesc(); - leftJoinColumns.add(leftSlot.getColumn()); - rightJoinColumns.add(rightSlot.getColumn()); + Column leftColumn = leftSlot.getColumn(); + Column rightColumn = rightSlot.getColumn(); + int leftColumnIndex = leftDistributeColumns.indexOf(leftColumn); + int rightColumnIndex = rightDistributeColumns.indexOf(rightColumn); + + // eqjoinConjuncts column should have the same order like colocate distribute column + if (leftColumnIndex == rightColumnIndex && leftColumnIndex != -1) { + leftJoinColumns.add(leftSlot.getColumn()); + rightJoinColumns.add(rightSlot.getColumn()); + } } //3 the join columns should contains all distribute columns to enable colocate join diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java index 57ebc3c..b9eb997 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -886,10 +886,17 @@ public class QueryPlanTest { @Test public void testColocateJoin() throws Exception { + FeConstants.runningUnitTest = true; + String queryStr = "explain select * from test.colocate1 t1, test.colocate2 t2 where t1.k1 = t2.k1 and t1.k2 = t2.k2 and t1.k3 = t2.k3"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); Assert.assertTrue(explainString.contains("colocate: true")); + // t1.k1 = t2.k2 not same order with distribute column + queryStr = "explain select * from test.colocate1 t1, test.colocate2 t2 where t1.k1 = t2.k2 and t1.k2 = t2.k1 and t1.k3 = t2.k3"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); + Assert.assertTrue(explainString.contains("colocate: false")); + queryStr = "explain select * from test.colocate1 t1, test.colocate2 t2 where t1.k2 = t2.k2"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); Assert.assertTrue(explainString.contains("colocate: false")); @@ -897,9 +904,17 @@ public class QueryPlanTest { @Test public void testSelfColocateJoin() throws Exception { + FeConstants.runningUnitTest = true; + + // single partition String queryStr = "explain select * from test.jointest t1, test.jointest t2 where t1.k1 = t2.k1"; String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); Assert.assertTrue(explainString.contains("colocate: true")); + + // multi partition, should not be colocate + queryStr = "explain select * from test.dynamic_partition t1, test.dynamic_partition t2 where t1.k1 = t2.k1"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); + Assert.assertTrue(explainString.contains("colocate: false")); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org