PlannedStmt *plan;
         instr_time  planstart,
                     planduration;
 +       BufferUsage bufusage_start,
 +                   bufusage;
  
 +       if (es->buffers)
 +           bufusage_start = pgBufferUsage;
         INSTR_TIME_SET_CURRENT(planstart);
  
         /* plan the query */
          INSTR_TIME_SET_CURRENT(planduration);
         INSTR_TIME_SUBTRACT(planduration, planstart);
  
 +       /* calc differences of buffer counters. */
 +       if (es->buffers)
 +       {
 +           memset(&bufusage, 0, sizeof(BufferUsage));
 +           BufferUsageAccumDiff(&bufusage, &pgBufferUsage, &bufusage_start);
 +       }
 +
         /* run it (if needed) and produce output */
         ExplainOnePlan(plan, into, es, queryString, params, queryEnv,
 -                      &planduration);
 +                      &planduration, (es->buffers ? &bufusage : NULL));
     }
  }
  
   void
  ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es,
                const char *queryString, ParamListInfo params,
 -              QueryEnvironment *queryEnv, const instr_time *planduration)
 +              QueryEnvironment *queryEnv, const instr_time *planduration,
 +              const BufferUsage *bufusage)
  {
     DestReceiver *dest;
     QueryDesc  *queryDesc;
      /* Create textual dump of plan tree */
     ExplainPrintPlan(es, queryDesc);
  
 +   if (es->summary && (planduration || bufusage))
 +       ExplainOpenGroup("Planning", "Planning", true, es);
 +
     if (es->summary && planduration)
     {
         double      plantime = INSTR_TIME_GET_DOUBLE(*planduration);
          ExplainPropertyFloat("Planning Time", "ms", 1000.0 * plantime, 3, es);
     }
  
 +   /* Show buffer usage */
 +   if (es->summary && bufusage)
 +   {
 +       if (es->format == EXPLAIN_FORMAT_TEXT)
 +           es->indent++;
 +       show_buffer_usage(es, bufusage);
 +       if (es->format == EXPLAIN_FORMAT_TEXT)
 +           es->indent--;
 +   }
 +
 +   if (es->summary && (planduration || bufusage))
 +       ExplainCloseGroup("Planning", "Planning", true, es);
 +
     /* Print info about runtime of triggers */
     if (es->analyze)
         ExplainPrintTriggers(es, queryDesc);
             EState     *estate = NULL;
     instr_time  planstart;
     instr_time  planduration;
 +   BufferUsage bufusage_start,
 +               bufusage;
  
 +   if (es->buffers)
 +       bufusage_start = pgBufferUsage;
     INSTR_TIME_SET_CURRENT(planstart);
  
     /* Look it up in the hash table */
      INSTR_TIME_SET_CURRENT(planduration);
     INSTR_TIME_SUBTRACT(planduration, planstart);
  
 +   /* calc differences of buffer counters. */
 +   if (es->buffers)
 +   {
 +       memset(&bufusage, 0, sizeof(BufferUsage));
 +       BufferUsageAccumDiff(&bufusage, &pgBufferUsage, &bufusage_start);
 +   }
 +
     plan_list = cplan->stmt_list;
  
     /* Explain each query */
   
         if (pstmt->commandType != CMD_UTILITY)
             ExplainOnePlan(pstmt, into, es, query_string, paramLI, queryEnv,
 -                          &planduration);
 +                          &planduration, (es->buffers ? &bufusage : NULL));
         else
             ExplainOneUtility(pstmt->utilityStmt, into, es, query_string,
                               paramLI, queryEnv);
          extern void ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into,
                            ExplainState *es, const char *queryString,
                            ParamListInfo params, QueryEnvironment *queryEnv,
 -                          const instr_time *planduration);
 +                          const instr_time *planduration,
 +                          const BufferUsage *bufusage);
  
  extern void ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc);
  extern void ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc);
                 "Temp Read Blocks": N,      +
         "Temp Written Blocks": N    +
       },                            +
 -     "Planning Time": N.N,         +
 +     "Planning": {                 +
 +       "Planning Time": N.N,       +
 +       "Shared Hit Blocks": N,     +
 +       "Shared Read Blocks": N,    +
 +       "Shared Dirtied Blocks": N, +
 +       "Shared Written Blocks": N, +
 +       "Local Hit Blocks": N,      +
 +       "Local Read Blocks": N,     +
 +       "Local Dirtied Blocks": N,  +
 +       "Local Written Blocks": N,  +
 +       "Temp Read Blocks": N,      +
 +       "Temp Written Blocks": N    +
 +     },                            +
       "Triggers": [                 +
       ],                            +
       "Execution Time": N.N         +
          <Temp-Read-Blocks>N</Temp-Read-Blocks>          +
         <Temp-Written-Blocks>N</Temp-Written-Blocks>    +
       </Plan>                                           +
 -     <Planning-Time>N.N</Planning-Time>                +
 +     <Planning>                                        +
 +       <Planning-Time>N.N</Planning-Time>              +
 +       <Shared-Hit-Blocks>N</Shared-Hit-Blocks>        +
 +       <Shared-Read-Blocks>N</Shared-Read-Blocks>      +
 +       <Shared-Dirtied-Blocks>N</Shared-Dirtied-Blocks>+
 +       <Shared-Written-Blocks>N</Shared-Written-Blocks>+
 +       <Local-Hit-Blocks>N</Local-Hit-Blocks>          +
 +       <Local-Read-Blocks>N</Local-Read-Blocks>        +
 +       <Local-Dirtied-Blocks>N</Local-Dirtied-Blocks>  +
 +       <Local-Written-Blocks>N</Local-Written-Blocks>  +
 +       <Temp-Read-Blocks>N</Temp-Read-Blocks>          +
 +       <Temp-Written-Blocks>N</Temp-Written-Blocks>    +
 +     </Planning>                                       +
       <Triggers>                                        +
       </Triggers>                                       +
       <Execution-Time>N.N</Execution-Time>              +
        Local Written Blocks: N  +
       Temp Read Blocks: N      +
       Temp Written Blocks: N   +
 -   Planning Time: N.N         +
 +   Planning:                  +
 +     Planning Time: N.N       +
 +     Shared Hit Blocks: N     +
 +     Shared Read Blocks: N    +
 +     Shared Dirtied Blocks: N +
 +     Shared Written Blocks: N +
 +     Local Hit Blocks: N      +
 +     Local Read Blocks: N     +
 +     Local Dirtied Blocks: N  +
 +     Local Written Blocks: N  +
 +     Temp Read Blocks: N      +
 +     Temp Written Blocks: N   +
     Triggers:                  +
     Execution Time: N.N
  (1 row)
                "Shared Dirtied Blocks": 0,                    +
               "Shared Written Blocks": 0                     +
           },                                                 +
 +         "Planning": {                                      +
 +             "Planning Time": 0.0,                          +
 +             "Local Hit Blocks": 0,                         +
 +             "Temp Read Blocks": 0,                         +
 +             "Local Read Blocks": 0,                        +
 +             "Shared Hit Blocks": 0,                        +
 +             "Shared Read Blocks": 0,                       +
 +             "Temp Written Blocks": 0,                      +
 +             "Local Dirtied Blocks": 0,                     +
 +             "Local Written Blocks": 0,                     +
 +             "Shared Dirtied Blocks": 0,                    +
 +             "Shared Written Blocks": 0                     +
 +         },                                                 +
           "Triggers": [                                      +
           ],                                                 +
 -         "Planning Time": 0.0,                              +
           "Execution Time": 0.0                              +
       }                                                      +
   ]