aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/explain.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-05-18 21:38:41 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-05-18 21:38:41 +0000
commitdd9af92c413827404e87d479a48c5eb696857423 (patch)
tree987bfef5b84bde26f7f358852b1071c2660cc83b /src/backend/commands/explain.c
parenta5b370943e1a7936e0118641f16acf6dbcc829cc (diff)
downloadpostgresql-dd9af92c413827404e87d479a48c5eb696857423.tar.gz
postgresql-dd9af92c413827404e87d479a48c5eb696857423.zip
Add display of sort keys to the default EXPLAIN output.
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r--src/backend/commands/explain.c65
1 files changed, 63 insertions, 2 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index cb2b2d0f23e..a7412b0e720 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -5,7 +5,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994-5, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.77 2002/05/12 20:10:02 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.78 2002/05/18 21:38:40 tgl Exp $
*
*/
@@ -56,6 +56,8 @@ static void show_upper_qual(List *qual, const char *qlabel,
const char *outer_name, int outer_varno, Plan *outer_plan,
const char *inner_name, int inner_varno, Plan *inner_plan,
StringInfo str, int indent, ExplainState *es);
+static void show_sort_keys(List *tlist, int nkeys, const char *qlabel,
+ StringInfo str, int indent, ExplainState *es);
static Node *make_ors_ands_explicit(List *orclauses);
static TextOutputState *begin_text_output(CommandDest dest, char *title);
static void do_text_output(TextOutputState *tstate, char *aline);
@@ -410,7 +412,7 @@ explain_outNode(StringInfo str, Plan *plan, Plan *outer_plan,
}
appendStringInfo(str, "\n");
- /* quals */
+ /* quals, sort keys, etc */
switch (nodeTag(plan))
{
case T_IndexScan:
@@ -495,6 +497,11 @@ explain_outNode(StringInfo str, Plan *plan, Plan *outer_plan,
"", 0, NULL,
str, indent, es);
break;
+ case T_Sort:
+ show_sort_keys(plan->targetlist, ((Sort *) plan)->keycount,
+ "Sort Key",
+ str, indent, es);
+ break;
case T_Result:
show_upper_qual((List *) ((Result *) plan)->resconstantqual,
"One-Time Filter",
@@ -732,6 +739,60 @@ show_upper_qual(List *qual, const char *qlabel,
}
/*
+ * Show the sort keys for a Sort node.
+ */
+static void
+show_sort_keys(List *tlist, int nkeys, const char *qlabel,
+ StringInfo str, int indent, ExplainState *es)
+{
+ List *context;
+ bool useprefix;
+ int keyno;
+ List *tl;
+ char *exprstr;
+ int i;
+
+ if (nkeys <= 0)
+ return;
+
+ for (i = 0; i < indent; i++)
+ appendStringInfo(str, " ");
+ appendStringInfo(str, " %s: ", qlabel);
+
+ /*
+ * In this routine we expect that the plan node's tlist has not been
+ * processed by set_plan_references(), so any Vars will contain valid
+ * varnos referencing the actual rtable.
+ */
+ context = deparse_context_from_rtable(es->rtable);
+ useprefix = length(es->rtable) > 1;
+
+ for (keyno = 1; keyno <= nkeys; keyno++)
+ {
+ /* find key expression in tlist */
+ foreach(tl, tlist)
+ {
+ TargetEntry *target = (TargetEntry *) lfirst(tl);
+
+ if (target->resdom->reskey == keyno)
+ {
+ /* Deparse the expression */
+ exprstr = deparse_expression(target->expr, context, useprefix);
+ /* And add to str */
+ if (keyno > 1)
+ appendStringInfo(str, ", ");
+ appendStringInfo(str, "%s", exprstr);
+ break;
+ }
+ }
+ if (tl == NIL)
+ elog(ERROR, "show_sort_keys: no tlist entry for key %d", keyno);
+ }
+
+ appendStringInfo(str, "\n");
+}
+
+/*
* Indexscan qual lists have an implicit OR-of-ANDs structure. Make it
* explicit so deparsing works properly.
*/