PostgreSQL Source Code  git master
auto_explain.c File Reference
#include "postgres.h"
#include <limits.h>
#include "access/parallel.h"
#include "commands/explain.h"
#include "executor/instrument.h"
#include "jit/jit.h"
#include "utils/guc.h"
Include dependency graph for auto_explain.c:

Go to the source code of this file.

Macros

#define auto_explain_enabled()
 

Functions

void _PG_init (void)
 
void _PG_fini (void)
 
static void explain_ExecutorStart (QueryDesc *queryDesc, int eflags)
 
static void explain_ExecutorRun (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once)
 
static void explain_ExecutorFinish (QueryDesc *queryDesc)
 
static void explain_ExecutorEnd (QueryDesc *queryDesc)
 

Variables

 PG_MODULE_MAGIC
 
static int auto_explain_log_min_duration = -1
 
static bool auto_explain_log_analyze = false
 
static bool auto_explain_log_verbose = false
 
static bool auto_explain_log_buffers = false
 
static bool auto_explain_log_wal = false
 
static bool auto_explain_log_triggers = false
 
static bool auto_explain_log_timing = true
 
static bool auto_explain_log_settings = false
 
static int auto_explain_log_format = EXPLAIN_FORMAT_TEXT
 
static int auto_explain_log_level = LOG
 
static bool auto_explain_log_nested_statements = false
 
static double auto_explain_sample_rate = 1
 
static const struct config_enum_entry format_options []
 
static const struct config_enum_entry loglevel_options []
 
static int nesting_level = 0
 
static bool current_query_sampled = false
 
static ExecutorStart_hook_type prev_ExecutorStart = NULL
 
static ExecutorRun_hook_type prev_ExecutorRun = NULL
 
static ExecutorFinish_hook_type prev_ExecutorFinish = NULL
 
static ExecutorEnd_hook_type prev_ExecutorEnd = NULL
 

Macro Definition Documentation

◆ auto_explain_enabled

#define auto_explain_enabled ( )
Value:
static bool current_query_sampled
Definition: auto_explain.c:65
static bool auto_explain_log_nested_statements
Definition: auto_explain.c:36
static int nesting_level
Definition: auto_explain.c:62
static int auto_explain_log_min_duration
Definition: auto_explain.c:26

Definition at line 67 of file auto_explain.c.

Referenced by explain_ExecutorEnd(), and explain_ExecutorStart().

Function Documentation

◆ _PG_fini()

void _PG_fini ( void  )

Definition at line 250 of file auto_explain.c.

References ExecutorEnd_hook, ExecutorFinish_hook, ExecutorRun_hook, ExecutorStart_hook, prev_ExecutorEnd, prev_ExecutorFinish, prev_ExecutorRun, and prev_ExecutorStart.

251 {
252  /* Uninstall hooks. */
257 }
static ExecutorRun_hook_type prev_ExecutorRun
Definition: auto_explain.c:74
ExecutorStart_hook_type ExecutorStart_hook
Definition: execMain.c:70
static ExecutorStart_hook_type prev_ExecutorStart
Definition: auto_explain.c:73
ExecutorRun_hook_type ExecutorRun_hook
Definition: execMain.c:71
ExecutorEnd_hook_type ExecutorEnd_hook
Definition: execMain.c:73
static ExecutorFinish_hook_type prev_ExecutorFinish
Definition: auto_explain.c:75
static ExecutorEnd_hook_type prev_ExecutorEnd
Definition: auto_explain.c:76
ExecutorFinish_hook_type ExecutorFinish_hook
Definition: execMain.c:72

◆ _PG_init()

void _PG_init ( void  )

Definition at line 93 of file auto_explain.c.

References auto_explain_log_analyze, auto_explain_log_buffers, auto_explain_log_format, auto_explain_log_level, auto_explain_log_min_duration, auto_explain_log_nested_statements, auto_explain_log_settings, auto_explain_log_timing, auto_explain_log_triggers, auto_explain_log_verbose, auto_explain_log_wal, auto_explain_sample_rate, DefineCustomBoolVariable(), DefineCustomEnumVariable(), DefineCustomIntVariable(), DefineCustomRealVariable(), EmitWarningsOnPlaceholders(), ExecutorEnd_hook, ExecutorFinish_hook, ExecutorRun_hook, ExecutorStart_hook, explain_ExecutorEnd(), explain_ExecutorFinish(), explain_ExecutorRun(), explain_ExecutorStart(), EXPLAIN_FORMAT_TEXT, GUC_UNIT_MS, LOG, PGC_SUSET, prev_ExecutorEnd, prev_ExecutorFinish, prev_ExecutorRun, and prev_ExecutorStart.

94 {
95  /* Define custom GUC variables. */
96  DefineCustomIntVariable("auto_explain.log_min_duration",
97  "Sets the minimum execution time above which plans will be logged.",
98  "Zero prints all plans. -1 turns this feature off.",
100  -1,
101  -1, INT_MAX,
102  PGC_SUSET,
103  GUC_UNIT_MS,
104  NULL,
105  NULL,
106  NULL);
107 
108  DefineCustomBoolVariable("auto_explain.log_analyze",
109  "Use EXPLAIN ANALYZE for plan logging.",
110  NULL,
112  false,
113  PGC_SUSET,
114  0,
115  NULL,
116  NULL,
117  NULL);
118 
119  DefineCustomBoolVariable("auto_explain.log_settings",
120  "Log modified configuration parameters affecting query planning.",
121  NULL,
123  false,
124  PGC_SUSET,
125  0,
126  NULL,
127  NULL,
128  NULL);
129 
130  DefineCustomBoolVariable("auto_explain.log_verbose",
131  "Use EXPLAIN VERBOSE for plan logging.",
132  NULL,
134  false,
135  PGC_SUSET,
136  0,
137  NULL,
138  NULL,
139  NULL);
140 
141  DefineCustomBoolVariable("auto_explain.log_buffers",
142  "Log buffers usage.",
143  NULL,
145  false,
146  PGC_SUSET,
147  0,
148  NULL,
149  NULL,
150  NULL);
151 
152  DefineCustomBoolVariable("auto_explain.log_wal",
153  "Log WAL usage.",
154  NULL,
156  false,
157  PGC_SUSET,
158  0,
159  NULL,
160  NULL,
161  NULL);
162 
163  DefineCustomBoolVariable("auto_explain.log_triggers",
164  "Include trigger statistics in plans.",
165  "This has no effect unless log_analyze is also set.",
167  false,
168  PGC_SUSET,
169  0,
170  NULL,
171  NULL,
172  NULL);
173 
174  DefineCustomEnumVariable("auto_explain.log_format",
175  "EXPLAIN format to be used for plan logging.",
176  NULL,
180  PGC_SUSET,
181  0,
182  NULL,
183  NULL,
184  NULL);
185 
186  DefineCustomEnumVariable("auto_explain.log_level",
187  "Log level for the plan.",
188  NULL,
190  LOG,
192  PGC_SUSET,
193  0,
194  NULL,
195  NULL,
196  NULL);
197 
198  DefineCustomBoolVariable("auto_explain.log_nested_statements",
199  "Log nested statements.",
200  NULL,
202  false,
203  PGC_SUSET,
204  0,
205  NULL,
206  NULL,
207  NULL);
208 
209  DefineCustomBoolVariable("auto_explain.log_timing",
210  "Collect timing data, not just row counts.",
211  NULL,
213  true,
214  PGC_SUSET,
215  0,
216  NULL,
217  NULL,
218  NULL);
219 
220  DefineCustomRealVariable("auto_explain.sample_rate",
221  "Fraction of queries to process.",
222  NULL,
224  1.0,
225  0.0,
226  1.0,
227  PGC_SUSET,
228  0,
229  NULL,
230  NULL,
231  NULL);
232 
233  EmitWarningsOnPlaceholders("auto_explain");
234 
235  /* Install hooks. */
244 }
static double auto_explain_sample_rate
Definition: auto_explain.c:37
void DefineCustomIntVariable(const char *name, const char *short_desc, const char *long_desc, int *valueAddr, int bootValue, int minValue, int maxValue, GucContext context, int flags, GucIntCheckHook check_hook, GucIntAssignHook assign_hook, GucShowHook show_hook)
Definition: guc.c:8818
static int auto_explain_log_level
Definition: auto_explain.c:35
static ExecutorRun_hook_type prev_ExecutorRun
Definition: auto_explain.c:74
static bool auto_explain_log_verbose
Definition: auto_explain.c:28
static bool auto_explain_log_buffers
Definition: auto_explain.c:29
static bool auto_explain_log_nested_statements
Definition: auto_explain.c:36
static void explain_ExecutorStart(QueryDesc *queryDesc, int eflags)
Definition: auto_explain.c:263
static int auto_explain_log_format
Definition: auto_explain.c:34
#define LOG
Definition: elog.h:26
void DefineCustomRealVariable(const char *name, const char *short_desc, const char *long_desc, double *valueAddr, double bootValue, double minValue, double maxValue, GucContext context, int flags, GucRealCheckHook check_hook, GucRealAssignHook assign_hook, GucShowHook show_hook)
Definition: guc.c:8848
void DefineCustomEnumVariable(const char *name, const char *short_desc, const char *long_desc, int *valueAddr, int bootValue, const struct config_enum_entry *options, GucContext context, int flags, GucEnumCheckHook check_hook, GucEnumAssignHook assign_hook, GucShowHook show_hook)
Definition: guc.c:8903
ExecutorStart_hook_type ExecutorStart_hook
Definition: execMain.c:70
static ExecutorStart_hook_type prev_ExecutorStart
Definition: auto_explain.c:73
static void explain_ExecutorFinish(QueryDesc *queryDesc)
Definition: auto_explain.c:349
static const struct config_enum_entry format_options[]
Definition: auto_explain.c:39
ExecutorRun_hook_type ExecutorRun_hook
Definition: execMain.c:71
ExecutorEnd_hook_type ExecutorEnd_hook
Definition: execMain.c:73
Definition: guc.h:75
void EmitWarningsOnPlaceholders(const char *className)
Definition: guc.c:8931
static int auto_explain_log_min_duration
Definition: auto_explain.c:26
static bool auto_explain_log_timing
Definition: auto_explain.c:32
static ExecutorFinish_hook_type prev_ExecutorFinish
Definition: auto_explain.c:75
static const struct config_enum_entry loglevel_options[]
Definition: auto_explain.c:47
static bool auto_explain_log_wal
Definition: auto_explain.c:30
static bool auto_explain_log_analyze
Definition: auto_explain.c:27
static void explain_ExecutorEnd(QueryDesc *queryDesc)
Definition: auto_explain.c:370
static ExecutorEnd_hook_type prev_ExecutorEnd
Definition: auto_explain.c:76
static void explain_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once)
Definition: auto_explain.c:327
ExecutorFinish_hook_type ExecutorFinish_hook
Definition: execMain.c:72
static bool auto_explain_log_settings
Definition: auto_explain.c:33
void DefineCustomBoolVariable(const char *name, const char *short_desc, const char *long_desc, bool *valueAddr, bool bootValue, GucContext context, int flags, GucBoolCheckHook check_hook, GucBoolAssignHook assign_hook, GucShowHook show_hook)
Definition: guc.c:8792
#define GUC_UNIT_MS
Definition: guc.h:225
static bool auto_explain_log_triggers
Definition: auto_explain.c:31

◆ explain_ExecutorEnd()

static void explain_ExecutorEnd ( QueryDesc queryDesc)
static

Definition at line 370 of file auto_explain.c.

References ExplainState::analyze, auto_explain_enabled, auto_explain_log_analyze, auto_explain_log_buffers, auto_explain_log_format, auto_explain_log_level, auto_explain_log_min_duration, auto_explain_log_settings, auto_explain_log_timing, auto_explain_log_triggers, auto_explain_log_verbose, auto_explain_log_wal, ExplainState::buffers, ExplainState::costs, StringInfoData::data, ereport, errhidestmt(), errmsg(), EXPLAIN_FORMAT_JSON, ExplainBeginOutput(), ExplainEndOutput(), ExplainPrintJITSummary(), ExplainPrintPlan(), ExplainPrintTriggers(), ExplainQueryText(), ExplainState::format, InstrEndLoop(), QueryDesc::instrument_options, StringInfoData::len, NewExplainState(), pfree(), prev_ExecutorEnd, ExplainState::settings, standard_ExecutorEnd(), ExplainState::str, ExplainState::summary, ExplainState::timing, Instrumentation::total, QueryDesc::totaltime, ExplainState::verbose, and ExplainState::wal.

Referenced by _PG_init().

371 {
372  if (queryDesc->totaltime && auto_explain_enabled())
373  {
374  double msec;
375 
376  /*
377  * Make sure stats accumulation is done. (Note: it's okay if several
378  * levels of hook all do this.)
379  */
380  InstrEndLoop(queryDesc->totaltime);
381 
382  /* Log plan if duration is exceeded. */
383  msec = queryDesc->totaltime->total * 1000.0;
384  if (msec >= auto_explain_log_min_duration)
385  {
387 
391  es->wal = (es->analyze && auto_explain_log_wal);
392  es->timing = (es->analyze && auto_explain_log_timing);
393  es->summary = es->analyze;
396 
397  ExplainBeginOutput(es);
398  ExplainQueryText(es, queryDesc);
399  ExplainPrintPlan(es, queryDesc);
401  ExplainPrintTriggers(es, queryDesc);
402  if (es->costs)
403  ExplainPrintJITSummary(es, queryDesc);
404  ExplainEndOutput(es);
405 
406  /* Remove last line break */
407  if (es->str->len > 0 && es->str->data[es->str->len - 1] == '\n')
408  es->str->data[--es->str->len] = '\0';
409 
410  /* Fix JSON to output an object */
412  {
413  es->str->data[0] = '{';
414  es->str->data[es->str->len - 1] = '}';
415  }
416 
417  /*
418  * Note: we rely on the existing logging of context or
419  * debug_query_string to identify just which statement is being
420  * reported. This isn't ideal but trying to do it here would
421  * often result in duplication.
422  */
424  (errmsg("duration: %.3f ms plan:\n%s",
425  msec, es->str->data),
426  errhidestmt(true)));
427 
428  pfree(es->str->data);
429  }
430  }
431 
432  if (prev_ExecutorEnd)
433  prev_ExecutorEnd(queryDesc);
434  else
435  standard_ExecutorEnd(queryDesc);
436 }
bool summary
Definition: explain.h:47
static int auto_explain_log_level
Definition: auto_explain.c:35
ExplainState * NewExplainState(void)
Definition: explain.c:309
static bool auto_explain_log_verbose
Definition: auto_explain.c:28
static bool auto_explain_log_buffers
Definition: auto_explain.c:29
void standard_ExecutorEnd(QueryDesc *queryDesc)
Definition: execMain.c:471
int errhidestmt(bool hide_stmt)
Definition: elog.c:1142
static int auto_explain_log_format
Definition: auto_explain.c:34
bool costs
Definition: explain.h:43
bool analyze
Definition: explain.h:42
int instrument_options
Definition: execdesc.h:44
void InstrEndLoop(Instrumentation *instr)
Definition: instrument.c:121
void ExplainEndOutput(ExplainState *es)
Definition: explain.c:4489
#define auto_explain_enabled()
Definition: auto_explain.c:67
void ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc)
Definition: explain.c:780
void pfree(void *pointer)
Definition: mcxt.c:1056
void ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc)
Definition: explain.c:731
void ExplainBeginOutput(ExplainState *es)
Definition: explain.c:4458
void ExplainQueryText(ExplainState *es, QueryDesc *queryDesc)
Definition: explain.c:946
bool timing
Definition: explain.h:46
static int auto_explain_log_min_duration
Definition: auto_explain.c:26
static bool auto_explain_log_timing
Definition: auto_explain.c:32
static bool auto_explain_log_wal
Definition: auto_explain.c:30
static bool auto_explain_log_analyze
Definition: auto_explain.c:27
bool verbose
Definition: explain.h:41
#define ereport(elevel,...)
Definition: elog.h:144
struct Instrumentation * totaltime
Definition: execdesc.h:55
static ExecutorEnd_hook_type prev_ExecutorEnd
Definition: auto_explain.c:76
bool wal
Definition: explain.h:45
ExplainFormat format
Definition: explain.h:49
int errmsg(const char *fmt,...)
Definition: elog.c:824
bool buffers
Definition: explain.h:44
void ExplainPrintJITSummary(ExplainState *es, QueryDesc *queryDesc)
Definition: explain.c:826
static bool auto_explain_log_settings
Definition: auto_explain.c:33
StringInfo str
Definition: explain.h:39
bool settings
Definition: explain.h:48
static bool auto_explain_log_triggers
Definition: auto_explain.c:31

◆ explain_ExecutorFinish()

static void explain_ExecutorFinish ( QueryDesc queryDesc)
static

Definition at line 349 of file auto_explain.c.

References nesting_level, PG_END_TRY, PG_FINALLY, PG_TRY, prev_ExecutorFinish, and standard_ExecutorFinish().

Referenced by _PG_init().

350 {
351  nesting_level++;
352  PG_TRY();
353  {
355  prev_ExecutorFinish(queryDesc);
356  else
357  standard_ExecutorFinish(queryDesc);
358  }
359  PG_FINALLY();
360  {
361  nesting_level--;
362  }
363  PG_END_TRY();
364 }
void standard_ExecutorFinish(QueryDesc *queryDesc)
Definition: execMain.c:411
static int nesting_level
Definition: auto_explain.c:62
#define PG_FINALLY()
Definition: elog.h:312
static ExecutorFinish_hook_type prev_ExecutorFinish
Definition: auto_explain.c:75
#define PG_TRY()
Definition: elog.h:295
#define PG_END_TRY()
Definition: elog.h:320

◆ explain_ExecutorRun()

static void explain_ExecutorRun ( QueryDesc queryDesc,
ScanDirection  direction,
uint64  count,
bool  execute_once 
)
static

Definition at line 327 of file auto_explain.c.

References nesting_level, PG_END_TRY, PG_FINALLY, PG_TRY, prev_ExecutorRun, and standard_ExecutorRun().

Referenced by _PG_init().

329 {
330  nesting_level++;
331  PG_TRY();
332  {
333  if (prev_ExecutorRun)
334  prev_ExecutorRun(queryDesc, direction, count, execute_once);
335  else
336  standard_ExecutorRun(queryDesc, direction, count, execute_once);
337  }
338  PG_FINALLY();
339  {
340  nesting_level--;
341  }
342  PG_END_TRY();
343 }
void standard_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once)
Definition: execMain.c:312
static ExecutorRun_hook_type prev_ExecutorRun
Definition: auto_explain.c:74
static int nesting_level
Definition: auto_explain.c:62
#define PG_FINALLY()
Definition: elog.h:312
#define PG_TRY()
Definition: elog.h:295
#define PG_END_TRY()
Definition: elog.h:320

◆ explain_ExecutorStart()

static void explain_ExecutorStart ( QueryDesc queryDesc,
int  eflags 
)
static

Definition at line 263 of file auto_explain.c.

References auto_explain_enabled, auto_explain_log_analyze, auto_explain_log_buffers, auto_explain_log_min_duration, auto_explain_log_timing, auto_explain_log_wal, auto_explain_sample_rate, current_query_sampled, EState::es_query_cxt, QueryDesc::estate, EXEC_FLAG_EXPLAIN_ONLY, InstrAlloc(), INSTRUMENT_ALL, INSTRUMENT_BUFFERS, QueryDesc::instrument_options, INSTRUMENT_ROWS, INSTRUMENT_TIMER, INSTRUMENT_WAL, IsParallelWorker, MAX_RANDOM_VALUE, MemoryContextSwitchTo(), nesting_level, prev_ExecutorStart, random(), standard_ExecutorStart(), and QueryDesc::totaltime.

Referenced by _PG_init().

264 {
265  /*
266  * At the beginning of each top-level statement, decide whether we'll
267  * sample this statement. If nested-statement explaining is enabled,
268  * either all nested statements will be explained or none will.
269  *
270  * When in a parallel worker, we should do nothing, which we can implement
271  * cheaply by pretending we decided not to sample the current statement.
272  * If EXPLAIN is active in the parent session, data will be collected and
273  * reported back to the parent, and it's no business of ours to interfere.
274  */
275  if (nesting_level == 0)
276  {
279  ((double) MAX_RANDOM_VALUE + 1));
280  else
281  current_query_sampled = false;
282  }
283 
284  if (auto_explain_enabled())
285  {
286  /* Enable per-node instrumentation iff log_analyze is required. */
287  if (auto_explain_log_analyze && (eflags & EXEC_FLAG_EXPLAIN_ONLY) == 0)
288  {
290  queryDesc->instrument_options |= INSTRUMENT_TIMER;
291  else
292  queryDesc->instrument_options |= INSTRUMENT_ROWS;
296  queryDesc->instrument_options |= INSTRUMENT_WAL;
297  }
298  }
299 
300  if (prev_ExecutorStart)
301  prev_ExecutorStart(queryDesc, eflags);
302  else
303  standard_ExecutorStart(queryDesc, eflags);
304 
305  if (auto_explain_enabled())
306  {
307  /*
308  * Set up to track total elapsed time in ExecutorRun. Make sure the
309  * space is allocated in the per-query context so it will go away at
310  * ExecutorEnd.
311  */
312  if (queryDesc->totaltime == NULL)
313  {
314  MemoryContext oldcxt;
315 
316  oldcxt = MemoryContextSwitchTo(queryDesc->estate->es_query_cxt);
317  queryDesc->totaltime = InstrAlloc(1, INSTRUMENT_ALL);
318  MemoryContextSwitchTo(oldcxt);
319  }
320  }
321 }
static double auto_explain_sample_rate
Definition: auto_explain.c:37
static bool current_query_sampled
Definition: auto_explain.c:65
EState * estate
Definition: execdesc.h:48
long random(void)
Definition: random.c:22
static bool auto_explain_log_buffers
Definition: auto_explain.c:29
void standard_ExecutorStart(QueryDesc *queryDesc, int eflags)
Definition: execMain.c:152
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
Instrumentation * InstrAlloc(int n, int instrument_options)
Definition: instrument.c:31
int instrument_options
Definition: execdesc.h:44
static ExecutorStart_hook_type prev_ExecutorStart
Definition: auto_explain.c:73
#define auto_explain_enabled()
Definition: auto_explain.c:67
MemoryContext es_query_cxt
Definition: execnodes.h:555
static int nesting_level
Definition: auto_explain.c:62
#define MAX_RANDOM_VALUE
#define IsParallelWorker()
Definition: parallel.h:61
static int auto_explain_log_min_duration
Definition: auto_explain.c:26
static bool auto_explain_log_timing
Definition: auto_explain.c:32
static bool auto_explain_log_wal
Definition: auto_explain.c:30
static bool auto_explain_log_analyze
Definition: auto_explain.c:27
struct Instrumentation * totaltime
Definition: execdesc.h:55
#define EXEC_FLAG_EXPLAIN_ONLY
Definition: executor.h:56

Variable Documentation

◆ auto_explain_log_analyze

bool auto_explain_log_analyze = false
static

Definition at line 27 of file auto_explain.c.

Referenced by _PG_init(), explain_ExecutorEnd(), and explain_ExecutorStart().

◆ auto_explain_log_buffers

bool auto_explain_log_buffers = false
static

Definition at line 29 of file auto_explain.c.

Referenced by _PG_init(), explain_ExecutorEnd(), and explain_ExecutorStart().

◆ auto_explain_log_format

int auto_explain_log_format = EXPLAIN_FORMAT_TEXT
static

Definition at line 34 of file auto_explain.c.

Referenced by _PG_init(), and explain_ExecutorEnd().

◆ auto_explain_log_level

int auto_explain_log_level = LOG
static

Definition at line 35 of file auto_explain.c.

Referenced by _PG_init(), and explain_ExecutorEnd().

◆ auto_explain_log_min_duration

int auto_explain_log_min_duration = -1
static

Definition at line 26 of file auto_explain.c.

Referenced by _PG_init(), explain_ExecutorEnd(), and explain_ExecutorStart().

◆ auto_explain_log_nested_statements

bool auto_explain_log_nested_statements = false
static

Definition at line 36 of file auto_explain.c.

Referenced by _PG_init().

◆ auto_explain_log_settings

bool auto_explain_log_settings = false
static

Definition at line 33 of file auto_explain.c.

Referenced by _PG_init(), and explain_ExecutorEnd().

◆ auto_explain_log_timing

bool auto_explain_log_timing = true
static

Definition at line 32 of file auto_explain.c.

Referenced by _PG_init(), explain_ExecutorEnd(), and explain_ExecutorStart().

◆ auto_explain_log_triggers

bool auto_explain_log_triggers = false
static

Definition at line 31 of file auto_explain.c.

Referenced by _PG_init(), and explain_ExecutorEnd().

◆ auto_explain_log_verbose

bool auto_explain_log_verbose = false
static

Definition at line 28 of file auto_explain.c.

Referenced by _PG_init(), and explain_ExecutorEnd().

◆ auto_explain_log_wal

bool auto_explain_log_wal = false
static

Definition at line 30 of file auto_explain.c.

Referenced by _PG_init(), explain_ExecutorEnd(), and explain_ExecutorStart().

◆ auto_explain_sample_rate

double auto_explain_sample_rate = 1
static

Definition at line 37 of file auto_explain.c.

Referenced by _PG_init(), and explain_ExecutorStart().

◆ current_query_sampled

bool current_query_sampled = false
static

Definition at line 65 of file auto_explain.c.

Referenced by explain_ExecutorStart().

◆ format_options

const struct config_enum_entry format_options[]
static
Initial value:
= {
{"text", EXPLAIN_FORMAT_TEXT, false},
{"xml", EXPLAIN_FORMAT_XML, false},
{"json", EXPLAIN_FORMAT_JSON, false},
{"yaml", EXPLAIN_FORMAT_YAML, false},
{NULL, 0, false}
}

Definition at line 39 of file auto_explain.c.

◆ loglevel_options

const struct config_enum_entry loglevel_options[]
static
Initial value:
= {
{"debug5", DEBUG5, false},
{"debug4", DEBUG4, false},
{"debug3", DEBUG3, false},
{"debug2", DEBUG2, false},
{"debug1", DEBUG1, false},
{"debug", DEBUG2, true},
{"info", INFO, false},
{"notice", NOTICE, false},
{"warning", WARNING, false},
{"log", LOG, false},
{NULL, 0, false}
}
#define DEBUG1
Definition: elog.h:25
#define DEBUG3
Definition: elog.h:23
#define INFO
Definition: elog.h:33
#define LOG
Definition: elog.h:26
#define DEBUG4
Definition: elog.h:22
#define DEBUG2
Definition: elog.h:24
#define WARNING
Definition: elog.h:40
#define NOTICE
Definition: elog.h:37
#define DEBUG5
Definition: elog.h:20

Definition at line 47 of file auto_explain.c.

◆ nesting_level

int nesting_level = 0
static

◆ PG_MODULE_MAGIC

PG_MODULE_MAGIC

Definition at line 23 of file auto_explain.c.

◆ prev_ExecutorEnd

ExecutorEnd_hook_type prev_ExecutorEnd = NULL
static

Definition at line 76 of file auto_explain.c.

Referenced by _PG_fini(), _PG_init(), and explain_ExecutorEnd().

◆ prev_ExecutorFinish

ExecutorFinish_hook_type prev_ExecutorFinish = NULL
static

Definition at line 75 of file auto_explain.c.

Referenced by _PG_fini(), _PG_init(), and explain_ExecutorFinish().

◆ prev_ExecutorRun

ExecutorRun_hook_type prev_ExecutorRun = NULL
static

Definition at line 74 of file auto_explain.c.

Referenced by _PG_fini(), _PG_init(), and explain_ExecutorRun().

◆ prev_ExecutorStart

ExecutorStart_hook_type prev_ExecutorStart = NULL
static

Definition at line 73 of file auto_explain.c.

Referenced by _PG_fini(), _PG_init(), and explain_ExecutorStart().