[inner-2340] fix: explain' lost connection....

(cherry picked from commit 2b87829dc7)
This commit is contained in:
wenyh
2023-08-25 17:29:52 +08:00
committed by wenyh1
parent d7797804cb
commit daed9c209e

View File

@@ -52,6 +52,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;
@@ -270,6 +271,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);
@@ -287,20 +289,29 @@ 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) {
@@ -308,17 +319,14 @@ public final class ExplainHandler {
row.add(StringUtil.encode(getRowStr(result.getName(), result.isIndentation()), service.getCharset().getResults()));
row.add(StringUtil.encode(getRowStr(result.getType(), result.isIndentation()), service.getCharset().getResults()));
row.add(StringUtil.encode(getRowStr(result.getRefOrSQL(), result.isIndentation()), 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;
}
private static String getRowStr(String content, boolean indentation) {
String indentationStr = "------ ";
return indentation ? indentationStr + content : content;