From a87d12f0646fa5ab73c1f2e96cbb97b1be35d236 Mon Sep 17 00:00:00 2001 From: yanhuqing666 Date: Wed, 17 Nov 2021 15:53:10 +0800 Subject: [PATCH] inner DBLE0REQ-1466 --- .../dble/server/NonBlockingSession.java | 13 ++++++++++++- .../dble/server/handler/ExplainHandler.java | 19 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/actiontech/dble/server/NonBlockingSession.java b/src/main/java/com/actiontech/dble/server/NonBlockingSession.java index a786353e3..334b21692 100644 --- a/src/main/java/com/actiontech/dble/server/NonBlockingSession.java +++ b/src/main/java/com/actiontech/dble/server/NonBlockingSession.java @@ -10,6 +10,7 @@ import com.actiontech.dble.backend.datasource.ShardingNode; import com.actiontech.dble.backend.mysql.nio.handler.*; 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.OutputHandler; import com.actiontech.dble.backend.mysql.nio.handler.transaction.ImplicitCommitHandler; @@ -614,7 +615,17 @@ public class NonBlockingSession extends Session { tableSet.addAll(set); } } - RouteResultsetNode[] nodes = {new RouteResultsetNode(nodeName, rrs.getSqlType(), node.getSql(), tableSet)}; + String sql = node.getSql(); + if (node.isExistView()) { + GlobalVisitor visitor = new GlobalVisitor(node, true); + visitor.visit(); + sql = visitor.getSql().toString(); + Map mapTableToSimple = visitor.getMapTableToSimple(); + for (Map.Entry tableToSimple : mapTableToSimple.entrySet()) { + sql = sql.replace(tableToSimple.getKey(), tableToSimple.getValue()); + } + } + RouteResultsetNode[] nodes = {new RouteResultsetNode(nodeName, rrs.getSqlType(), sql, tableSet)}; rrs.setNodes(nodes); setRouteResultToTrace(nodes); // dml or simple select diff --git a/src/main/java/com/actiontech/dble/server/handler/ExplainHandler.java b/src/main/java/com/actiontech/dble/server/handler/ExplainHandler.java index 95fe29211..6317fc3da 100644 --- a/src/main/java/com/actiontech/dble/server/handler/ExplainHandler.java +++ b/src/main/java/com/actiontech/dble/server/handler/ExplainHandler.java @@ -9,6 +9,7 @@ import com.actiontech.dble.DbleServer; 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.impl.MultiNodeMergeHandler; import com.actiontech.dble.config.ErrorCode; import com.actiontech.dble.config.Fields; @@ -45,6 +46,7 @@ import java.sql.SQLException; import java.sql.SQLNonTransientException; import java.sql.SQLSyntaxErrorException; import java.util.List; +import java.util.Map; /** * @author mycat @@ -235,9 +237,20 @@ public final class ExplainHandler { } } if (!StringUtil.isBlank(routeNode)) { - RouteResultsetNode[] nodes = {new RouteResultsetNode(routeNode, rrs.getSqlType(), builder.getNode().getSql())}; - for (RouteResultsetNode node : nodes) { - RowDataPacket row = getRow(node, service.getCharset().getResults()); + PlanNode node = builder.getNode(); + String sql = node.getSql(); + if (node.isExistView()) { + GlobalVisitor visitor = new GlobalVisitor(node, true); + visitor.visit(); + sql = visitor.getSql().toString(); + Map mapTableToSimple = visitor.getMapTableToSimple(); + for (Map.Entry tableToSimple : mapTableToSimple.entrySet()) { + sql = sql.replace(tableToSimple.getKey(), tableToSimple.getValue()); + } + } + RouteResultsetNode[] nodes = {new RouteResultsetNode(routeNode, rrs.getSqlType(), sql)}; + for (RouteResultsetNode rrsNode : nodes) { + RowDataPacket row = getRow(rrsNode, service.getCharset().getResults()); row.setPacketId(++packetId); buffer = row.write(buffer, service, true); }