@Override
 public PostgresStatement finishGenerating(
     PostgresServerSession server,
     String sql,
     StatementNode stmt,
     List<ParameterNode> params,
     int[] paramTypes) {
   ExplainPlanContext context = new ExplainPlanContext(compiler, new PostgresQueryContext(server));
   ExplainStatementNode explainStmt = (ExplainStatementNode) stmt;
   StatementNode innerStmt = explainStmt.getStatement();
   if (params == null) params = new ParameterFinder().find(innerStmt);
   Explainable explainable;
   if (innerStmt instanceof CallStatementNode) {
     explainable =
         PostgresCallStatementGenerator.explainable(
             server, (CallStatementNode) innerStmt, params, paramTypes);
   } else {
     BasePlannable result = compiler.compile((DMLStatementNode) innerStmt, params, context);
     explainable = result.getPlannable();
   }
   List<String> explain;
   if (compiler instanceof PostgresJsonCompiler) {
     JsonFormatter f = new JsonFormatter();
     explain =
         Collections.singletonList(
             f.format(explainable.getExplainer(context.getExplainContext())));
   } else {
     DefaultFormatter.LevelOfDetail detail;
     switch (explainStmt.getDetail()) {
       case BRIEF:
         detail = DefaultFormatter.LevelOfDetail.BRIEF;
         break;
       default:
       case NORMAL:
         detail = DefaultFormatter.LevelOfDetail.NORMAL;
         break;
       case VERBOSE:
         detail = DefaultFormatter.LevelOfDetail.VERBOSE;
         break;
     }
     DefaultFormatter f = new DefaultFormatter(server.getDefaultSchemaName(), detail);
     explain = f.format(explainable.getExplainer(context.getExplainContext()));
   }
   init(explain);
   compiler = null;
   return this;
 }