mirror of
https://github.com/actiontech/dble.git
synced 2026-05-08 07:21:00 -05:00
[inner-1674] fix: nestloop scenarios's bug (#3172)
This commit is contained in:
+14
-4
@@ -7,9 +7,7 @@ package com.actiontech.dble.backend.mysql.nio.handler.builder;
|
||||
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.builder.sqlvisitor.GlobalVisitor;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.impl.BaseSelectHandler;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.impl.MultiNodeEasyMergeHandler;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.impl.MultiNodeMergeHandler;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.impl.*;
|
||||
import com.actiontech.dble.plan.node.*;
|
||||
import com.actiontech.dble.route.RouteResultsetNode;
|
||||
import com.actiontech.dble.route.util.RouterUtil;
|
||||
@@ -111,10 +109,22 @@ public class HandlerBuilder {
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean canAsWholeToSingle(List<DMLResponseHandler> merges) {
|
||||
if (merges.size() != 1)
|
||||
return false;
|
||||
DMLResponseHandler next = merges.get(0).getNextHandler();
|
||||
while (next != null) {
|
||||
if (next instanceof TempTableHandler || next instanceof DelayTableHandler)
|
||||
return false;
|
||||
next = next.getNextHandler();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// check whether the SQL can be directly sent to a single node
|
||||
private RouteResultsetNode getTryRouteSingleNode(BaseHandlerBuilder builder, boolean isHaveHintPlan2Inner) {
|
||||
RouteResultsetNode routeNode = null;
|
||||
if (builder.getEndHandler().getMerges().size() == 1 && builder.getSubQueryBuilderList().size() == 0) {
|
||||
if (canAsWholeToSingle(builder.getEndHandler().getMerges()) && builder.getSubQueryBuilderList().size() == 0) {
|
||||
RouteResultsetNode[] routes = ((MultiNodeMergeHandler) (builder.getEndHandler().getMerges().get(0))).getRoute();
|
||||
if (routes.length == 1) {
|
||||
routeNode = routes[0];
|
||||
|
||||
@@ -10,7 +10,10 @@ import com.actiontech.dble.backend.mysql.PacketUtil;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.builder.BaseHandlerBuilder;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.builder.HandlerBuilder;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.builder.sqlvisitor.GlobalVisitor;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.DMLResponseHandler;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.impl.DelayTableHandler;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.impl.MultiNodeMergeHandler;
|
||||
import com.actiontech.dble.backend.mysql.nio.handler.query.impl.TempTableHandler;
|
||||
import com.actiontech.dble.config.ErrorCode;
|
||||
import com.actiontech.dble.config.Fields;
|
||||
import com.actiontech.dble.config.model.sharding.SchemaConfig;
|
||||
@@ -202,10 +205,22 @@ public final class ExplainHandler {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean canAsWholeToSingle(List<DMLResponseHandler> merges) {
|
||||
if (merges.size() != 1)
|
||||
return false;
|
||||
DMLResponseHandler next = merges.get(0).getNextHandler();
|
||||
while (next != null) {
|
||||
if (next instanceof TempTableHandler || next instanceof DelayTableHandler)
|
||||
return false;
|
||||
next = next.getNextHandler();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// check whether the SQL can be directly sent to a single node
|
||||
private static RouteResultsetNode getTryRouteSingleNode(BaseHandlerBuilder builder, RouteResultset rrs) {
|
||||
RouteResultsetNode routeNode = null;
|
||||
if (builder.getEndHandler().getMerges().size() == 1 && builder.getSubQueryBuilderList().size() == 0) {
|
||||
if (canAsWholeToSingle(builder.getEndHandler().getMerges()) && builder.getSubQueryBuilderList().size() == 0) {
|
||||
RouteResultsetNode[] routes = ((MultiNodeMergeHandler) (builder.getEndHandler().getMerges().get(0))).getRoute();
|
||||
if (routes.length == 1) {
|
||||
routeNode = routes[0];
|
||||
|
||||
Reference in New Issue
Block a user