Merge branch 'master' into fix-1787

This commit is contained in:
ylinzhu
2022-07-07 15:40:10 +08:00
committed by GitHub
3 changed files with 13 additions and 6 deletions

View File

@@ -595,7 +595,11 @@ public abstract class BaseHandlerBuilder {
boolean tryRouteToOneNode(List<DMLResponseHandler> pres) {
List<DMLResponseHandler> merges = Lists.newArrayList();
for (DMLResponseHandler preHandler : pres) {
merges.addAll(preHandler.getMerges());
List<DMLResponseHandler> baseMerges = preHandler.getMerges();
if (HandlerBuilder.nestLoopCheck(baseMerges)) {
return false;
}
merges.addAll(baseMerges);
}
Set<String> routeNodes = HandlerBuilder.canRouteToNodes(merges);
if (routeNodes != null && routeNodes.size() > 0) {

View File

@@ -128,15 +128,19 @@ public class HandlerBuilder {
}
public boolean canAsWholeToSingle(List<DMLResponseHandler> merges) {
if (merges.size() != 1)
if (merges.size() != 1 || nestLoopCheck(merges))
return false;
return true;
}
public static boolean nestLoopCheck(List<DMLResponseHandler> merges) {
DMLResponseHandler next = merges.get(0).getNextHandler();
while (next != null) {
if (next instanceof TempTableHandler || (next instanceof SendMakeHandler && !((SendMakeHandler) next).getTableHandlers().isEmpty()))
return false;
return true;
next = next.getNextHandler();
}
return true;
return false;
}
// check whether the SQL can be directly sent to a single node

View File

@@ -22,7 +22,6 @@ import com.actiontech.dble.route.RouteResultsetNode;
import com.actiontech.dble.util.CollectionUtil;
import java.util.*;
import java.util.stream.Collectors;
public final class ComplexQueryPlanUtil {
private ComplexQueryPlanUtil() {
@@ -82,7 +81,7 @@ public final class ComplexQueryPlanUtil {
if (!dependenciesSet.isEmpty()) {
dependencies = dependenciesSet;
} else if (!CollectionUtil.isEmpty(dependencies)) {
dependencies.stream().filter(dependency -> dependency.startsWith(JoinNode.Strategy.HINT_NEST_LOOP.name())).collect(Collectors.toSet()).clear();
dependencies.removeIf(dependency -> dependency.startsWith(JoinNode.Strategy.HINT_NEST_LOOP.name()));
}
String mergeName = getMergeType(mergeHandler);
List<BaseSelectHandler> mergeList = new ArrayList<>();