@Override
 public PostgresStatementResult execute(
     PostgresQueryContext context, QueryBindings bindings, int maxrows) throws IOException {
   PostgresServerSession server = context.getServer();
   server.getSessionMonitor().countEvent(StatementTypes.OTHER_STMT);
   PostgresMessenger messenger = server.getMessenger();
   ServerValueEncoder encoder = server.getValueEncoder();
   int nrows = 0;
   for (String row : explanation) {
     messenger.beginMessage(PostgresMessages.DATA_ROW_TYPE.code());
     messenger.writeShort(1);
     ByteArrayOutputStream bytes = encoder.encodePObject(row, colType, false);
     messenger.writeInt(bytes.size());
     messenger.writeByteStream(bytes);
     messenger.sendMessage();
     nrows++;
     if ((maxrows > 0) && (nrows >= maxrows)) break;
   }
   return commandComplete("EXPLAIN " + nrows, nrows);
 }
 @Override
 public void sendDescription(PostgresQueryContext context, boolean always, boolean params)
     throws IOException {
   PostgresServerSession server = context.getServer();
   PostgresMessenger messenger = server.getMessenger();
   if (params) {
     messenger.beginMessage(PostgresMessages.PARAMETER_DESCRIPTION_TYPE.code());
     messenger.writeShort(0);
     messenger.sendMessage();
   }
   messenger.beginMessage(PostgresMessages.ROW_DESCRIPTION_TYPE.code());
   messenger.writeShort(1);
   messenger.writeString(colName); // attname
   messenger.writeInt(0); // attrelid
   messenger.writeShort(0); // attnum
   messenger.writeInt(colType.getOid()); // atttypid
   messenger.writeShort(colType.getLength()); // attlen
   messenger.writeInt(colType.getModifier()); // atttypmod
   messenger.writeShort(0);
   messenger.sendMessage();
 }