mirror of
https://github.com/actiontech/dble.git
synced 2026-05-13 18:19:29 -05:00
[inner-2340] fix: explain' lost connection....
(cherry picked from commit 2b87829dc7)
This commit is contained in:
@@ -48,6 +48,7 @@ import java.nio.ByteBuffer;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.SQLNonTransientException;
|
||||
import java.sql.SQLSyntaxErrorException;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -243,6 +244,7 @@ public final class ExplainHandler {
|
||||
}
|
||||
|
||||
public static void writeOutHeadAndEof(ShardingService service, RouteResultset rrs) {
|
||||
final List<RowDataPacket> rows = getRows(service, rrs);
|
||||
ByteBuffer buffer = service.allocate();
|
||||
// writeDirectly header
|
||||
ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT);
|
||||
@@ -260,20 +262,30 @@ public final class ExplainHandler {
|
||||
eof.setPacketId(service.nextPacketId());
|
||||
buffer = eof.write(buffer, service, true);
|
||||
|
||||
// writeDirectly rows
|
||||
for (RowDataPacket row : rows) {
|
||||
row.setPacketId(service.nextPacketId());
|
||||
buffer = row.write(buffer, service, true);
|
||||
}
|
||||
|
||||
// writeDirectly last eof
|
||||
EOFRowPacket lastEof = new EOFRowPacket();
|
||||
lastEof.setPacketId(service.nextPacketId());
|
||||
lastEof.write(buffer, service);
|
||||
}
|
||||
|
||||
private static List<RowDataPacket> getRows(ShardingService service, RouteResultset rrs) {
|
||||
LinkedList<RowDataPacket> rows = new LinkedList<>();
|
||||
if (!rrs.isNeedOptimizer()) {
|
||||
// writeDirectly rows
|
||||
for (RouteResultsetNode node : rrs.getNodes()) {
|
||||
RowDataPacket row = getRow(node, service.getCharset().getResults());
|
||||
row.setPacketId(service.nextPacketId());
|
||||
buffer = row.write(buffer, service, true);
|
||||
rows.add(getRow(node, service.getCharset().getResults()));
|
||||
}
|
||||
} else {
|
||||
BaseHandlerBuilder builder = buildNodes(rrs, service);
|
||||
RouteResultsetNode routeSingleNode = getTryRouteSingleNode(builder, rrs);
|
||||
if (routeSingleNode != null) {
|
||||
RowDataPacket row = getRow(routeSingleNode, service.getCharset().getResults());
|
||||
row.setPacketId(service.nextPacketId());
|
||||
buffer = row.write(buffer, service, true);
|
||||
rows.add(getRow(routeSingleNode, service.getCharset().getResults()));
|
||||
} else {
|
||||
List<ReferenceHandlerInfo> results = ComplexQueryPlanUtil.getComplexQueryResult(builder);
|
||||
for (ReferenceHandlerInfo result : results) {
|
||||
@@ -282,13 +294,10 @@ public final class ExplainHandler {
|
||||
row.add(StringUtil.encode(result.getType(), service.getCharset().getResults()));
|
||||
row.add(StringUtil.encode(result.getRefOrSQL(), service.getCharset().getResults()));
|
||||
row.setPacketId(service.nextPacketId());
|
||||
buffer = row.write(buffer, service, true);
|
||||
rows.add(row);
|
||||
}
|
||||
}
|
||||
}
|
||||
// writeDirectly last eof
|
||||
EOFRowPacket lastEof = new EOFRowPacket();
|
||||
lastEof.setPacketId(service.nextPacketId());
|
||||
lastEof.write(buffer, service);
|
||||
return rows;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user