77 * Portions Copyright (c) 1994-5, Regents of the University of California
88 *
99 * IDENTIFICATION
10- * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.207 2010/07/13 20:57:19 tgl Exp $
10+ * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.208 2010/08/24 21: 20:36 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -59,6 +59,9 @@ static void ExplainNode(PlanState *planstate, List *ancestors,
5959ExplainState * es );
6060static void show_plan_tlist (PlanState * planstate ,List * ancestors ,
6161ExplainState * es );
62+ static void show_expression (Node * node ,const char * qlabel ,
63+ PlanState * planstate ,List * ancestors ,
64+ bool useprefix ,ExplainState * es );
6265static void show_qual (List * qual ,const char * qlabel ,
6366PlanState * planstate ,List * ancestors ,
6467bool useprefix ,ExplainState * es );
@@ -1017,13 +1020,19 @@ ExplainNode(PlanState *planstate, List *ancestors,
10171020"Recheck Cond" ,planstate ,ancestors ,es );
10181021/* FALL THRU */
10191022case T_SeqScan :
1020- case T_FunctionScan :
10211023case T_ValuesScan :
10221024case T_CteScan :
10231025case T_WorkTableScan :
10241026case T_SubqueryScan :
10251027show_scan_qual (plan -> qual ,"Filter" ,planstate ,ancestors ,es );
10261028break ;
1029+ case T_FunctionScan :
1030+ if (es -> verbose )
1031+ show_expression (((FunctionScan * )plan )-> funcexpr ,
1032+ "Function Call" ,planstate ,ancestors ,
1033+ es -> verbose ,es );
1034+ show_scan_qual (plan -> qual ,"Filter" ,planstate ,ancestors ,es );
1035+ break ;
10271036case T_TidScan :
10281037{
10291038/*
@@ -1282,24 +1291,16 @@ show_plan_tlist(PlanState *planstate, List *ancestors, ExplainState *es)
12821291}
12831292
12841293/*
1285- * Show aqualifier expression
1294+ * Show ageneric expression
12861295 */
12871296static void
1288- show_qual ( List * qual ,const char * qlabel ,
1289- PlanState * planstate ,List * ancestors ,
1290- bool useprefix ,ExplainState * es )
1297+ show_expression ( Node * node ,const char * qlabel ,
1298+ PlanState * planstate ,List * ancestors ,
1299+ bool useprefix ,ExplainState * es )
12911300{
12921301List * context ;
1293- Node * node ;
12941302char * exprstr ;
12951303
1296- /* No work if empty qual */
1297- if (qual == NIL )
1298- return ;
1299-
1300- /* Convert AND list to explicit AND */
1301- node = (Node * )make_ands_explicit (qual );
1302-
13031304/* Set up deparsing context */
13041305context = deparse_context_for_planstate ((Node * )planstate ,
13051306ancestors ,
@@ -1312,6 +1313,27 @@ show_qual(List *qual, const char *qlabel,
13121313ExplainPropertyText (qlabel ,exprstr ,es );
13131314}
13141315
1316+ /*
1317+ * Show a qualifier expression (which is a List with implicit AND semantics)
1318+ */
1319+ static void
1320+ show_qual (List * qual ,const char * qlabel ,
1321+ PlanState * planstate ,List * ancestors ,
1322+ bool useprefix ,ExplainState * es )
1323+ {
1324+ Node * node ;
1325+
1326+ /* No work if empty qual */
1327+ if (qual == NIL )
1328+ return ;
1329+
1330+ /* Convert AND list to explicit AND */
1331+ node = (Node * )make_ands_explicit (qual );
1332+
1333+ /* And show it */
1334+ show_expression (node ,qlabel ,planstate ,ancestors ,useprefix ,es );
1335+ }
1336+
13151337/*
13161338 * Show a qualifier expression for a scan plan node
13171339 */