diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-12-15 20:04:49 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-12-15 20:04:49 +0000 |
commit | a5495cd8411b65de86a0ad5bf4e29a8e985eb677 (patch) | |
tree | 428c2686c4a32c3a30467bf5a5e738e4549c6058 /src/backend/tcop | |
parent | 34d26872ed816b299eef2fa4240d55316697f42d (diff) | |
download | postgresql-a5495cd8411b65de86a0ad5bf4e29a8e985eb677.tar.gz postgresql-a5495cd8411b65de86a0ad5bf4e29a8e985eb677.zip |
Add a hook to let loadable modules get control at ProcessUtility execution,
and use it to extend contrib/pg_stat_statements to track utility commands.
Itagaki Takahiro, reviewed by Euler Taveira de Oliveira.
Diffstat (limited to 'src/backend/tcop')
-rw-r--r-- | src/backend/tcop/utility.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 2fd4b9923f5..10fb728fc79 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.323 2009/12/11 03:34:55 itagaki Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.324 2009/12/15 20:04:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -58,6 +58,10 @@ #include "utils/syscache.h" +/* Hook for plugins to get control in ProcessUtility() */ +ProcessUtility_hook_type ProcessUtility_hook = NULL; + + /* * Verify user has ownership of specified relation, else ereport. * @@ -274,6 +278,27 @@ ProcessUtility(Node *parsetree, { Assert(queryString != NULL); /* required as of 8.4 */ + /* + * We provide a function hook variable that lets loadable plugins + * get control when ProcessUtility is called. Such a plugin would + * normally call standard_ProcessUtility(). + */ + if (ProcessUtility_hook) + (*ProcessUtility_hook) (parsetree, queryString, params, + isTopLevel, dest, completionTag); + else + standard_ProcessUtility(parsetree, queryString, params, + isTopLevel, dest, completionTag); +} + +void +standard_ProcessUtility(Node *parsetree, + const char *queryString, + ParamListInfo params, + bool isTopLevel, + DestReceiver *dest, + char *completionTag) +{ check_xact_readonly(parsetree); if (completionTag) |