<variablelist>
- <varlistentry id="guc-explain-pretty-print" xreflabel="explain_pretty_print">
- <term><varname>explain_pretty_print</varname> (<type>boolean</type>)</term>
- <indexterm>
- <primary><varname>explain_pretty_print</> configuration parameter</primary>
- </indexterm>
- <listitem>
- <para>
- Determines whether <command>EXPLAIN VERBOSE</> uses the
- indented or non-indented format for displaying detailed
- query-tree dumps. The default is <literal>on</>.
- </para>
- </listitem>
- </varlistentry>
-
<varlistentry id="guc-dynamic-library-path" xreflabel="dynamic_library_path">
<term><varname>dynamic_library_path</varname> (<type>string</type>)</term>
<indexterm>
<term><literal>VERBOSE</literal></term>
<listitem>
<para>
- Show the full internal representation of the plan tree, rather
- than just a summary. Usually this option is only useful for
- specialized debugging purposes. The
- <literal>VERBOSE</literal> output is either pretty-printed or
- not, depending on the setting of the <xref
- linkend="guc-explain-pretty-print"> configuration parameter.
+ Include the output column list for each node in the plan tree.
</para>
</listitem>
</varlistentry>
#include "commands/prepare.h"
#include "commands/trigger.h"
#include "executor/instrument.h"
-#include "nodes/print.h"
#include "optimizer/clauses.h"
#include "optimizer/planner.h"
#include "optimizer/var.h"
typedef struct ExplainState
{
/* options */
- bool printNodes; /* do nodeToString() too */
+ bool printTList; /* print plan targetlists */
bool printAnalyze; /* print actual times */
/* other states */
PlannedStmt *pstmt; /* top of plan */
es = (ExplainState *) palloc0(sizeof(ExplainState));
- es->printNodes = stmt->verbose;
+ es->printTList = stmt->verbose;
es->printAnalyze = stmt->analyze;
es->pstmt = queryDesc->plannedstmt;
es->rtable = queryDesc->plannedstmt->rtable;
- if (es->printNodes)
- {
- char *s;
- char *f;
-
- s = nodeToString(queryDesc->plannedstmt->planTree);
- if (s)
- {
- if (Explain_pretty_print)
- f = pretty_format_node_dump(s);
- else
- f = format_node_dump(s);
- pfree(s);
- do_text_output_multiline(tstate, f);
- pfree(f);
- do_text_output_oneline(tstate, ""); /* separator line */
- }
- }
-
initStringInfo(&buf);
explain_outNode(&buf,
queryDesc->plannedstmt->planTree, queryDesc->planstate,
appendStringInfoChar(str, '\n');
/* target list */
- show_plan_tlist(plan, str, indent, es);
+ if (es->printTList)
+ show_plan_tlist(plan, str, indent, es);
/* quals, sort keys, etc */
switch (nodeTag(plan))
show_plan_tlist(Plan *plan,
StringInfo str, int indent, ExplainState *es)
{
-#ifdef EXPLAIN_PRINT_TLISTS
List *context;
bool useprefix;
ListCell *lc;
}
appendStringInfoChar(str, '\n');
-#endif /* EXPLAIN_PRINT_TLISTS */
}
/*
bool Debug_print_parse = false;
bool Debug_print_rewritten = false;
bool Debug_pretty_print = false;
-bool Explain_pretty_print = true;
bool log_parser_stats = false;
bool log_planner_stats = false;
},
#endif
- {
- {"explain_pretty_print", PGC_USERSET, CLIENT_CONN_OTHER,
- gettext_noop("Uses the indented output format for EXPLAIN VERBOSE."),
- NULL
- },
- &Explain_pretty_print,
- true, NULL, NULL
- },
-
{
{"track_activities", PGC_SUSET, STATS_COLLECTOR,
gettext_noop("Collects information about executing commands."),