diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/BaseHandlerBuilder.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/BaseHandlerBuilder.java index 71ff2dd7d..7cc62bc9f 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/BaseHandlerBuilder.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/BaseHandlerBuilder.java @@ -7,6 +7,7 @@ package com.actiontech.dble.backend.mysql.nio.handler.builder; import com.actiontech.dble.DbleServer; import com.actiontech.dble.backend.mysql.nio.handler.builder.sqlvisitor.GlobalVisitor; +import com.actiontech.dble.backend.mysql.nio.handler.query.BaseDMLHandler; import com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler; import com.actiontech.dble.backend.mysql.nio.handler.query.impl.*; import com.actiontech.dble.backend.mysql.nio.handler.query.impl.groupby.AggregateHandler; @@ -371,7 +372,16 @@ public abstract class BaseHandlerBuilder { private void nestLoopAddHandler(SendMakeHandler sh) { if (node instanceof TableNode && Objects.nonNull(((TableNode) node).getHintNestLoopHelper())) { HintNestLoopHelper hintNestLoopHelper = ((TableNode) node).getHintNestLoopHelper(); - hintNestLoopHelper.getSendMakeHandlerHashMap().put(node, sh); + List delayTableHandlers = hintNestLoopHelper.getDelayTableHandlers(node); + Map sendMakeHandlerHashMap = hintNestLoopHelper.getSendMakeHandlerHashMap(); + Set tableHandlers = sh.getTableHandlers(); + for (DelayTableHandler delayTableHandler : delayTableHandlers) { + if (!tableHandlers.contains(delayTableHandler)) { + tableHandlers.add(delayTableHandler); + } + } + sendMakeHandlerHashMap.put(node, sh); + } } diff --git a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/HintNestLoopHelper.java b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/HintNestLoopHelper.java index 1b06977de..48917a52e 100644 --- a/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/HintNestLoopHelper.java +++ b/src/main/java/com/actiontech/dble/backend/mysql/nio/handler/builder/HintNestLoopHelper.java @@ -6,9 +6,7 @@ import com.actiontech.dble.plan.common.item.Item; import com.actiontech.dble.plan.node.PlanNode; import com.actiontech.dble.route.parser.util.Pair; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class HintNestLoopHelper { @@ -24,6 +22,14 @@ public class HintNestLoopHelper { return delayTableHandlerMap; } + public List getDelayTableHandlers(PlanNode node) { + List delayTableHandlerList = Optional.ofNullable(delayTableHandlerMap.get(node)).orElse(new ArrayList<>()); + if (delayTableHandlerList.isEmpty()) { + delayTableHandlerMap.put(node, delayTableHandlerList); + } + return delayTableHandlerList; + } + public Map> getItemMap() { return itemMap; } diff --git a/src/main/java/com/actiontech/dble/plan/optimizer/JoinNestLoopChooser.java b/src/main/java/com/actiontech/dble/plan/optimizer/JoinNestLoopChooser.java index 020e2e0ac..4bc992742 100644 --- a/src/main/java/com/actiontech/dble/plan/optimizer/JoinNestLoopChooser.java +++ b/src/main/java/com/actiontech/dble/plan/optimizer/JoinNestLoopChooser.java @@ -113,7 +113,9 @@ public class JoinNestLoopChooser { private void hintAndCheck() { hintDependMap.forEach((k, v) -> { PlanNode currentNode = nodeMap.get(k); - if (v.getType() == HintPlanNodeGroup.Type.AND) { + if (v.getType() == HintPlanNodeGroup.Type.ER) { + throw new MySQLOutPutException(ErrorCode.ER_OPTIMIZER, "", " not support hint explain .The ER relation is only allowed in the first place"); + } else { List nodes = v.getNodes(); for (HintPlanNode node : nodes) { PlanNode dependNode = nodeMap.get(node.getName());