fix nestloop sql hang inner 1651 (#3152)

This commit is contained in:
ylinzhu
2022-02-25 14:38:20 +08:00
committed by GitHub
parent 3717fa7b44
commit a8710dfdf7
3 changed files with 23 additions and 5 deletions
@@ -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<DelayTableHandler> delayTableHandlers = hintNestLoopHelper.getDelayTableHandlers(node);
Map<PlanNode, SendMakeHandler> sendMakeHandlerHashMap = hintNestLoopHelper.getSendMakeHandlerHashMap();
Set<BaseDMLHandler> tableHandlers = sh.getTableHandlers();
for (DelayTableHandler delayTableHandler : delayTableHandlers) {
if (!tableHandlers.contains(delayTableHandler)) {
tableHandlers.add(delayTableHandler);
}
}
sendMakeHandlerHashMap.put(node, sh);
}
}
@@ -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<DelayTableHandler> getDelayTableHandlers(PlanNode node) {
List<DelayTableHandler> delayTableHandlerList = Optional.ofNullable(delayTableHandlerMap.get(node)).orElse(new ArrayList<>());
if (delayTableHandlerList.isEmpty()) {
delayTableHandlerMap.put(node, delayTableHandlerList);
}
return delayTableHandlerList;
}
public Map<PlanNode, Pair<Item, Item>> getItemMap() {
return itemMap;
}
@@ -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<HintPlanNode> nodes = v.getNodes();
for (HintPlanNode node : nodes) {
PlanNode dependNode = nodeMap.get(node.getName());