25 .
name =
"pg_overexplain",
41 const char *relationship,
42 const char *plan_name,
47 const char *queryString,
135 const char *relationship,
const char *plan_name,
142 (*prev_explain_per_node_hook) (planstate, ancestors, relationship,
199 case T_IndexOnlyScan:
200 case T_BitmapHeapScan:
205 case T_TableFuncScan:
208 case T_NamedTuplestoreScan:
209 case T_WorkTableScan:
246 if (
plan->lefttree == NULL ||
267 const char *queryString,
274 (*prev_explain_per_plan_hook) (plannedstmt, into, es, queryString,
299 char *commandType = NULL;
315 commandType =
"unknown";
318 commandType =
"select";
321 commandType =
"update";
324 commandType =
"insert";
327 commandType =
"delete";
330 commandType =
"merge";
333 commandType =
"utility";
336 commandType =
"nothing";
373 else if (plannedstmt->
stmt_len == 0)
438 kind =
"namedtuplestore";
460 rte->
inh ?
", inherited" :
"",
461 rte->inFromCl ?
", in-from-clause" :
"");
473 if (rte->alias != NULL)
485 const char *qualname;
505 switch (rte->relkind)
507 case RELKIND_RELATION:
508 relkind =
"relation";
513 case RELKIND_SEQUENCE:
514 relkind =
"sequence";
516 case RELKIND_TOASTVALUE:
517 relkind =
"toastvalue";
522 case RELKIND_MATVIEW:
525 case RELKIND_COMPOSITE_TYPE:
526 relkind =
"composite_type";
528 case RELKIND_FOREIGN_TABLE:
529 relkind =
"foreign_table";
531 case RELKIND_PARTITIONED_TABLE:
532 relkind =
"partitioned_table";
534 case RELKIND_PARTITIONED_INDEX:
535 relkind =
"partitioned_index";
541 relkind =
psprintf(
"%c", rte->relkind);
550 if (rte->rellockmode != 0)
553 rte->rellockmode), es);
561 if (rte->perminfoindex != 0)
563 rte->perminfoindex, es);
604 jointype =
"Right Semi";
607 jointype =
"Right Anti";
620 rte->joinmergedcols, es);
int bms_next_member(const Bitmapset *a, int prevbit)
bool defGetBoolean(DefElem *def)
explain_per_node_hook_type explain_per_node_hook
explain_per_plan_hook_type explain_per_plan_hook
void(* explain_per_plan_hook_type)(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv)
void(* explain_per_node_hook_type)(PlanState *planstate, List *ancestors, const char *relationship, const char *plan_name, ExplainState *es)
int GetExplainExtensionId(const char *extension_name)
void * GetExplainExtensionState(ExplainState *es, int extension_id)
void SetExplainExtensionState(ExplainState *es, int extension_id, void *opaque)
void RegisterExtensionExplainOption(const char *option_name, ExplainOptionHandler handler)
Assert(PointerIsAligned(start, uint64))
const char * GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode)
#define DEFAULT_LOCKMETHOD
char * get_rel_name(Oid relid)
Oid get_rel_namespace(Oid relid)
char * get_namespace_name_or_temp(Oid nspid)
void pfree(void *pointer)
void * palloc0(Size size)
#define IsA(nodeptr, _type_)
#define rt_fetch(rangetable_index, rangetable)
static int list_length(const List *l)
#define foreach_xid(var, lst)
#define foreach_node(type, var, lst)
#define foreach_oid(var, lst)
#define foreach_int(var, lst)
static void overexplain_per_plan_hook(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv)
static void overexplain_bitmapset(const char *qlabel, Bitmapset *bms, ExplainState *es)
static void overexplain_range_table(PlannedStmt *plannedstmt, ExplainState *es)
static explain_per_plan_hook_type prev_explain_per_plan_hook
static explain_per_node_hook_type prev_explain_per_node_hook
static overexplain_options * overexplain_ensure_options(ExplainState *es)
static void overexplain_per_node_hook(PlanState *planstate, List *ancestors, const char *relationship, const char *plan_name, ExplainState *es)
static void overexplain_intlist(const char *qlabel, List *list, ExplainState *es)
PG_MODULE_MAGIC_EXT(.name="pg_overexplain",.version=PG_VERSION)
static void overexplain_debug_handler(ExplainState *es, DefElem *opt, ParseState *pstate)
static void overexplain_alias(const char *qlabel, Alias *alias, ExplainState *es)
static int es_extension_id
static void overexplain_debug(PlannedStmt *plannedstmt, ExplainState *es)
static void overexplain_range_table_handler(ExplainState *es, DefElem *opt, ParseState *pstate)
char * psprintf(const char *fmt,...)
const char * quote_identifier(const char *ident)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoString(StringInfo str, const char *s)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
Bitmapset * rewindPlanIDs
Bitmapset * unprunableRelids