PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
explain_format.c File Reference
#include "postgres.h"
#include "commands/explain.h"
#include "commands/explain_format.h"
#include "commands/explain_state.h"
#include "utils/json.h"
#include "utils/xml.h"
Include dependency graph for explain_format.c:

Go to the source code of this file.

Macros

#define X_OPENING   0
 
#define X_CLOSING   1
 
#define X_CLOSE_IMMEDIATE   2
 
#define X_NOWHITESPACE   4
 

Functions

static void ExplainJSONLineEnding (ExplainState *es)
 
static void ExplainXMLTag (const char *tagname, int flags, ExplainState *es)
 
static void ExplainYAMLLineStarting (ExplainState *es)
 
static void escape_yaml (StringInfo buf, const char *str)
 
void ExplainPropertyList (const char *qlabel, List *data, ExplainState *es)
 
void ExplainPropertyListNested (const char *qlabel, List *data, ExplainState *es)
 
static void ExplainProperty (const char *qlabel, const char *unit, const char *value, bool numeric, ExplainState *es)
 
void ExplainPropertyText (const char *qlabel, const char *value, ExplainState *es)
 
void ExplainPropertyInteger (const char *qlabel, const char *unit, int64 value, ExplainState *es)
 
void ExplainPropertyUInteger (const char *qlabel, const char *unit, uint64 value, ExplainState *es)
 
void ExplainPropertyFloat (const char *qlabel, const char *unit, double value, int ndigits, ExplainState *es)
 
void ExplainPropertyBool (const char *qlabel, bool value, ExplainState *es)
 
void ExplainOpenGroup (const char *objtype, const char *labelname, bool labeled, ExplainState *es)
 
void ExplainCloseGroup (const char *objtype, const char *labelname, bool labeled, ExplainState *es)
 
void ExplainOpenSetAsideGroup (const char *objtype, const char *labelname, bool labeled, int depth, ExplainState *es)
 
void ExplainSaveGroup (ExplainState *es, int depth, int *state_save)
 
void ExplainRestoreGroup (ExplainState *es, int depth, int *state_save)
 
void ExplainDummyGroup (const char *objtype, const char *labelname, ExplainState *es)
 
void ExplainBeginOutput (ExplainState *es)
 
void ExplainEndOutput (ExplainState *es)
 
void ExplainSeparatePlans (ExplainState *es)
 
void ExplainIndentText (ExplainState *es)
 

Macro Definition Documentation

◆ X_CLOSE_IMMEDIATE

#define X_CLOSE_IMMEDIATE   2

Definition at line 25 of file explain_format.c.

◆ X_CLOSING

#define X_CLOSING   1

Definition at line 24 of file explain_format.c.

◆ X_NOWHITESPACE

#define X_NOWHITESPACE   4

Definition at line 26 of file explain_format.c.

◆ X_OPENING

#define X_OPENING   0

Definition at line 23 of file explain_format.c.

Function Documentation

◆ escape_yaml()

static void escape_yaml ( StringInfo  buf,
const char *  str 
)
static

Definition at line 711 of file explain_format.c.

712{
714}
const char * str
void escape_json(StringInfo buf, const char *str)
Definition: json.c:1602
static char * buf
Definition: pg_test_fsync.c:72

References buf, escape_json(), and str.

Referenced by ExplainDummyGroup(), ExplainProperty(), ExplainPropertyList(), and ExplainPropertyListNested().

◆ ExplainBeginOutput()

void ExplainBeginOutput ( ExplainState es)

Definition at line 535 of file explain_format.c.

536{
537 switch (es->format)
538 {
540 /* nothing to do */
541 break;
542
545 "<explain xmlns=\"http://www.postgresql.org/2009/explain\">\n");
546 es->indent++;
547 break;
548
550 /* top-level structure is an array of plans */
551 appendStringInfoChar(es->str, '[');
553 es->indent++;
554 break;
555
558 break;
559 }
560}
@ EXPLAIN_FORMAT_XML
Definition: explain_state.h:30
@ EXPLAIN_FORMAT_YAML
Definition: explain_state.h:32
@ EXPLAIN_FORMAT_TEXT
Definition: explain_state.h:29
@ EXPLAIN_FORMAT_JSON
Definition: explain_state.h:31
List * lcons_int(int datum, List *list)
Definition: list.c:513
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:230
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:242
List * grouping_stack
Definition: explain_state.h:62
StringInfo str
Definition: explain_state.h:46
ExplainFormat format
Definition: explain_state.h:59

References appendStringInfoChar(), appendStringInfoString(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainState::format, ExplainState::grouping_stack, ExplainState::indent, lcons_int(), and ExplainState::str.

Referenced by explain_ExecutorEnd(), and ExplainQuery().

◆ ExplainCloseGroup()

void ExplainCloseGroup ( const char *  objtype,
const char *  labelname,
bool  labeled,
ExplainState es 
)

Definition at line 342 of file explain_format.c.

344{
345 switch (es->format)
346 {
348 /* nothing to do */
349 break;
350
352 es->indent--;
353 ExplainXMLTag(objtype, X_CLOSING, es);
354 break;
355
357 es->indent--;
358 appendStringInfoChar(es->str, '\n');
359 appendStringInfoSpaces(es->str, 2 * es->indent);
360 appendStringInfoChar(es->str, labeled ? '}' : ']');
362 break;
363
365 es->indent--;
367 break;
368 }
369}
static void ExplainXMLTag(const char *tagname, int flags, ExplainState *es)
#define X_CLOSING
List * list_delete_first(List *list)
Definition: list.c:943
void appendStringInfoSpaces(StringInfo str, int count)
Definition: stringinfo.c:260

References appendStringInfoChar(), appendStringInfoSpaces(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainXMLTag(), ExplainState::format, ExplainState::grouping_stack, ExplainState::indent, list_delete_first(), ExplainState::str, and X_CLOSING.

Referenced by ExplainFlushWorkersState(), ExplainNode(), ExplainOnePlan(), ExplainPrintJIT(), ExplainPrintSerialize(), ExplainPrintSettings(), ExplainPrintTriggers(), overexplain_debug(), overexplain_range_table(), report_triggers(), show_grouping_set_keys(), show_grouping_sets(), show_incremental_sort_group_info(), and show_modifytable_info().

◆ ExplainDummyGroup()

void ExplainDummyGroup ( const char *  objtype,
const char *  labelname,
ExplainState es 
)

Definition at line 489 of file explain_format.c.

490{
491 switch (es->format)
492 {
494 /* nothing to do */
495 break;
496
498 ExplainXMLTag(objtype, X_CLOSE_IMMEDIATE, es);
499 break;
500
503 appendStringInfoSpaces(es->str, 2 * es->indent);
504 if (labelname)
505 {
506 escape_json(es->str, labelname);
507 appendStringInfoString(es->str, ": ");
508 }
509 escape_json(es->str, objtype);
510 break;
511
514 if (labelname)
515 {
516 escape_yaml(es->str, labelname);
517 appendStringInfoString(es->str, ": ");
518 }
519 else
520 {
521 appendStringInfoString(es->str, "- ");
522 }
523 escape_yaml(es->str, objtype);
524 break;
525 }
526}
#define X_CLOSE_IMMEDIATE
static void ExplainYAMLLineStarting(ExplainState *es)
static void ExplainJSONLineEnding(ExplainState *es)
static void escape_yaml(StringInfo buf, const char *str)

References appendStringInfoSpaces(), appendStringInfoString(), escape_json(), escape_yaml(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainJSONLineEnding(), ExplainXMLTag(), ExplainYAMLLineStarting(), ExplainState::format, ExplainState::indent, ExplainState::str, and X_CLOSE_IMMEDIATE.

Referenced by ExplainOneUtility().

◆ ExplainEndOutput()

void ExplainEndOutput ( ExplainState es)

Definition at line 566 of file explain_format.c.

567{
568 switch (es->format)
569 {
571 /* nothing to do */
572 break;
573
575 es->indent--;
576 appendStringInfoString(es->str, "</explain>");
577 break;
578
580 es->indent--;
581 appendStringInfoString(es->str, "\n]");
583 break;
584
587 break;
588 }
589}

References appendStringInfoString(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainState::format, ExplainState::grouping_stack, ExplainState::indent, list_delete_first(), and ExplainState::str.

Referenced by explain_ExecutorEnd(), and ExplainQuery().

◆ ExplainIndentText()

◆ ExplainJSONLineEnding()

static void ExplainJSONLineEnding ( ExplainState es)
static

◆ ExplainOpenGroup()

void ExplainOpenGroup ( const char *  objtype,
const char *  labelname,
bool  labeled,
ExplainState es 
)

Definition at line 279 of file explain_format.c.

281{
282 switch (es->format)
283 {
285 /* nothing to do */
286 break;
287
289 ExplainXMLTag(objtype, X_OPENING, es);
290 es->indent++;
291 break;
292
295 appendStringInfoSpaces(es->str, 2 * es->indent);
296 if (labelname)
297 {
298 escape_json(es->str, labelname);
299 appendStringInfoString(es->str, ": ");
300 }
301 appendStringInfoChar(es->str, labeled ? '{' : '[');
302
303 /*
304 * In JSON format, the grouping_stack is an integer list. 0 means
305 * we've emitted nothing at this grouping level, 1 means we've
306 * emitted something (and so the next item needs a comma). See
307 * ExplainJSONLineEnding().
308 */
310 es->indent++;
311 break;
312
314
315 /*
316 * In YAML format, the grouping stack is an integer list. 0 means
317 * we've emitted nothing at this grouping level AND this grouping
318 * level is unlabeled and must be marked with "- ". See
319 * ExplainYAMLLineStarting().
320 */
322 if (labelname)
323 {
324 appendStringInfo(es->str, "%s: ", labelname);
326 }
327 else
328 {
329 appendStringInfoString(es->str, "- ");
331 }
332 es->indent++;
333 break;
334 }
335}
#define X_OPENING
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:145

References appendStringInfo(), appendStringInfoChar(), appendStringInfoSpaces(), appendStringInfoString(), escape_json(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainJSONLineEnding(), ExplainXMLTag(), ExplainYAMLLineStarting(), ExplainState::format, ExplainState::grouping_stack, ExplainState::indent, lcons_int(), ExplainState::str, and X_OPENING.

Referenced by ExplainFlushWorkersState(), ExplainNode(), ExplainOnePlan(), ExplainPrintJIT(), ExplainPrintSerialize(), ExplainPrintSettings(), ExplainPrintTriggers(), overexplain_debug(), overexplain_range_table(), report_triggers(), show_grouping_set_keys(), show_grouping_sets(), show_incremental_sort_group_info(), and show_modifytable_info().

◆ ExplainOpenSetAsideGroup()

void ExplainOpenSetAsideGroup ( const char *  objtype,
const char *  labelname,
bool  labeled,
int  depth,
ExplainState es 
)

Definition at line 389 of file explain_format.c.

391{
392 switch (es->format)
393 {
395 /* nothing to do */
396 break;
397
399 es->indent += depth;
400 break;
401
404 es->indent += depth;
405 break;
406
408 if (labelname)
410 else
412 es->indent += depth;
413 break;
414 }
415}

References EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainState::format, ExplainState::grouping_stack, ExplainState::indent, and lcons_int().

Referenced by ExplainOpenWorker().

◆ ExplainProperty()

static void ExplainProperty ( const char *  qlabel,
const char *  unit,
const char *  value,
bool  numeric,
ExplainState es 
)
static

Definition at line 161 of file explain_format.c.

163{
164 switch (es->format)
165 {
168 if (unit)
169 appendStringInfo(es->str, "%s: %s %s\n", qlabel, value, unit);
170 else
171 appendStringInfo(es->str, "%s: %s\n", qlabel, value);
172 break;
173
175 {
176 char *str;
177
178 appendStringInfoSpaces(es->str, es->indent * 2);
182 pfree(str);
184 appendStringInfoChar(es->str, '\n');
185 }
186 break;
187
190 appendStringInfoSpaces(es->str, es->indent * 2);
191 escape_json(es->str, qlabel);
192 appendStringInfoString(es->str, ": ");
193 if (numeric)
195 else
196 escape_json(es->str, value);
197 break;
198
201 appendStringInfo(es->str, "%s: ", qlabel);
202 if (numeric)
204 else
205 escape_yaml(es->str, value);
206 break;
207 }
208}
#define X_NOWHITESPACE
void ExplainIndentText(ExplainState *es)
static struct @165 value
void pfree(void *pointer)
Definition: mcxt.c:1524
char * escape_xml(const char *str)
Definition: xml.c:2695

References appendStringInfo(), appendStringInfoChar(), appendStringInfoSpaces(), appendStringInfoString(), escape_json(), escape_xml(), escape_yaml(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainIndentText(), ExplainJSONLineEnding(), ExplainXMLTag(), ExplainYAMLLineStarting(), ExplainState::format, ExplainState::indent, pfree(), ExplainState::str, str, value, X_CLOSING, X_NOWHITESPACE, and X_OPENING.

Referenced by ExplainPropertyBool(), ExplainPropertyFloat(), ExplainPropertyInteger(), ExplainPropertyText(), and ExplainPropertyUInteger().

◆ ExplainPropertyBool()

void ExplainPropertyBool ( const char *  qlabel,
bool  value,
ExplainState es 
)

Definition at line 264 of file explain_format.c.

265{
266 ExplainProperty(qlabel, NULL, value ? "true" : "false", true, es);
267}
static void ExplainProperty(const char *qlabel, const char *unit, const char *value, bool numeric, ExplainState *es)

References ExplainProperty(), and value.

Referenced by ExplainNode(), ExplainPrintJIT(), overexplain_per_node_hook(), and overexplain_range_table().

◆ ExplainPropertyFloat()

void ExplainPropertyFloat ( const char *  qlabel,
const char *  unit,
double  value,
int  ndigits,
ExplainState es 
)

Definition at line 250 of file explain_format.c.

252{
253 char *buf;
254
255 buf = psprintf("%.*f", ndigits, value);
256 ExplainProperty(qlabel, unit, buf, true, es);
257 pfree(buf);
258}
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43

References buf, ExplainProperty(), pfree(), psprintf(), and value.

Referenced by ExplainNode(), ExplainOnePlan(), ExplainPrintJIT(), ExplainPrintSerialize(), overexplain_range_table(), report_triggers(), show_buffer_usage(), show_instrumentation_count(), and show_modifytable_info().

◆ ExplainPropertyInteger()

◆ ExplainPropertyList()

void ExplainPropertyList ( const char *  qlabel,
List data,
ExplainState es 
)

Definition at line 38 of file explain_format.c.

39{
40 ListCell *lc;
41 bool first = true;
42
43 switch (es->format)
44 {
47 appendStringInfo(es->str, "%s: ", qlabel);
48 foreach(lc, data)
49 {
50 if (!first)
51 appendStringInfoString(es->str, ", ");
52 appendStringInfoString(es->str, (const char *) lfirst(lc));
53 first = false;
54 }
55 appendStringInfoChar(es->str, '\n');
56 break;
57
59 ExplainXMLTag(qlabel, X_OPENING, es);
60 foreach(lc, data)
61 {
62 char *str;
63
64 appendStringInfoSpaces(es->str, es->indent * 2 + 2);
65 appendStringInfoString(es->str, "<Item>");
66 str = escape_xml((const char *) lfirst(lc));
68 pfree(str);
69 appendStringInfoString(es->str, "</Item>\n");
70 }
71 ExplainXMLTag(qlabel, X_CLOSING, es);
72 break;
73
76 appendStringInfoSpaces(es->str, es->indent * 2);
77 escape_json(es->str, qlabel);
78 appendStringInfoString(es->str, ": [");
79 foreach(lc, data)
80 {
81 if (!first)
82 appendStringInfoString(es->str, ", ");
83 escape_json(es->str, (const char *) lfirst(lc));
84 first = false;
85 }
86 appendStringInfoChar(es->str, ']');
87 break;
88
91 appendStringInfo(es->str, "%s: ", qlabel);
92 foreach(lc, data)
93 {
94 appendStringInfoChar(es->str, '\n');
95 appendStringInfoSpaces(es->str, es->indent * 2 + 2);
96 appendStringInfoString(es->str, "- ");
97 escape_yaml(es->str, (const char *) lfirst(lc));
98 }
99 break;
100 }
101}
const void * data
#define lfirst(lc)
Definition: pg_list.h:172

References appendStringInfo(), appendStringInfoChar(), appendStringInfoSpaces(), appendStringInfoString(), data, escape_json(), escape_xml(), escape_yaml(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainIndentText(), ExplainJSONLineEnding(), ExplainXMLTag(), ExplainYAMLLineStarting(), ExplainState::format, ExplainState::indent, lfirst, pfree(), ExplainState::str, str, X_CLOSING, and X_OPENING.

Referenced by ExplainPropertyListNested(), show_incremental_sort_group_info(), show_modifytable_info(), show_plan_tlist(), show_sort_group_keys(), and show_tablesample().

◆ ExplainPropertyListNested()

void ExplainPropertyListNested ( const char *  qlabel,
List data,
ExplainState es 
)

Definition at line 108 of file explain_format.c.

109{
110 ListCell *lc;
111 bool first = true;
112
113 switch (es->format)
114 {
117 ExplainPropertyList(qlabel, data, es);
118 return;
119
122 appendStringInfoSpaces(es->str, es->indent * 2);
123 appendStringInfoChar(es->str, '[');
124 foreach(lc, data)
125 {
126 if (!first)
127 appendStringInfoString(es->str, ", ");
128 escape_json(es->str, (const char *) lfirst(lc));
129 first = false;
130 }
131 appendStringInfoChar(es->str, ']');
132 break;
133
136 appendStringInfoString(es->str, "- [");
137 foreach(lc, data)
138 {
139 if (!first)
140 appendStringInfoString(es->str, ", ");
141 escape_yaml(es->str, (const char *) lfirst(lc));
142 first = false;
143 }
144 appendStringInfoChar(es->str, ']');
145 break;
146 }
147}
void ExplainPropertyList(const char *qlabel, List *data, ExplainState *es)

References appendStringInfoChar(), appendStringInfoSpaces(), appendStringInfoString(), data, escape_json(), escape_yaml(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainJSONLineEnding(), ExplainPropertyList(), ExplainYAMLLineStarting(), ExplainState::format, ExplainState::indent, lfirst, and ExplainState::str.

Referenced by show_grouping_set_keys().

◆ ExplainPropertyText()

◆ ExplainPropertyUInteger()

void ExplainPropertyUInteger ( const char *  qlabel,
const char *  unit,
uint64  value,
ExplainState es 
)

Definition at line 236 of file explain_format.c.

238{
239 char buf[32];
240
241 snprintf(buf, sizeof(buf), UINT64_FORMAT, value);
242 ExplainProperty(qlabel, unit, buf, true, es);
243}
#define UINT64_FORMAT
Definition: c.h:521

References buf, ExplainProperty(), snprintf, UINT64_FORMAT, and value.

Referenced by ExplainPrintSerialize(), overexplain_range_table(), show_hash_info(), show_indexsearches_info(), show_tidbitmap_info(), and show_wal_usage().

◆ ExplainRestoreGroup()

void ExplainRestoreGroup ( ExplainState es,
int  depth,
int *  state_save 
)

Definition at line 458 of file explain_format.c.

459{
460 switch (es->format)
461 {
463 /* nothing to do */
464 break;
465
467 es->indent += depth;
468 break;
469
471 es->grouping_stack = lcons_int(*state_save, es->grouping_stack);
472 es->indent += depth;
473 break;
474
476 es->grouping_stack = lcons_int(*state_save, es->grouping_stack);
477 es->indent += depth;
478 break;
479 }
480}

References EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainState::format, ExplainState::grouping_stack, ExplainState::indent, and lcons_int().

Referenced by ExplainOpenWorker().

◆ ExplainSaveGroup()

void ExplainSaveGroup ( ExplainState es,
int  depth,
int *  state_save 
)

Definition at line 428 of file explain_format.c.

429{
430 switch (es->format)
431 {
433 /* nothing to do */
434 break;
435
437 es->indent -= depth;
438 break;
439
441 es->indent -= depth;
442 *state_save = linitial_int(es->grouping_stack);
444 break;
445
447 es->indent -= depth;
448 *state_save = linitial_int(es->grouping_stack);
450 break;
451 }
452}

References EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainState::format, ExplainState::grouping_stack, ExplainState::indent, linitial_int, and list_delete_first().

Referenced by ExplainCloseWorker().

◆ ExplainSeparatePlans()

void ExplainSeparatePlans ( ExplainState es)

Definition at line 595 of file explain_format.c.

596{
597 switch (es->format)
598 {
600 /* add a blank line */
601 appendStringInfoChar(es->str, '\n');
602 break;
603
607 /* nothing to do */
608 break;
609 }
610}

References appendStringInfoChar(), EXPLAIN_FORMAT_JSON, EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_YAML, ExplainState::format, and ExplainState::str.

Referenced by ExplainExecuteQuery(), and ExplainQuery().

◆ ExplainXMLTag()

static void ExplainXMLTag ( const char *  tagname,
int  flags,
ExplainState es 
)
static

Definition at line 624 of file explain_format.c.

625{
626 const char *s;
627 const char *valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
628
629 if ((flags & X_NOWHITESPACE) == 0)
630 appendStringInfoSpaces(es->str, 2 * es->indent);
632 if ((flags & X_CLOSING) != 0)
634 for (s = tagname; *s; s++)
635 appendStringInfoChar(es->str, strchr(valid, *s) ? *s : '-');
636 if ((flags & X_CLOSE_IMMEDIATE) != 0)
637 appendStringInfoString(es->str, " /");
639 if ((flags & X_NOWHITESPACE) == 0)
641}
#define appendStringInfoCharMacro(str, ch)
Definition: stringinfo.h:231

References appendStringInfoChar(), appendStringInfoCharMacro, appendStringInfoSpaces(), appendStringInfoString(), ExplainState::indent, ExplainState::str, X_CLOSE_IMMEDIATE, X_CLOSING, and X_NOWHITESPACE.

Referenced by ExplainCloseGroup(), ExplainDummyGroup(), ExplainOpenGroup(), ExplainProperty(), and ExplainPropertyList().

◆ ExplainYAMLLineStarting()