aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2009-12-01 01:08:46 +0000
committerBruce Momjian <bruce@momjian.us>2009-12-01 01:08:46 +0000
commitd85cb27293a2bafb2f6f8c5d965cc8af33c4bf48 (patch)
tree343d9cc178498237682fb233d14265d535f00c14 /src
parent29fd97d98283be781ceaf6cbf29db6768ef09a37 (diff)
downloadpostgresql-d85cb27293a2bafb2f6f8c5d965cc8af33c4bf48.tar.gz
postgresql-d85cb27293a2bafb2f6f8c5d965cc8af33c4bf48.zip
ProcessUtility_hook:
Add ProcessUtility_hook() to handle all DDL to contrib/pg_stat_statements. Itagaki Takahiro
Diffstat (limited to 'src')
-rw-r--r--src/backend/tcop/utility.c23
-rw-r--r--src/include/tcop/utility.h11
2 files changed, 32 insertions, 2 deletions
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 42071bfb6c1..67333b1796a 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.318 2009/11/20 20:38:11 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.319 2009/12/01 01:08:46 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -58,6 +58,9 @@
#include "utils/syscache.h"
+/* Hooks for plugins to get control in ProcessUtility() */
+ProcessUtility_hook_type ProcessUtility_hook = NULL;
+
/*
* Verify user has ownership of specified relation, else ereport.
*
@@ -244,6 +247,10 @@ check_xact_readonly(Node *parsetree)
* completionTag is only set nonempty if we want to return a nondefault status.
*
* completionTag may be NULL if caller doesn't want a status string.
+ *
+ * We provide a function hook variable that lets loadable plugins
+ * get control when ProcessUtility is called. Such a plugin would
+ * normally call standard_ProcessUtility().
*/
void
ProcessUtility(Node *parsetree,
@@ -260,6 +267,20 @@ ProcessUtility(Node *parsetree,
if (completionTag)
completionTag[0] = '\0';
+ 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)
+{
switch (nodeTag(parsetree))
{
/*
diff --git a/src/include/tcop/utility.h b/src/include/tcop/utility.h
index d609b0ac4e9..ce3ee1fb055 100644
--- a/src/include/tcop/utility.h
+++ b/src/include/tcop/utility.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/tcop/utility.h,v 1.35 2009/01/01 17:24:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/tcop/utility.h,v 1.36 2009/12/01 01:08:46 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -17,9 +17,18 @@
#include "tcop/tcopprot.h"
+/* Hook for plugins to get control in ProcessUtility() */
+typedef void (*ProcessUtility_hook_type) (Node *parsetree,
+ const char *queryString, ParamListInfo params, bool isTopLevel,
+ DestReceiver *dest, char *completionTag);
+extern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;
+
extern void ProcessUtility(Node *parsetree, const char *queryString,
ParamListInfo params, bool isTopLevel,
DestReceiver *dest, char *completionTag);
+extern void standard_ProcessUtility(Node *parsetree, const char *queryString,
+ ParamListInfo params, bool isTopLevel,
+ DestReceiver *dest, char *completionTag);
extern bool UtilityReturnsTuples(Node *parsetree);