7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.24 1998/09/01 04:27:53 momjian Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.25 1998/10/21 16:21:20 momjian Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
26
26
#include <optimizer/planner.h>
27
27
#include <access/xact.h>
28
28
#include <utils/relcache.h>
29
+ #include <rewrite/rewriteHandler.h>
29
30
30
31
typedef struct ExplainState
31
32
{
@@ -37,6 +38,8 @@ typedef struct ExplainState
37
38
} ExplainState ;
38
39
39
40
static char * Explain_PlanToString (Plan * plan , ExplainState * es );
41
+ static void ExplainOneQuery (Query * query , bool verbose , CommandDest dest );
42
+
40
43
41
44
/*
42
45
* ExplainQuery -
@@ -46,11 +49,8 @@ static char *Explain_PlanToString(Plan *plan, ExplainState *es);
46
49
void
47
50
ExplainQuery (Query * query , bool verbose , CommandDest dest )
48
51
{
49
- char * s = NULL ,
50
- * s2 ;
51
- Plan * plan ;
52
- ExplainState * es ;
53
- int len ;
52
+ List * rewritten ;
53
+ List * l ;
54
54
55
55
if (IsAbortedTransactionBlockState ())
56
56
{
@@ -64,6 +64,35 @@ ExplainQuery(Query *query, bool verbose, CommandDest dest)
64
64
return ;
65
65
}
66
66
67
+ /* Rewrite through rule system */
68
+ rewritten = QueryRewrite (query );
69
+
70
+ /* In the case of an INSTEAD NOTHING, tell at least that */
71
+ if (rewritten == NIL )
72
+ {
73
+ elog (NOTICE , "query rewrites to nothing" );
74
+ return ;
75
+ }
76
+
77
+ /* Explain every plan */
78
+ foreach (l , rewritten )
79
+ ExplainOneQuery (lfirst (l ), verbose , dest );
80
+ }
81
+
82
+ /*
83
+ * ExplainOneQuery -
84
+ * print out the execution plan for one query
85
+ *
86
+ */
87
+ static void
88
+ ExplainOneQuery (Query * query , bool verbose , CommandDest dest )
89
+ {
90
+ char * s = NULL ,
91
+ * s2 ;
92
+ Plan * plan ;
93
+ ExplainState * es ;
94
+ int len ;
95
+
67
96
/* plan the queries (XXX we've ignored rewrite!!) */
68
97
plan = planner (query );
69
98
@@ -202,8 +231,13 @@ explain_outNode(StringInfo str, Plan *plan, int indent, ExplainState *es)
202
231
{
203
232
RangeTblEntry * rte = nth (((Scan * ) plan )-> scanrelid - 1 , es -> rtable );
204
233
205
- sprintf (buf , " on %s" , rte -> refname );
206
- appendStringInfo (str , buf );
234
+ appendStringInfo (str , " on " );
235
+ if (strcmp (rte -> refname , rte -> relname ) != 0 )
236
+ {
237
+ sprintf (buf , "%s " , rte -> relname );
238
+ appendStringInfo (str , buf );
239
+ }
240
+ appendStringInfo (str , rte -> refname );
207
241
}
208
242
break ;
209
243
default :
@@ -232,7 +266,7 @@ explain_outNode(StringInfo str, Plan *plan, int indent, ExplainState *es)
232
266
for (i = 0 ; i < indent ; i ++ )
233
267
appendStringInfo (str , " " );
234
268
appendStringInfo (str , " -> " );
235
- explain_outNode (str , ((SubPlan * ) lfirst (lst ))-> plan , indent + 4 , es );
269
+ explain_outNode (str , ((SubPlan * ) lfirst (lst ))-> plan , indent + 2 , es );
236
270
}
237
271
es -> rtable = saved_rtable ;
238
272
}
0 commit comments