aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tcop
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2009-12-15 20:04:49 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2009-12-15 20:04:49 +0000
commita5495cd8411b65de86a0ad5bf4e29a8e985eb677 (patch)
tree428c2686c4a32c3a30467bf5a5e738e4549c6058 /src/backend/tcop
parent34d26872ed816b299eef2fa4240d55316697f42d (diff)
downloadpostgresql-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.c27
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)