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 94c429d81ea888..3c82013d920128 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 @@ -466,6 +466,12 @@ private boolean canColocateJoin(HashJoinNode node, PlanFragment leftChildFragmen return false; } + // If user have a join hint to use proper way of join, can not be colocate join + if (node.getInnerRef().hasJoinHints()) { + cannotReason.add("Has join hint"); + return false; + } + PlanNode leftRoot = leftChildFragment.getPlanRoot(); PlanNode rightRoot = rightChildFragment.getPlanRoot(); 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 006a402f048ab8..4b482b8b4f2a48 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 @@ -917,6 +917,10 @@ public void testColocateJoin() throws Exception { String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); Assert.assertTrue(explainString.contains("colocate: true")); + queryStr = "explain select * from test.colocate1 t1 join [shuffle] test.colocate2 t2 on t1.k1 = t2.k1 and t1.k2 = t2.k2"; + explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr); + Assert.assertTrue(explainString.contains("colocate: false")); + // 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);