diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-11-04 22:26:08 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-11-04 22:26:08 +0000 |
commit | 9bedd128d6ed83798004b3c7ddc33f33703ccf23 (patch) | |
tree | 95a475a5da180f19c69b5bcf2f6e764b1bc69ea7 /src/backend/commands/explain.c | |
parent | 48912acc089a6148529f12ab0a75b1bf026f231d (diff) | |
download | postgresql-9bedd128d6ed83798004b3c7ddc33f33703ccf23.tar.gz postgresql-9bedd128d6ed83798004b3c7ddc33f33703ccf23.zip |
Add support for invoking parser callback hooks via SPI and in cached plans.
As proof of concept, modify plpgsql to use the hooks. plpgsql is still
inserting $n symbols textually, but the "back end" of the parsing process now
goes through the ParamRef hook instead of using a fixed parameter-type array,
and then execution only fetches actually-referenced parameters, using a hook
added to ParamListInfo.
Although there's a lot left to be done in plpgsql, this already cures the
"if (TG_OP = 'INSERT' and NEW.foo ...)" problem, as illustrated by the
changed regression test.
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r-- | src/backend/commands/explain.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 1260ca00c23..21fa3add4f6 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.192 2009/10/12 18:10:41 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/explain.c,v 1.193 2009/11/04 22:26:04 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -107,8 +107,6 @@ ExplainQuery(ExplainStmt *stmt, const char *queryString, ParamListInfo params, DestReceiver *dest) { ExplainState es; - Oid *param_types; - int num_params; TupOutputState *tstate; List *rewritten; ListCell *lc; @@ -150,9 +148,6 @@ ExplainQuery(ExplainStmt *stmt, const char *queryString, opt->defname))); } - /* Convert parameter type data to the form parser wants */ - getParamListTypes(params, ¶m_types, &num_params); - /* * Run parse analysis and rewrite. Note this also acquires sufficient * locks on the source table(s). @@ -163,8 +158,10 @@ ExplainQuery(ExplainStmt *stmt, const char *queryString, * executed repeatedly. (See also the same hack in DECLARE CURSOR and * PREPARE.) XXX FIXME someday. */ - rewritten = pg_analyze_and_rewrite((Node *) copyObject(stmt->query), - queryString, param_types, num_params); + rewritten = pg_analyze_and_rewrite_params((Node *) copyObject(stmt->query), + queryString, + (ParserSetupHook) setupParserWithParamList, + params); /* emit opening boilerplate */ ExplainBeginOutput(&es); |