54 #define X_CLOSE_IMMEDIATE 2
55 #define X_NOWHITESPACE 4
68 const char *relationship,
const char *plan_name,
96 List *context,
bool useprefix,
101 int nkeys,
int nPresortedKeys,
AttrNumber *keycols,
102 Oid *sortOperators,
Oid *collations,
bool *nullsFirst,
105 Oid sortOperator,
Oid collation,
bool nullsFirst);
173 bool timing_set =
false;
174 bool summary_set =
false;
177 foreach(lc,
stmt->options)
181 if (strcmp(opt->
defname,
"analyze") == 0)
183 else if (strcmp(opt->
defname,
"verbose") == 0)
185 else if (strcmp(opt->
defname,
"costs") == 0)
187 else if (strcmp(opt->
defname,
"buffers") == 0)
189 else if (strcmp(opt->
defname,
"wal") == 0)
191 else if (strcmp(opt->
defname,
"settings") == 0)
193 else if (strcmp(opt->
defname,
"generic_plan") == 0)
195 else if (strcmp(opt->
defname,
"timing") == 0)
200 else if (strcmp(opt->
defname,
"summary") == 0)
205 else if (strcmp(opt->
defname,
"format") == 0)
209 if (strcmp(p,
"text") == 0)
211 else if (strcmp(p,
"xml") == 0)
213 else if (strcmp(p,
"json") == 0)
215 else if (strcmp(p,
"yaml") == 0)
219 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
220 errmsg(
"unrecognized value for EXPLAIN option \"%s\": \"%s\"",
226 (
errcode(ERRCODE_SYNTAX_ERROR),
227 errmsg(
"unrecognized EXPLAIN option \"%s\"",
235 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
236 errmsg(
"EXPLAIN option WAL requires ANALYZE")));
244 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
245 errmsg(
"EXPLAIN option TIMING requires ANALYZE")));
250 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
251 errmsg(
"EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together")));
261 (*post_parse_analyze_hook) (pstate, query, jstate);
274 if (rewritten ==
NIL)
288 foreach(l, rewritten)
295 if (
lnext(rewritten, l) != NULL)
341 Oid result_type = TEXTOID;
344 foreach(lc,
stmt->options)
348 if (strcmp(opt->
defname,
"format") == 0)
352 if (strcmp(p,
"xml") == 0)
353 result_type = XMLOID;
354 else if (strcmp(p,
"json") == 0)
355 result_type = JSONOID;
357 result_type = TEXTOID;
391 (*ExplainOneQuery_hook) (query, cursorOptions, into, es,
392 queryString, params, queryEnv);
406 plan =
pg_plan_query(query, queryString, cursorOptions, params);
420 &planduration, (es->
buffers ? &bufusage : NULL));
441 if (utilityStmt == NULL)
464 elog(
ERROR,
"unexpected object type: %d",
473 queryString, params, queryEnv);
492 queryString, params, queryEnv);
496 queryString, params, queryEnv);
508 "Utility statements have no plan structure\n");
535 double totaltime = 0;
537 int instrument_option = 0;
577 dest, params, queryEnv, instrument_option);
626 if (es->
summary && planduration)
698 for (
int i = 0;
i < num;
i++)
720 for (
int i = 0;
i < num;
i++)
833 routerels !=
NIL || targrels !=
NIL);
834 foreach(l, resultrels)
840 foreach(l, routerels)
914 "Inlining", jit_flags &
PGJIT_INLINE ?
"true" :
"false",
915 "Optimization", jit_flags &
PGJIT_OPT3 ?
"true" :
"false",
916 "Expressions", jit_flags &
PGJIT_EXPR ?
"true" :
"false",
917 "Deforming", jit_flags &
PGJIT_DEFORM ?
"true" :
"false");
923 "Timing: %s %.3f ms, %s %.3f ms, %s %.3f ms, %s %.3f ms, %s %.3f ms\n",
1000 if (params == NULL || params->
numParams <= 0 || maxlen == 0)
1004 if (
str &&
str[0] !=
'\0')
1024 char *conname = NULL;
1049 if (es->
verbose || conname == NULL)
1112 case T_IndexOnlyScan:
1113 case T_BitmapHeapScan:
1115 case T_TidRangeScan:
1116 case T_SubqueryScan:
1117 case T_FunctionScan:
1118 case T_TableFuncScan:
1121 case T_NamedTuplestoreScan:
1122 case T_WorkTableScan:
1124 ((
Scan *) plan)->scanrelid);
1143 ((
Append *) plan)->apprelids);
1179 const char *relationship,
const char *plan_name,
1185 const char *strategy = NULL;
1186 const char *partialmode = NULL;
1187 const char *operation = NULL;
1188 const char *custom_name = NULL;
1190 int save_indent = es->
indent;
1206 pname = sname =
"Result";
1209 pname = sname =
"ProjectSet";
1212 sname =
"ModifyTable";
1216 pname = operation =
"Insert";
1219 pname = operation =
"Update";
1222 pname = operation =
"Delete";
1225 pname = operation =
"Merge";
1233 pname = sname =
"Append";
1236 pname = sname =
"Merge Append";
1238 case T_RecursiveUnion:
1239 pname = sname =
"Recursive Union";
1242 pname = sname =
"BitmapAnd";
1245 pname = sname =
"BitmapOr";
1248 pname = sname =
"Nested Loop";
1252 sname =
"Merge Join";
1256 sname =
"Hash Join";
1259 pname = sname =
"Seq Scan";
1262 pname = sname =
"Sample Scan";
1265 pname = sname =
"Gather";
1268 pname = sname =
"Gather Merge";
1271 pname = sname =
"Index Scan";
1273 case T_IndexOnlyScan:
1274 pname = sname =
"Index Only Scan";
1276 case T_BitmapIndexScan:
1277 pname = sname =
"Bitmap Index Scan";
1279 case T_BitmapHeapScan:
1280 pname = sname =
"Bitmap Heap Scan";
1283 pname = sname =
"Tid Scan";
1285 case T_TidRangeScan:
1286 pname = sname =
"Tid Range Scan";
1288 case T_SubqueryScan:
1289 pname = sname =
"Subquery Scan";
1291 case T_FunctionScan:
1292 pname = sname =
"Function Scan";
1294 case T_TableFuncScan:
1295 pname = sname =
"Table Function Scan";
1298 pname = sname =
"Values Scan";
1301 pname = sname =
"CTE Scan";
1303 case T_NamedTuplestoreScan:
1304 pname = sname =
"Named Tuplestore Scan";
1306 case T_WorkTableScan:
1307 pname = sname =
"WorkTable Scan";
1310 sname =
"Foreign Scan";
1314 pname =
"Foreign Scan";
1315 operation =
"Select";
1318 pname =
"Foreign Insert";
1319 operation =
"Insert";
1322 pname =
"Foreign Update";
1323 operation =
"Update";
1326 pname =
"Foreign Delete";
1327 operation =
"Delete";
1335 sname =
"Custom Scan";
1336 custom_name = ((
CustomScan *) plan)->methods->CustomName;
1338 pname =
psprintf(
"Custom Scan (%s)", custom_name);
1343 pname = sname =
"Materialize";
1346 pname = sname =
"Memoize";
1349 pname = sname =
"Sort";
1351 case T_IncrementalSort:
1352 pname = sname =
"Incremental Sort";
1355 pname = sname =
"Group";
1361 sname =
"Aggregate";
1365 pname =
"Aggregate";
1369 pname =
"GroupAggregate";
1370 strategy =
"Sorted";
1373 pname =
"HashAggregate";
1374 strategy =
"Hashed";
1377 pname =
"MixedAggregate";
1381 pname =
"Aggregate ???";
1388 partialmode =
"Partial";
1389 pname =
psprintf(
"%s %s", partialmode, pname);
1393 partialmode =
"Finalize";
1394 pname =
psprintf(
"%s %s", partialmode, pname);
1397 partialmode =
"Simple";
1401 pname = sname =
"WindowAgg";
1404 pname = sname =
"Unique";
1408 switch (((
SetOp *) plan)->strategy)
1412 strategy =
"Sorted";
1415 pname =
"HashSetOp";
1416 strategy =
"Hashed";
1419 pname =
"SetOp ???";
1425 pname = sname =
"LockRows";
1428 pname = sname =
"Limit";
1431 pname = sname =
"Hash";
1434 pname = sname =
"???";
1439 relationship ? NULL :
"Plan",
1486 case T_BitmapHeapScan:
1488 case T_TidRangeScan:
1489 case T_SubqueryScan:
1490 case T_FunctionScan:
1491 case T_TableFuncScan:
1494 case T_WorkTableScan:
1499 if (((
Scan *) plan)->scanrelid > 0)
1512 case T_IndexOnlyScan:
1522 case T_BitmapIndexScan:
1525 const char *indexname =
1542 const char *jointype;
1544 switch (((
Join *) plan)->jointype)
1585 const char *setopcmd;
1587 switch (((
SetOp *) plan)->cmd)
1590 setopcmd =
"Intersect";
1593 setopcmd =
"Intersect All";
1596 setopcmd =
"Except";
1599 setopcmd =
"Except All";
1661 " (actual time=%.3f..%.3f rows=%.0f loops=%.0f)",
1662 startup_ms, total_ms, rows, nloops);
1665 " (actual rows=%.0f loops=%.0f)",
1709 double nloops = instrument->
nloops;
1716 startup_ms = 1000.0 * instrument->
startup / nloops;
1717 total_ms = 1000.0 * instrument->
total / nloops;
1718 rows = instrument->
ntuples / nloops;
1727 "actual time=%.3f..%.3f rows=%.0f loops=%.0f\n",
1728 startup_ms, total_ms, rows, nloops);
1731 "actual rows=%.0f loops=%.0f\n",
1765 ((
Join *) plan)->inner_unique,
1777 "Index Cond", planstate, ancestors, es);
1778 if (((
IndexScan *) plan)->indexqualorig)
1782 "Order By", planstate, ancestors, es);
1788 case T_IndexOnlyScan:
1790 "Index Cond", planstate, ancestors, es);
1795 "Order By", planstate, ancestors, es);
1804 case T_BitmapIndexScan:
1806 "Index Cond", planstate, ancestors, es);
1808 case T_BitmapHeapScan:
1810 "Recheck Cond", planstate, ancestors, es);
1823 planstate, ancestors, es);
1829 case T_NamedTuplestoreScan:
1830 case T_WorkTableScan:
1831 case T_SubqueryScan:
1856 nworkers = ((
GatherState *) planstate)->nworkers_launched;
1890 case T_FunctionScan:
1904 "Function Call", planstate, ancestors,
1912 case T_TableFuncScan:
1918 "Table Function Call", planstate, ancestors,
1943 case T_TidRangeScan:
1981 "Join Filter", planstate, ancestors, es);
1982 if (((
NestLoop *) plan)->join.joinqual)
1992 "Merge Cond", planstate, ancestors, es);
1994 "Join Filter", planstate, ancestors, es);
1995 if (((
MergeJoin *) plan)->join.joinqual)
2005 "Hash Cond", planstate, ancestors, es);
2007 "Join Filter", planstate, ancestors, es);
2008 if (((
HashJoin *) plan)->join.joinqual)
2030 "Run Condition", planstate, ancestors, es);
2043 case T_IncrementalSort:
2055 "One-Time Filter", planstate, ancestors, es);
2110 double nloops = instrument->
nloops;
2154 haschildren = planstate->
initPlan ||
2169 ancestors =
lcons(plan, ancestors);
2209 case T_SubqueryScan:
2211 "Subquery", NULL, es);
2234 es->
indent = save_indent;
2237 relationship ? NULL :
"Plan",
2354 show_qual(qual, qlabel, planstate, ancestors, useprefix, es);
2368 show_qual(qual, qlabel, planstate, ancestors, useprefix, es);
2380 plan->
numCols, 0, plan->sortColIdx,
2381 plan->sortOperators, plan->collations,
2397 plan->
sort.sortColIdx,
2398 plan->
sort.sortOperators, plan->
sort.collations,
2399 plan->
sort.nullsFirst,
2413 plan->
numCols, 0, plan->sortColIdx,
2414 plan->sortOperators, plan->collations,
2431 ancestors =
lcons(plan, ancestors);
2437 plan->
numCols, 0, plan->grpColIdx,
2462 context, useprefix, ancestors, es);
2464 foreach(lc, agg->
chain)
2470 context, useprefix, ancestors, es);
2487 const char *keyname;
2488 const char *keysetname;
2492 keyname =
"Hash Key";
2493 keysetname =
"Hash Keys";
2497 keyname =
"Group Key";
2498 keysetname =
"Group Keys";
2506 sortnode->
numCols, 0, sortnode->sortColIdx,
2507 sortnode->sortOperators, sortnode->collations,
2508 sortnode->nullsFirst,
2529 elog(
ERROR,
"no tlist entry for key %d", keyresno);
2534 result =
lappend(result, exprstr);
2561 ancestors =
lcons(plan, ancestors);
2563 plan->
numCols, 0, plan->grpColIdx,
2576 int nkeys,
int nPresortedKeys,
AttrNumber *keycols,
2577 Oid *sortOperators,
Oid *collations,
bool *nullsFirst,
2599 for (keyno = 0; keyno < nkeys; keyno++)
2608 elog(
ERROR,
"no tlist entry for key %d", keyresno);
2615 if (sortOperators != NULL)
2618 sortOperators[keyno],
2623 if (keyno < nPresortedKeys)
2624 resultPresorted =
lappend(resultPresorted, exprstr);
2628 if (nPresortedKeys > 0)
2638 Oid sortOperator,
Oid collation,
bool nullsFirst)
2641 bool reverse =
false;
2658 if (collname == NULL)
2659 elog(
ERROR,
"cache lookup failed for collation %u", collation);
2664 if (sortOperator == typentry->
gt_opr)
2669 else if (sortOperator != typentry->
lt_opr)
2674 elog(
ERROR,
"cache lookup failed for operator %u", sortOperator);
2681 if (nullsFirst && !reverse)
2685 else if (!nullsFirst && reverse)
2715 foreach(lc, tsc->
args)
2770 const char *sortMethod;
2771 const char *spaceType;
2777 spaceUsed = stats.spaceUsed;
2783 sortMethod, spaceType, spaceUsed);
2809 const char *sortMethod;
2810 const char *spaceType;
2828 sortMethod, spaceType, spaceUsed);
2882 foreach(methodCell, methodNames)
2892 const char *spaceTypeName;
2896 spaceTypeName, avgSpace,
2904 const char *spaceTypeName;
2908 spaceTypeName, avgSpace,
2926 const char *spaceTypeName;
2943 const char *spaceTypeName;
3003 bool indent_first_line;
3031 indent_first_line, es);
3099 if (hinstrument.
nbatch > 0)
3101 long spacePeakKb = (hinstrument.
space_peak + 1023) / 1024;
3121 "Buckets: %d (originally %d) Batches: %d (originally %d) Memory Usage: %ldkB\n",
3132 "Buckets: %d Batches: %d Memory Usage: %ldkB\n",
3166 foreach(lc, ((
Memoize *) plan)->param_exprs)
3204 memPeakKb = (mstate->
mem_used + 1023) / 1024;
3253 memPeakKb = (si->
mem_peak + 1023) / 1024;
3318 bool gotone =
false;
3362 uint64 hash_disk_used;
3363 int hash_batches_used;
3381 hash_batches_used, memPeakKb);
3384 if (hash_batches_used > 1)
3392 hash_batches_used, es);
3499 snprintf(param,
sizeof(param),
"$%d", paramid);
3523 result = (*explain_get_index_name_hook) (indexId);
3531 elog(
ERROR,
"cache lookup failed for index %u", indexId);
3544 bool has_shared = (
usage->shared_blks_hit > 0 ||
3545 usage->shared_blks_read > 0 ||
3546 usage->shared_blks_dirtied > 0 ||
3547 usage->shared_blks_written > 0);
3548 bool has_local = (
usage->local_blks_hit > 0 ||
3549 usage->local_blks_read > 0 ||
3550 usage->local_blks_dirtied > 0 ||
3551 usage->local_blks_written > 0);
3552 bool has_temp = (
usage->temp_blks_read > 0 ||
3553 usage->temp_blks_written > 0);
3558 bool show_planning = (planning && (has_shared ||
3559 has_local || has_temp || has_timing ||
3570 if (has_shared || has_local || has_temp)
3578 if (
usage->shared_blks_hit > 0)
3580 (
long long)
usage->shared_blks_hit);
3581 if (
usage->shared_blks_read > 0)
3583 (
long long)
usage->shared_blks_read);
3584 if (
usage->shared_blks_dirtied > 0)
3586 (
long long)
usage->shared_blks_dirtied);
3587 if (
usage->shared_blks_written > 0)
3589 (
long long)
usage->shared_blks_written);
3590 if (has_local || has_temp)
3596 if (
usage->local_blks_hit > 0)
3598 (
long long)
usage->local_blks_hit);
3599 if (
usage->local_blks_read > 0)
3601 (
long long)
usage->local_blks_read);
3602 if (
usage->local_blks_dirtied > 0)
3604 (
long long)
usage->local_blks_dirtied);
3605 if (
usage->local_blks_written > 0)
3607 (
long long)
usage->local_blks_written);
3614 if (
usage->temp_blks_read > 0)
3616 (
long long)
usage->temp_blks_read);
3617 if (
usage->temp_blks_written > 0)
3619 (
long long)
usage->temp_blks_written);
3625 if (has_timing || has_temp_timing)
3639 if (has_temp_timing)
3642 if (has_temp_timing)
3661 usage->shared_blks_hit, es);
3663 usage->shared_blks_read, es);
3665 usage->shared_blks_dirtied, es);
3667 usage->shared_blks_written, es);
3669 usage->local_blks_hit, es);
3671 usage->local_blks_read, es);
3673 usage->local_blks_dirtied, es);
3675 usage->local_blks_written, es);
3677 usage->temp_blks_read, es);
3679 usage->temp_blks_written, es);
3707 if ((
usage->wal_records > 0) || (
usage->wal_fpi > 0) ||
3708 (
usage->wal_bytes > 0))
3713 if (
usage->wal_records > 0)
3715 (
long long)
usage->wal_records);
3716 if (
usage->wal_fpi > 0)
3718 (
long long)
usage->wal_fpi);
3719 if (
usage->wal_bytes > 0)
3728 usage->wal_records, es);
3730 usage->wal_fpi, es);
3732 usage->wal_bytes, es);
3753 const char *scandir;
3755 switch (indexorderdir)
3758 scandir =
"Backward";
3761 scandir =
"Forward";
3800 char *objectname = NULL;
3801 char *
namespace = NULL;
3802 const char *objecttag = NULL;
3808 if (refname == NULL)
3816 case T_IndexOnlyScan:
3817 case T_BitmapHeapScan:
3819 case T_TidRangeScan:
3828 objecttag =
"Relation Name";
3830 case T_FunctionScan:
3857 objecttag =
"Function Name";
3860 case T_TableFuncScan:
3862 objectname =
"xmltable";
3863 objecttag =
"Table Function Name";
3871 Assert(!rte->self_reference);
3872 objectname = rte->ctename;
3873 objecttag =
"CTE Name";
3875 case T_NamedTuplestoreScan:
3877 objectname = rte->enrname;
3878 objecttag =
"Tuplestore Name";
3880 case T_WorkTableScan:
3883 Assert(rte->self_reference);
3884 objectname = rte->ctename;
3885 objecttag =
"CTE Name";
3894 if (
namespace != NULL)
3897 else if (objectname != NULL)
3899 if (objectname == NULL || strcmp(refname, objectname) != 0)
3904 if (objecttag != NULL && objectname != NULL)
3906 if (
namespace != NULL)
3925 const char *operation;
3926 const char *foperation;
3935 operation =
"Insert";
3936 foperation =
"Foreign Insert";
3939 operation =
"Update";
3940 foperation =
"Foreign Update";
3943 operation =
"Delete";
3944 foperation =
"Foreign Delete";
3947 operation =
"Merge";
3949 foperation =
"Foreign Merge";
3953 foperation =
"Foreign ???";
3958 labeltargets = (mtstate->
mt_nrels > 1 ||
3983 fdwroutine ? foperation : operation);
4000 fdwroutine != NULL &&
4028 idxNames =
lappend(idxNames, indexname);
4035 "NOTHING" :
"UPDATE",
4049 &mtstate->
ps, ancestors, es);
4065 insert_path = total - other_path;
4068 insert_path, 0, es);
4082 double skipped_path;
4091 skipped_path = total - insert_path - update_path - delete_path;
4092 Assert(skipped_path >= 0);
4100 if (insert_path > 0)
4102 if (update_path > 0)
4104 if (delete_path > 0)
4106 if (skipped_path > 0)
4138 for (
j = 0;
j < nplans;
j++)
4140 "Member", NULL, es);
4155 nchildren - nplans, es);
4195 ancestors =
lcons(sp, ancestors);
4252 Assert(n >= 0 && n < wstate->num_workers);
4314 Assert(n >= 0 && n < wstate->num_workers);
4882 "<explain xmlns=\"http://www.postgresql.org/2009/explain\">\n");
4964 const char *valid =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
4971 for (s = tagname; *s; s++)
void ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv)
int bms_next_member(const Bitmapset *a, int prevbit)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
#define unconstify(underlying_type, expr)
#define OidIsValid(objectId)
bool CreateTableAsRelExists(CreateTableAsStmt *ctas)
DestReceiver * CreateIntoRelDestReceiver(IntoClause *intoClause)
int GetIntoRelEFlags(IntoClause *intoClause)
elog(ERROR, "%s: %s", p2, msg)
bool defGetBoolean(DefElem *def)
char * defGetString(DefElem *def)
DestReceiver * None_Receiver
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void ExecutorEnd(QueryDesc *queryDesc)
void ExecutorFinish(QueryDesc *queryDesc)
void ExecutorStart(QueryDesc *queryDesc, int eflags)
void ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once)
const TupleTableSlotOps TTSOpsVirtual
void end_tup_output(TupOutputState *tstate)
void do_text_output_multiline(TupOutputState *tstate, const char *txt)
TupOutputState * begin_tup_output_tupdesc(DestReceiver *dest, TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
#define outerPlanState(node)
#define innerPlanState(node)
#define EXEC_FLAG_EXPLAIN_GENERIC
#define do_text_output_oneline(tstate, str_to_emit)
#define EXEC_FLAG_EXPLAIN_ONLY
static void show_modifytable_info(ModifyTableState *mtstate, List *ancestors, ExplainState *es)
static void ExplainDummyGroup(const char *objtype, const char *labelname, ExplainState *es)
static void show_plan_tlist(PlanState *planstate, List *ancestors, ExplainState *es)
static void show_memoize_info(MemoizeState *mstate, List *ancestors, ExplainState *es)
void ExplainPropertyText(const char *qlabel, const char *value, ExplainState *es)
static void show_group_keys(GroupState *gstate, List *ancestors, ExplainState *es)
static void ExplainModifyTarget(ModifyTable *plan, ExplainState *es)
void ExplainOpenGroup(const char *objtype, const char *labelname, bool labeled, ExplainState *es)
static void show_agg_keys(AggState *astate, List *ancestors, ExplainState *es)
static void show_hashagg_info(AggState *aggstate, ExplainState *es)
static void show_scan_qual(List *qual, const char *qlabel, PlanState *planstate, List *ancestors, ExplainState *es)
static const char * explain_get_index_name(Oid indexId)
static void ExplainIndexScanDetails(Oid indexid, ScanDirection indexorderdir, ExplainState *es)
#define X_CLOSE_IMMEDIATE
ExplainOneQuery_hook_type ExplainOneQuery_hook
static void show_eval_params(Bitmapset *bms_params, ExplainState *es)
static void show_instrumentation_count(const char *qlabel, int which, PlanState *planstate, ExplainState *es)
void ExplainPropertyUInteger(const char *qlabel, const char *unit, uint64 value, ExplainState *es)
static void ExplainNode(PlanState *planstate, List *ancestors, const char *relationship, const char *plan_name, ExplainState *es)
static void show_incremental_sort_group_info(IncrementalSortGroupInfo *groupInfo, const char *groupLabel, bool indent, ExplainState *es)
void ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv, const instr_time *planduration, const BufferUsage *bufusage)
static void ExplainMemberNodes(PlanState **planstates, int nplans, List *ancestors, ExplainState *es)
explain_get_index_name_hook_type explain_get_index_name_hook
static bool ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used)
static void ExplainPrintJIT(ExplainState *es, int jit_flags, JitInstrumentation *ji)
void ExplainPropertyInteger(const char *qlabel, const char *unit, int64 value, ExplainState *es)
void ExplainPropertyListNested(const char *qlabel, List *data, ExplainState *es)
static void ExplainYAMLLineStarting(ExplainState *es)
void ExplainQuery(ParseState *pstate, ExplainStmt *stmt, ParamListInfo params, DestReceiver *dest)
static void show_incremental_sort_info(IncrementalSortState *incrsortstate, ExplainState *es)
static void show_tablesample(TableSampleClause *tsc, PlanState *planstate, List *ancestors, ExplainState *es)
static void show_upper_qual(List *qual, const char *qlabel, PlanState *planstate, List *ancestors, ExplainState *es)
static void show_sort_info(SortState *sortstate, ExplainState *es)
void ExplainSeparatePlans(ExplainState *es)
static void ExplainMissingMembers(int nplans, int nchildren, ExplainState *es)
void ExplainEndOutput(ExplainState *es)
void ExplainOneUtility(Node *utilityStmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv)
static void ExplainJSONLineEnding(ExplainState *es)
TupleDesc ExplainResultDesc(ExplainStmt *stmt)
static void ExplainFlushWorkersState(ExplainState *es)
void ExplainPrintJITSummary(ExplainState *es, QueryDesc *queryDesc)
static void show_hash_info(HashState *hashstate, ExplainState *es)
static void ExplainProperty(const char *qlabel, const char *unit, const char *value, bool numeric, ExplainState *es)
void ExplainPropertyFloat(const char *qlabel, const char *unit, double value, int ndigits, ExplainState *es)
void ExplainCloseGroup(const char *objtype, const char *labelname, bool labeled, ExplainState *es)
static void show_sortorder_options(StringInfo buf, Node *sortexpr, Oid sortOperator, Oid collation, bool nullsFirst)
static void show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning)
static void show_expression(Node *node, const char *qlabel, PlanState *planstate, List *ancestors, bool useprefix, ExplainState *es)
static double elapsed_time(instr_time *starttime)
static void ExplainIndentText(ExplainState *es)
void ExplainQueryText(ExplainState *es, QueryDesc *queryDesc)
static void ExplainRestoreGroup(ExplainState *es, int depth, int *state_save)
void ExplainBeginOutput(ExplainState *es)
ExplainState * NewExplainState(void)
static void show_sort_group_keys(PlanState *planstate, const char *qlabel, int nkeys, int nPresortedKeys, AttrNumber *keycols, Oid *sortOperators, Oid *collations, bool *nullsFirst, List *ancestors, ExplainState *es)
static void show_tidbitmap_info(BitmapHeapScanState *planstate, ExplainState *es)
static void ExplainSubPlans(List *plans, List *ancestors, const char *relationship, ExplainState *es)
static void show_foreignscan_info(ForeignScanState *fsstate, ExplainState *es)
static void ExplainScanTarget(Scan *plan, ExplainState *es)
void ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc)
static void escape_yaml(StringInfo buf, const char *str)
static void show_merge_append_keys(MergeAppendState *mstate, List *ancestors, ExplainState *es)
static void report_triggers(ResultRelInfo *rInfo, bool show_relname, ExplainState *es)
void ExplainQueryParameters(ExplainState *es, ParamListInfo params, int maxlen)
static void show_grouping_sets(PlanState *planstate, Agg *agg, List *ancestors, ExplainState *es)
static void ExplainPrintSettings(ExplainState *es)
static void ExplainCloseWorker(int n, ExplainState *es)
static void ExplainOneQuery(Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv)
static void ExplainOpenWorker(int n, ExplainState *es)
static void ExplainTargetRel(Plan *plan, Index rti, ExplainState *es)
static void ExplainSaveGroup(ExplainState *es, int depth, int *state_save)
static void ExplainXMLTag(const char *tagname, int flags, ExplainState *es)
static void show_wal_usage(ExplainState *es, const WalUsage *usage)
static void ExplainOpenSetAsideGroup(const char *objtype, const char *labelname, bool labeled, int depth, ExplainState *es)
void ExplainPropertyBool(const char *qlabel, bool value, ExplainState *es)
static void show_grouping_set_keys(PlanState *planstate, Agg *aggnode, Sort *sortnode, List *context, bool useprefix, List *ancestors, ExplainState *es)
static void show_qual(List *qual, const char *qlabel, PlanState *planstate, List *ancestors, bool useprefix, ExplainState *es)
static void show_sort_keys(SortState *sortstate, List *ancestors, ExplainState *es)
static ExplainWorkersState * ExplainCreateWorkersState(int num_workers)
void ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc)
static void show_incremental_sort_keys(IncrementalSortState *incrsortstate, List *ancestors, ExplainState *es)
static void ExplainCustomChildren(CustomScanState *css, List *ancestors, ExplainState *es)
void ExplainPropertyList(const char *qlabel, List *data, ExplainState *es)
void(* ExplainOneQuery_hook_type)(Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv)
const char *(* explain_get_index_name_hook_type)(Oid indexId)
struct config_generic ** get_explain_guc_options(int *num)
char * GetConfigOptionByName(const char *name, const char **varname, bool missing_ok)
#define INSTR_TIME_SET_CURRENT(t)
#define INSTR_TIME_ADD(x, y)
#define INSTR_TIME_IS_ZERO(t)
#define INSTR_TIME_GET_DOUBLE(t)
#define INSTR_TIME_SUBTRACT(x, y)
#define INSTR_TIME_GET_MILLISEC(t)
#define INSTR_TIME_SET_ZERO(t)
void InstrEndLoop(Instrumentation *instr)
BufferUsage pgBufferUsage
void BufferUsageAccumDiff(BufferUsage *dst, const BufferUsage *add, const BufferUsage *sub)
if(TABLE==NULL||TABLE_index==NULL)
void InstrJitAgg(JitInstrumentation *dst, JitInstrumentation *add)
void escape_json(StringInfo buf, const char *str)
Assert(fmt[strlen(fmt) - 1] !='\n')
List * lcons_int(int datum, List *list)
List * lappend(List *list, void *datum)
List * list_delete_first(List *list)
List * lcons(void *datum, List *list)
char * get_opname(Oid opno)
char * get_namespace_name_or_temp(Oid nspid)
Oid get_equality_op_for_ordering_op(Oid opno, bool *reverse)