aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/explain.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-02-22 23:44:25 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-02-22 23:44:25 +0000
commitcc77005df7177d9af1c23b7af1cac08102fcbca9 (patch)
treef3fa89de1b1e46d901bd0f17bbd3ceed4fa8a480 /src/backend/commands/explain.c
parent3c5985b473024f45005c8b4776d4d63ed2d39d82 (diff)
downloadpostgresql-cc77005df7177d9af1c23b7af1cac08102fcbca9.tar.gz
postgresql-cc77005df7177d9af1c23b7af1cac08102fcbca9.zip
Change Agg and Group nodes so that Vars contained in their targetlists
and quals have varno OUTER, rather than zero, to indicate a reference to an output of their lefttree subplan. This is consistent with the way that every other upper-level node type does it, and allows some simplifications in setrefs.c and EXPLAIN.
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r--src/backend/commands/explain.c68
1 files changed, 41 insertions, 27 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 34784eb078e..6a97b01ec3c 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994-5, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.157 2007/02/22 22:00:22 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.158 2007/02/22 23:44:24 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -52,8 +52,8 @@ static void show_scan_qual(List *qual, const char *qlabel,
int scanrelid, Plan *outer_plan,
StringInfo str, int indent, ExplainState *es);
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,
+ const char *outer_name, Plan *outer_plan,
+ const char *inner_name, Plan *inner_plan,
StringInfo str, int indent, ExplainState *es);
static void show_sort_keys(Plan *sortplan, int nkeys, AttrNumber *keycols,
const char *qlabel,
@@ -783,55 +783,55 @@ explain_outNode(StringInfo str,
case T_NestLoop:
show_upper_qual(((NestLoop *) plan)->join.joinqual,
"Join Filter",
- "outer", OUTER, outerPlan(plan),
- "inner", INNER, innerPlan(plan),
+ "outer", outerPlan(plan),
+ "inner", innerPlan(plan),
str, indent, es);
show_upper_qual(plan->qual,
"Filter",
- "outer", OUTER, outerPlan(plan),
- "inner", INNER, innerPlan(plan),
+ "outer", outerPlan(plan),
+ "inner", innerPlan(plan),
str, indent, es);
break;
case T_MergeJoin:
show_upper_qual(((MergeJoin *) plan)->mergeclauses,
"Merge Cond",
- "outer", OUTER, outerPlan(plan),
- "inner", INNER, innerPlan(plan),
+ "outer", outerPlan(plan),
+ "inner", innerPlan(plan),
str, indent, es);
show_upper_qual(((MergeJoin *) plan)->join.joinqual,
"Join Filter",
- "outer", OUTER, outerPlan(plan),
- "inner", INNER, innerPlan(plan),
+ "outer", outerPlan(plan),
+ "inner", innerPlan(plan),
str, indent, es);
show_upper_qual(plan->qual,
"Filter",
- "outer", OUTER, outerPlan(plan),
- "inner", INNER, innerPlan(plan),
+ "outer", outerPlan(plan),
+ "inner", innerPlan(plan),
str, indent, es);
break;
case T_HashJoin:
show_upper_qual(((HashJoin *) plan)->hashclauses,
"Hash Cond",
- "outer", OUTER, outerPlan(plan),
- "inner", INNER, innerPlan(plan),
+ "outer", outerPlan(plan),
+ "inner", innerPlan(plan),
str, indent, es);
show_upper_qual(((HashJoin *) plan)->join.joinqual,
"Join Filter",
- "outer", OUTER, outerPlan(plan),
- "inner", INNER, innerPlan(plan),
+ "outer", outerPlan(plan),
+ "inner", innerPlan(plan),
str, indent, es);
show_upper_qual(plan->qual,
"Filter",
- "outer", OUTER, outerPlan(plan),
- "inner", INNER, innerPlan(plan),
+ "outer", outerPlan(plan),
+ "inner", innerPlan(plan),
str, indent, es);
break;
case T_Agg:
case T_Group:
show_upper_qual(plan->qual,
"Filter",
- "subplan", 0, outerPlan(plan),
- "", 0, NULL,
+ "subplan", outerPlan(plan),
+ "", NULL,
str, indent, es);
break;
case T_Sort:
@@ -844,13 +844,13 @@ explain_outNode(StringInfo str,
case T_Result:
show_upper_qual((List *) ((Result *) plan)->resconstantqual,
"One-Time Filter",
- "subplan", OUTER, outerPlan(plan),
- "", 0, NULL,
+ "subplan", outerPlan(plan),
+ "", NULL,
str, indent, es);
show_upper_qual(plan->qual,
"Filter",
- "subplan", OUTER, outerPlan(plan),
- "", 0, NULL,
+ "subplan", outerPlan(plan),
+ "", NULL,
str, indent, es);
break;
default:
@@ -1088,13 +1088,15 @@ show_scan_qual(List *qual, const char *qlabel,
*/
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,
+ const char *outer_name, Plan *outer_plan,
+ const char *inner_name, Plan *inner_plan,
StringInfo str, int indent, ExplainState *es)
{
List *context;
Node *outercontext;
Node *innercontext;
+ int outer_varno;
+ int inner_varno;
Node *node;
char *exprstr;
int i;
@@ -1105,15 +1107,27 @@ show_upper_qual(List *qual, const char *qlabel,
/* Generate deparse context */
if (outer_plan)
+ {
outercontext = deparse_context_for_subplan(outer_name,
(Node *) outer_plan);
+ outer_varno = OUTER;
+ }
else
+ {
outercontext = NULL;
+ outer_varno = 0;
+ }
if (inner_plan)
+ {
innercontext = deparse_context_for_subplan(inner_name,
(Node *) inner_plan);
+ inner_varno = INNER;
+ }
else
+ {
innercontext = NULL;
+ inner_varno = 0;
+ }
context = deparse_context_for_plan(outer_varno, outercontext,
inner_varno, innercontext,
es->rtable);