mirror of
https://github.com/actiontech/dble.git
synced 2026-05-12 17:39:21 -05:00
fix nestloop sql hang inner 1651 (#3152)
This commit is contained in:
+11
-1
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+9
-3
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user