Make EXPLAIN show the function call expression of a FunctionScan plan node,
but only in VERBOSE mode. Per discussion.
This commit is contained in:
parent
5c788e7cf5
commit
99ee43c57b
|
@ -7,7 +7,7 @@
|
||||||
* Portions Copyright (c) 1994-5, Regents of the University of California
|
* Portions Copyright (c) 1994-5, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.207 2010/07/13 20:57:19 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.208 2010/08/24 21:20:36 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -59,6 +59,9 @@ static void ExplainNode(PlanState *planstate, List *ancestors,
|
||||||
ExplainState *es);
|
ExplainState *es);
|
||||||
static void show_plan_tlist(PlanState *planstate, List *ancestors,
|
static void show_plan_tlist(PlanState *planstate, List *ancestors,
|
||||||
ExplainState *es);
|
ExplainState *es);
|
||||||
|
static void show_expression(Node *node, const char *qlabel,
|
||||||
|
PlanState *planstate, List *ancestors,
|
||||||
|
bool useprefix, ExplainState *es);
|
||||||
static void show_qual(List *qual, const char *qlabel,
|
static void show_qual(List *qual, const char *qlabel,
|
||||||
PlanState *planstate, List *ancestors,
|
PlanState *planstate, List *ancestors,
|
||||||
bool useprefix, ExplainState *es);
|
bool useprefix, ExplainState *es);
|
||||||
|
@ -1017,13 +1020,19 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
||||||
"Recheck Cond", planstate, ancestors, es);
|
"Recheck Cond", planstate, ancestors, es);
|
||||||
/* FALL THRU */
|
/* FALL THRU */
|
||||||
case T_SeqScan:
|
case T_SeqScan:
|
||||||
case T_FunctionScan:
|
|
||||||
case T_ValuesScan:
|
case T_ValuesScan:
|
||||||
case T_CteScan:
|
case T_CteScan:
|
||||||
case T_WorkTableScan:
|
case T_WorkTableScan:
|
||||||
case T_SubqueryScan:
|
case T_SubqueryScan:
|
||||||
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
|
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
|
||||||
break;
|
break;
|
||||||
|
case T_FunctionScan:
|
||||||
|
if (es->verbose)
|
||||||
|
show_expression(((FunctionScan *) plan)->funcexpr,
|
||||||
|
"Function Call", planstate, ancestors,
|
||||||
|
es->verbose, es);
|
||||||
|
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
|
||||||
|
break;
|
||||||
case T_TidScan:
|
case T_TidScan:
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -1282,24 +1291,16 @@ show_plan_tlist(PlanState *planstate, List *ancestors, ExplainState *es)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Show a qualifier expression
|
* Show a generic expression
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
show_qual(List *qual, const char *qlabel,
|
show_expression(Node *node, const char *qlabel,
|
||||||
PlanState *planstate, List *ancestors,
|
PlanState *planstate, List *ancestors,
|
||||||
bool useprefix, ExplainState *es)
|
bool useprefix, ExplainState *es)
|
||||||
{
|
{
|
||||||
List *context;
|
List *context;
|
||||||
Node *node;
|
|
||||||
char *exprstr;
|
char *exprstr;
|
||||||
|
|
||||||
/* No work if empty qual */
|
|
||||||
if (qual == NIL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Convert AND list to explicit AND */
|
|
||||||
node = (Node *) make_ands_explicit(qual);
|
|
||||||
|
|
||||||
/* Set up deparsing context */
|
/* Set up deparsing context */
|
||||||
context = deparse_context_for_planstate((Node *) planstate,
|
context = deparse_context_for_planstate((Node *) planstate,
|
||||||
ancestors,
|
ancestors,
|
||||||
|
@ -1312,6 +1313,27 @@ show_qual(List *qual, const char *qlabel,
|
||||||
ExplainPropertyText(qlabel, exprstr, es);
|
ExplainPropertyText(qlabel, exprstr, es);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Show a qualifier expression (which is a List with implicit AND semantics)
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
show_qual(List *qual, const char *qlabel,
|
||||||
|
PlanState *planstate, List *ancestors,
|
||||||
|
bool useprefix, ExplainState *es)
|
||||||
|
{
|
||||||
|
Node *node;
|
||||||
|
|
||||||
|
/* No work if empty qual */
|
||||||
|
if (qual == NIL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Convert AND list to explicit AND */
|
||||||
|
node = (Node *) make_ands_explicit(qual);
|
||||||
|
|
||||||
|
/* And show it */
|
||||||
|
show_expression(node, qlabel, planstate, ancestors, useprefix, es);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Show a qualifier expression for a scan plan node
|
* Show a qualifier expression for a scan plan node
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue