docs: public ResultSetPacket query(String queryString) throws IOException {
          QueryCommandPacket cmd = new QueryCommandPacket();
          cmd.setQueryString(queryString);
          byte[] bodyBytes = cmd.toBytes();
          PacketManager.writeBody(channel, bodyBytes);
          byte[] body = readNextPacket();
  
          if (body[0] < 0) {
              ErrorPacket packet = new ErrorPacket();
              packet.fromBytes(body);
              throw new IOException(packet + "\n with command: " + queryString);
          }
  
          ResultSetHeaderPacket rsHeader = new ResultSetHeaderPacket();
          rsHeader.fromBytes(body);
  
          List<FieldPacket> fields = new ArrayList<FieldPacket>();
          for (int i = 0; i < rsHeader.getColumnCount(); i++) {
              FieldPacket fp = new FieldPacket();
              fp.fromBytes(readNextPacket());
              fields.add(fp);
          }
  
          readEofPacket();
  
          List<RowDataPacket> rowData = new ArrayList<RowDataPacket>();
          while (true) {
              body = readNextPacket();
              if (body[0] == -2) {
                  break;
              }
              RowDataPacket rowDataPacket = new RowDataPacket();
              rowDataPacket.fromBytes(body);
              rowData.add(rowDataPacket);
          }
  
          ResultSetPacket resultSet = new ResultSetPacket();
          resultSet.getFieldDescriptors().addAll(fields);
          for (RowDataPacket r : rowData) {
              resultSet.getFieldValues().addAll(r.getColumns());
          }
          resultSet.setSourceAddress(channel.getRemoteSocketAddress());
  
          return resultSet;
      }