event_triggers_v1.3--v.1.4.patch
text/x-patch
Filename: event_triggers_v1.3--v.1.4.patch
Type: text/x-patch
Part: 0
Message:
Re: Event Triggers reduced, v1
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v1
| File | + | − |
|---|---|---|
| src/backend/catalog/Makefile | 2 | 1 |
| src/backend/catalog/pg_event_trigger.c | 200 | 0 |
| src/backend/commands/event_trigger.c | 6 | 2 |
| src/backend/parser/gram.y | 6 | 170 |
| src/backend/utils/cache/evtcache.c | 9 | 6 |
| src/include/catalog/pg_event_trigger_fn.h | 21 | 0 |
| src/include/catalog/pg_event_trigger.h | 1 | 1 |
commit a8cf89116ae7b6e51c8a580510612b85caae2d38
Author: Dimitri Fontaine <dim@tapoueh.org>
Date: Wed Jul 4 16:51:36 2012 +0200
Store text in the event triggers catalogs rather than the enum/int constants
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index df6da1f..6e29758 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -12,7 +12,8 @@ include $(top_builddir)/src/Makefile.global
OBJS = catalog.o dependency.o heap.o index.o indexing.o namespace.o aclchk.o \
objectaddress.o pg_aggregate.o pg_collation.o pg_constraint.o pg_conversion.o \
- pg_depend.o pg_enum.o pg_inherits.o pg_largeobject.o pg_namespace.o \
+ pg_depend.o pg_enum.o pg_event_trigger.o pg_inherits.o pg_largeobject.o \
+ pg_namespace.o \
pg_operator.o pg_proc.o pg_range.o pg_db_role_setting.o pg_shdepend.o \
pg_type.o storage.o toasting.o
diff --git a/src/backend/catalog/pg_event_trigger.c b/src/backend/catalog/pg_event_trigger.c
new file mode 100644
index 0000000..7d52a84
--- /dev/null
+++ b/src/backend/catalog/pg_event_trigger.c
@@ -0,0 +1,200 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_event_trigger.c
+ * routines to support manipulation of the pg_event_trigger relation
+ *
+ * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/catalog/pg_event_trigger.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "catalog/pg_event_trigger.h"
+#include "catalog/pg_event_trigger_fn.h"
+#include "utils/builtins.h"
+
+TrigEventCommand
+parse_event_tag(char *command, bool noerror)
+{
+ if (pg_strcasecmp(command, "ALTER AGGREGATE") == 0)
+ return E_AlterAggregate;
+ else if (pg_strcasecmp(command, "ALTER COLLATION") == 0)
+ return E_AlterCollation;
+ else if (pg_strcasecmp(command, "ALTER CONVERSION") == 0)
+ return E_AlterConversion;
+ else if (pg_strcasecmp(command, "ALTER DOMAIN") == 0)
+ return E_AlterDomain;
+ else if (pg_strcasecmp(command, "ALTER EXTENSION") == 0)
+ return E_AlterExtension;
+ else if (pg_strcasecmp(command, "ALTER FOREIGN DATA WRAPPER") == 0)
+ return E_AlterForeignDataWrapper;
+ else if (pg_strcasecmp(command, "ALTER FOREIGN TABLE") == 0)
+ return E_AlterForeignTable;
+ else if (pg_strcasecmp(command, "ALTER FUNCTION") == 0)
+ return E_AlterFunction;
+ else if (pg_strcasecmp(command, "ALTER LANGUAGE") == 0)
+ return E_AlterLanguage;
+ else if (pg_strcasecmp(command, "ALTER OPERATOR") == 0)
+ return E_AlterOperator;
+ else if (pg_strcasecmp(command, "ALTER OPERATOR CLASS") == 0)
+ return E_AlterOperatorClass;
+ else if (pg_strcasecmp(command, "ALTER OPERATOR FAMILY") == 0)
+ return E_AlterOperatorFamily;
+ else if (pg_strcasecmp(command, "ALTER SEQUENCE") == 0)
+ return E_AlterSequence;
+ else if (pg_strcasecmp(command, "ALTER SERVER") == 0)
+ return E_AlterServer;
+ else if (pg_strcasecmp(command, "ALTER SCHEMA") == 0)
+ return E_AlterSchema;
+ else if (pg_strcasecmp(command, "ALTER TABLE") == 0)
+ return E_AlterTable;
+ else if (pg_strcasecmp(command, "ALTER TEXT SEARCH CONFIGURATION") == 0)
+ return E_AlterTextSearchConfiguration;
+ else if (pg_strcasecmp(command, "ALTER TEXT SEARCH DICTIONARY") == 0)
+ return E_AlterTextSearchDictionary;
+ else if (pg_strcasecmp(command, "ALTER TEXT SEARCH PARSER") == 0)
+ return E_AlterTextSearchParser;
+ else if (pg_strcasecmp(command, "ALTER TEXT SEARCH TEMPLATE") == 0)
+ return E_AlterTextSearchTemplate;
+ else if (pg_strcasecmp(command, "ALTER TRIGGER") == 0)
+ return E_AlterTrigger;
+ else if (pg_strcasecmp(command, "ALTER TYPE") == 0)
+ return E_AlterType;
+ else if (pg_strcasecmp(command, "ALTER USER MAPPING") == 0)
+ return E_AlterUserMapping;
+ else if (pg_strcasecmp(command, "ALTER VIEW") == 0)
+ return E_AlterView;
+ else if (pg_strcasecmp(command, "CLUSTER") == 0)
+ return E_Cluster;
+ else if (pg_strcasecmp(command, "CREATE AGGREGATE") == 0)
+ return E_CreateAggregate;
+ else if (pg_strcasecmp(command, "CREATE CAST") == 0)
+ return E_CreateCast;
+ else if (pg_strcasecmp(command, "CREATE COLLATION") == 0)
+ return E_CreateCollation;
+ else if (pg_strcasecmp(command, "CREATE CONVERSION") == 0)
+ return E_CreateConversion;
+ else if (pg_strcasecmp(command, "CREATE DOMAIN") == 0)
+ return E_CreateDomain;
+ else if (pg_strcasecmp(command, "CREATE EXTENSION") == 0)
+ return E_CreateExtension;
+ else if (pg_strcasecmp(command, "CREATE FOREIGN DATA WRAPPER") == 0)
+ return E_CreateForeignDataWrapper;
+ else if (pg_strcasecmp(command, "CREATE FOREIGN TABLE") == 0)
+ return E_CreateForeignTable;
+ else if (pg_strcasecmp(command, "CREATE FUNCTION") == 0)
+ return E_CreateFunction;
+ else if (pg_strcasecmp(command, "CREATE INDEX") == 0)
+ return E_CreateIndex;
+ else if (pg_strcasecmp(command, "CREATE LANGUAGE") == 0)
+ return E_CreateLanguage;
+ else if (pg_strcasecmp(command, "CREATE OPERATOR") == 0)
+ return E_CreateOperator;
+ else if (pg_strcasecmp(command, "CREATE OPERATOR CLASS") == 0)
+ return E_CreateOperatorClass;
+ else if (pg_strcasecmp(command, "CREATE OPERATOR FAMILY") == 0)
+ return E_CreateOperatorFamily;
+ else if (pg_strcasecmp(command, "CREATE RULE") == 0)
+ return E_CreateRule;
+ else if (pg_strcasecmp(command, "CREATE SEQUENCE") == 0)
+ return E_CreateSequence;
+ else if (pg_strcasecmp(command, "CREATE SERVER") == 0)
+ return E_CreateServer;
+ else if (pg_strcasecmp(command, "CREATE SCHEMA") == 0)
+ return E_CreateSchema;
+ else if (pg_strcasecmp(command, "CREATE TABLE") == 0)
+ return E_CreateTable;
+ else if (pg_strcasecmp(command, "CREATE TABLE AS") == 0)
+ return E_CreateTableAs;
+ else if (pg_strcasecmp(command, "CREATE TEXT SEARCH CONFIGURATION") == 0)
+ return E_CreateTextSearchConfiguration;
+ else if (pg_strcasecmp(command, "CREATE TEXT SEARCH DICTIONARY") == 0)
+ return E_CreateTextSearchDictionary;
+ else if (pg_strcasecmp(command, "CREATE TEXT SEARCH PARSER") == 0)
+ return E_CreateTextSearchParser;
+ else if (pg_strcasecmp(command, "CREATE TEXT SEARCH TEMPLATE") == 0)
+ return E_CreateTextSearchTemplate;
+ else if (pg_strcasecmp(command, "CREATE TRIGGER") == 0)
+ return E_CreateTrigger;
+ else if (pg_strcasecmp(command, "CREATE TYPE") == 0)
+ return E_CreateType;
+ else if (pg_strcasecmp(command, "CREATE USER MAPPING") == 0)
+ return E_CreateUserMapping;
+ else if (pg_strcasecmp(command, "CREATE VIEW") == 0)
+ return E_CreateView;
+ else if (pg_strcasecmp(command, "DROP AGGREGATE") == 0)
+ return E_DropAggregate;
+ else if (pg_strcasecmp(command, "DROP CAST") == 0)
+ return E_DropCast;
+ else if (pg_strcasecmp(command, "DROP COLLATION") == 0)
+ return E_DropCollation;
+ else if (pg_strcasecmp(command, "DROP CONVERSION") == 0)
+ return E_DropConversion;
+ else if (pg_strcasecmp(command, "DROP DOMAIN") == 0)
+ return E_DropDomain;
+ else if (pg_strcasecmp(command, "DROP EXTENSION") == 0)
+ return E_DropExtension;
+ else if (pg_strcasecmp(command, "DROP FOREIGN DATA WRAPPER") == 0)
+ return E_DropForeignDataWrapper;
+ else if (pg_strcasecmp(command, "DROP FOREIGN TABLE") == 0)
+ return E_DropForeignTable;
+ else if (pg_strcasecmp(command, "DROP FUNCTION") == 0)
+ return E_DropFunction;
+ else if (pg_strcasecmp(command, "DROP INDEX") == 0)
+ return E_DropIndex;
+ else if (pg_strcasecmp(command, "DROP LANGUAGE") == 0)
+ return E_DropLanguage;
+ else if (pg_strcasecmp(command, "DROP OPERATOR") == 0)
+ return E_DropOperator;
+ else if (pg_strcasecmp(command, "DROP OPERATOR CLASS") == 0)
+ return E_DropOperatorClass;
+ else if (pg_strcasecmp(command, "DROP OPERATOR FAMILY") == 0)
+ return E_DropOperatorFamily;
+ else if (pg_strcasecmp(command, "DROP RULE") == 0)
+ return E_DropRule;
+ else if (pg_strcasecmp(command, "DROP SCHEMA") == 0)
+ return E_DropSchema;
+ else if (pg_strcasecmp(command, "DROP SEQUENCE") == 0)
+ return E_DropSequence;
+ else if (pg_strcasecmp(command, "DROP SERVER") == 0)
+ return E_DropServer;
+ else if (pg_strcasecmp(command, "DROP TABLE") == 0)
+ return E_DropTable;
+ else if (pg_strcasecmp(command, "DROP TEXT SEARCH CONFIGURATION") == 0)
+ return E_DropTextSearchConfiguration;
+ else if (pg_strcasecmp(command, "DROP TEXT SEARCH DICTIONARY") == 0)
+ return E_DropTextSearchDictionary;
+ else if (pg_strcasecmp(command, "DROP TEXT SEARCH PARSER") == 0)
+ return E_DropTextSearchParser;
+ else if (pg_strcasecmp(command, "DROP TEXT SEARCH TEMPLATE") == 0)
+ return E_DropTextSearchTemplate;
+ else if (pg_strcasecmp(command, "DROP TRIGGER") == 0)
+ return E_DropTrigger;
+ else if (pg_strcasecmp(command, "DROP TYPE") == 0)
+ return E_DropType;
+ else if (pg_strcasecmp(command, "DROP USER MAPPING") == 0)
+ return E_DropUserMapping;
+ else if (pg_strcasecmp(command, "DROP VIEW") == 0)
+ return E_DropView;
+ else if (pg_strcasecmp(command, "LOAD") == 0)
+ return E_Load;
+ else if (pg_strcasecmp(command, "REINDEX") == 0)
+ return E_Reindex;
+ else if (pg_strcasecmp(command, "SELECT INTO") == 0)
+ return E_SelectInto;
+ else if (pg_strcasecmp(command, "VACUUM") == 0)
+ return E_Vacuum;
+ else
+ {
+ if (!noerror)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("unrecognized command \"%s\"", command)));
+ }
+ return E_UNKNOWN;
+}
diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c
index 13ffeb5..a93698b 100644
--- a/src/backend/commands/event_trigger.c
+++ b/src/backend/commands/event_trigger.c
@@ -103,9 +103,13 @@ InsertEventTriggerTuple(char *trigname, TrigEvent event,
foreach(lc, cmdlist)
{
- tags[i++] = Int16GetDatum(lfirst_int(lc));
+ TrigEventCommand cmd = lfirst_int(lc);
+ char *cmdstr = command_to_string(cmd);
+ if (cmd == E_UNKNOWN || cmdstr == NULL)
+ elog(ERROR, "Unknown command %d", cmd);
+ tags[i++] = PointerGetDatum(cstring_to_text(cmdstr));
}
- tagArray = construct_array(tags, l, INT2OID, 2, true, 's');
+ tagArray = construct_array(tags, l, TEXTOID, -1, false, 'i');
values[Anum_pg_event_trigger_evttags - 1] = PointerGetDatum(tagArray);
}
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index ca95d76..21d92ef 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -54,6 +54,7 @@
#include "catalog/index.h"
#include "catalog/namespace.h"
#include "catalog/pg_event_trigger.h"
+#include "catalog/pg_event_trigger_fn.h"
#include "catalog/pg_trigger.h"
#include "commands/defrem.h"
#include "commands/event_trigger.h"
@@ -4381,182 +4382,17 @@ trigger_command_list:
trigger_command:
SCONST
{
- if (pg_strcasecmp($1, "ALTER AGGREGATE") == 0)
- $$ = E_AlterAggregate;
- else if (pg_strcasecmp($1, "ALTER COLLATION") == 0)
- $$ = E_AlterCollation;
- else if (pg_strcasecmp($1, "ALTER CONVERSION") == 0)
- $$ = E_AlterConversion;
- else if (pg_strcasecmp($1, "ALTER DOMAIN") == 0)
- $$ = E_AlterDomain;
- else if (pg_strcasecmp($1, "ALTER EXTENSION") == 0)
- $$ = E_AlterExtension;
- else if (pg_strcasecmp($1, "ALTER FOREIGN DATA WRAPPER") == 0)
- $$ = E_AlterForeignDataWrapper;
- else if (pg_strcasecmp($1, "ALTER FOREIGN TABLE") == 0)
- $$ = E_AlterForeignTable;
- else if (pg_strcasecmp($1, "ALTER FUNCTION") == 0)
- $$ = E_AlterFunction;
- else if (pg_strcasecmp($1, "ALTER LANGUAGE") == 0)
- $$ = E_AlterLanguage;
- else if (pg_strcasecmp($1, "ALTER OPERATOR") == 0)
- $$ = E_AlterOperator;
- else if (pg_strcasecmp($1, "ALTER OPERATOR CLASS") == 0)
- $$ = E_AlterOperatorClass;
- else if (pg_strcasecmp($1, "ALTER OPERATOR FAMILY") == 0)
- $$ = E_AlterOperatorFamily;
- else if (pg_strcasecmp($1, "ALTER SEQUENCE") == 0)
- $$ = E_AlterSequence;
- else if (pg_strcasecmp($1, "ALTER SERVER") == 0)
- $$ = E_AlterServer;
- else if (pg_strcasecmp($1, "ALTER SCHEMA") == 0)
- $$ = E_AlterSchema;
- else if (pg_strcasecmp($1, "ALTER TABLE") == 0)
- $$ = E_AlterTable;
- else if (pg_strcasecmp($1, "ALTER TEXT SEARCH CONFIGURATION") == 0)
- $$ = E_AlterTextSearchConfiguration;
- else if (pg_strcasecmp($1, "ALTER TEXT SEARCH DICTIONARY") == 0)
- $$ = E_AlterTextSearchDictionary;
- else if (pg_strcasecmp($1, "ALTER TEXT SEARCH PARSER") == 0)
- $$ = E_AlterTextSearchParser;
- else if (pg_strcasecmp($1, "ALTER TEXT SEARCH TEMPLATE") == 0)
- $$ = E_AlterTextSearchTemplate;
- else if (pg_strcasecmp($1, "ALTER TRIGGER") == 0)
- $$ = E_AlterTrigger;
- else if (pg_strcasecmp($1, "ALTER TYPE") == 0)
- $$ = E_AlterType;
- else if (pg_strcasecmp($1, "ALTER USER MAPPING") == 0)
- $$ = E_AlterUserMapping;
- else if (pg_strcasecmp($1, "ALTER VIEW") == 0)
- $$ = E_AlterView;
- else if (pg_strcasecmp($1, "CLUSTER") == 0)
- $$ = E_Cluster;
- else if (pg_strcasecmp($1, "CREATE AGGREGATE") == 0)
- $$ = E_CreateAggregate;
- else if (pg_strcasecmp($1, "CREATE CAST") == 0)
- $$ = E_CreateCast;
- else if (pg_strcasecmp($1, "CREATE COLLATION") == 0)
- $$ = E_CreateCollation;
- else if (pg_strcasecmp($1, "CREATE CONVERSION") == 0)
- $$ = E_CreateConversion;
- else if (pg_strcasecmp($1, "CREATE DOMAIN") == 0)
- $$ = E_CreateDomain;
- else if (pg_strcasecmp($1, "CREATE EXTENSION") == 0)
- $$ = E_CreateExtension;
- else if (pg_strcasecmp($1, "CREATE FOREIGN DATA WRAPPER") == 0)
- $$ = E_CreateForeignDataWrapper;
- else if (pg_strcasecmp($1, "CREATE FOREIGN TABLE") == 0)
- $$ = E_CreateForeignTable;
- else if (pg_strcasecmp($1, "CREATE FUNCTION") == 0)
- $$ = E_CreateFunction;
- else if (pg_strcasecmp($1, "CREATE INDEX") == 0)
- $$ = E_CreateIndex;
- else if (pg_strcasecmp($1, "CREATE LANGUAGE") == 0)
- $$ = E_CreateLanguage;
- else if (pg_strcasecmp($1, "CREATE OPERATOR") == 0)
- $$ = E_CreateOperator;
- else if (pg_strcasecmp($1, "CREATE OPERATOR CLASS") == 0)
- $$ = E_CreateOperatorClass;
- else if (pg_strcasecmp($1, "CREATE OPERATOR FAMILY") == 0)
- $$ = E_CreateOperatorFamily;
- else if (pg_strcasecmp($1, "CREATE RULE") == 0)
- $$ = E_CreateRule;
- else if (pg_strcasecmp($1, "CREATE SEQUENCE") == 0)
- $$ = E_CreateSequence;
- else if (pg_strcasecmp($1, "CREATE SERVER") == 0)
- $$ = E_CreateServer;
- else if (pg_strcasecmp($1, "CREATE SCHEMA") == 0)
- $$ = E_CreateSchema;
- else if (pg_strcasecmp($1, "CREATE TABLE") == 0)
- $$ = E_CreateTable;
- else if (pg_strcasecmp($1, "CREATE TABLE AS") == 0)
- $$ = E_CreateTableAs;
- else if (pg_strcasecmp($1, "CREATE TEXT SEARCH CONFIGURATION") == 0)
- $$ = E_CreateTextSearchConfiguration;
- else if (pg_strcasecmp($1, "CREATE TEXT SEARCH DICTIONARY") == 0)
- $$ = E_CreateTextSearchDictionary;
- else if (pg_strcasecmp($1, "CREATE TEXT SEARCH PARSER") == 0)
- $$ = E_CreateTextSearchParser;
- else if (pg_strcasecmp($1, "CREATE TEXT SEARCH TEMPLATE") == 0)
- $$ = E_CreateTextSearchTemplate;
- else if (pg_strcasecmp($1, "CREATE TRIGGER") == 0)
- $$ = E_CreateTrigger;
- else if (pg_strcasecmp($1, "CREATE TYPE") == 0)
- $$ = E_CreateType;
- else if (pg_strcasecmp($1, "CREATE USER MAPPING") == 0)
- $$ = E_CreateUserMapping;
- else if (pg_strcasecmp($1, "CREATE VIEW") == 0)
- $$ = E_CreateView;
- else if (pg_strcasecmp($1, "DROP AGGREGATE") == 0)
- $$ = E_DropAggregate;
- else if (pg_strcasecmp($1, "DROP CAST") == 0)
- $$ = E_DropCast;
- else if (pg_strcasecmp($1, "DROP COLLATION") == 0)
- $$ = E_DropCollation;
- else if (pg_strcasecmp($1, "DROP CONVERSION") == 0)
- $$ = E_DropConversion;
- else if (pg_strcasecmp($1, "DROP DOMAIN") == 0)
- $$ = E_DropDomain;
- else if (pg_strcasecmp($1, "DROP EXTENSION") == 0)
- $$ = E_DropExtension;
- else if (pg_strcasecmp($1, "DROP FOREIGN DATA WRAPPER") == 0)
- $$ = E_DropForeignDataWrapper;
- else if (pg_strcasecmp($1, "DROP FOREIGN TABLE") == 0)
- $$ = E_DropForeignTable;
- else if (pg_strcasecmp($1, "DROP FUNCTION") == 0)
- $$ = E_DropFunction;
- else if (pg_strcasecmp($1, "DROP INDEX") == 0)
- $$ = E_DropIndex;
- else if (pg_strcasecmp($1, "DROP LANGUAGE") == 0)
- $$ = E_DropLanguage;
- else if (pg_strcasecmp($1, "DROP OPERATOR") == 0)
- $$ = E_DropOperator;
- else if (pg_strcasecmp($1, "DROP OPERATOR CLASS") == 0)
- $$ = E_DropOperatorClass;
- else if (pg_strcasecmp($1, "DROP OPERATOR FAMILY") == 0)
- $$ = E_DropOperatorFamily;
- else if (pg_strcasecmp($1, "DROP RULE") == 0)
- $$ = E_DropRule;
- else if (pg_strcasecmp($1, "DROP SCHEMA") == 0)
- $$ = E_DropSchema;
- else if (pg_strcasecmp($1, "DROP SEQUENCE") == 0)
- $$ = E_DropSequence;
- else if (pg_strcasecmp($1, "DROP SERVER") == 0)
- $$ = E_DropServer;
- else if (pg_strcasecmp($1, "DROP TABLE") == 0)
- $$ = E_DropTable;
- else if (pg_strcasecmp($1, "DROP TEXT SEARCH CONFIGURATION") == 0)
- $$ = E_DropTextSearchConfiguration;
- else if (pg_strcasecmp($1, "DROP TEXT SEARCH DICTIONARY") == 0)
- $$ = E_DropTextSearchDictionary;
- else if (pg_strcasecmp($1, "DROP TEXT SEARCH PARSER") == 0)
- $$ = E_DropTextSearchParser;
- else if (pg_strcasecmp($1, "DROP TEXT SEARCH TEMPLATE") == 0)
- $$ = E_DropTextSearchTemplate;
- else if (pg_strcasecmp($1, "DROP TRIGGER") == 0)
- $$ = E_DropTrigger;
- else if (pg_strcasecmp($1, "DROP TYPE") == 0)
- $$ = E_DropType;
- else if (pg_strcasecmp($1, "DROP USER MAPPING") == 0)
- $$ = E_DropUserMapping;
- else if (pg_strcasecmp($1, "DROP VIEW") == 0)
- $$ = E_DropView;
- else if (pg_strcasecmp($1, "LOAD") == 0)
- $$ = E_Load;
- else if (pg_strcasecmp($1, "REINDEX") == 0)
- $$ = E_Reindex;
- else if (pg_strcasecmp($1, "SELECT INTO") == 0)
- $$ = E_SelectInto;
- else if (pg_strcasecmp($1, "VACUUM") == 0)
- $$ = E_Vacuum;
- else
+ TrigEventCommand cmdtag = parse_event_tag($1, true);
+ if (cmdtag == E_UNKNOWN)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("unrecognized command \"%s\"", $1),
- parser_errposition(@1)));
+ parser_errposition(@1)));
+ $$ = cmdtag;
}
;
+
DropEventTrigStmt:
DROP EVENT TRIGGER name opt_drop_behavior
{
diff --git a/src/backend/utils/cache/evtcache.c b/src/backend/utils/cache/evtcache.c
index e08f045..660d1cf 100644
--- a/src/backend/utils/cache/evtcache.c
+++ b/src/backend/utils/cache/evtcache.c
@@ -23,6 +23,7 @@
#include "catalog/index.h"
#include "catalog/indexing.h"
#include "catalog/pg_event_trigger.h"
+#include "catalog/pg_event_trigger_fn.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_trigger.h"
#include "catalog/pg_type.h"
@@ -195,7 +196,7 @@ BuildEventTriggerCache()
else
{
ArrayType *arr;
- int16 *tags;
+ Datum *tags;
int i;
arr = DatumGetArrayTypeP(adatum); /* ensure not toasted */
@@ -204,15 +205,17 @@ BuildEventTriggerCache()
if (ARR_NDIM(arr) != 1 ||
numkeys < 0 ||
ARR_HASNULL(arr) ||
- ARR_ELEMTYPE(arr) != INT2OID)
- elog(ERROR, "evttags is not a 1-D smallint array");
+ ARR_ELEMTYPE(arr) != TEXTOID)
+ elog(ERROR, "evttags is not a 1-D text array");
- tags = (int16 *) ARR_DATA_PTR(arr);
+ deconstruct_array(arr, TEXTOID, -1, false, 'i',
+ &tags, NULL, &numkeys);
for (i = 0; i < numkeys; i++)
{
- command = tags[i];
- add_funcall_to_command_event(event, command, name, proc);
+ char *cmdstr = TextDatumGetCString(tags[i]);
+ command = parse_event_tag(cmdstr, false);
+ add_funcall_to_command_event(event, command, name, proc);
}
}
}
diff --git a/src/include/catalog/pg_event_trigger.h b/src/include/catalog/pg_event_trigger.h
index 9af38a1..6e270e3 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -36,7 +36,7 @@ CATALOG(pg_event_trigger,3466)
char evtenabled; /* trigger's firing configuration WRT
* session_replication_role */
#ifdef CATALOG_VARLEN
- int16 evttags[1]; /* command TAGs this event trigger targets */
+ text evttags[1]; /* command TAGs this event trigger targets */
#endif
} FormData_pg_event_trigger;
diff --git a/src/include/catalog/pg_event_trigger_fn.h b/src/include/catalog/pg_event_trigger_fn.h
new file mode 100644
index 0000000..d1e7502
--- /dev/null
+++ b/src/include/catalog/pg_event_trigger_fn.h
@@ -0,0 +1,21 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_event_trigger_fn.h
+ * prototypes for functions in catalog/pg_event_trigger.c
+ *
+ *
+ * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/catalog/pg_event_trigger_fn.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PG_EVENT_TRIGGER_FN_H
+#define PG_EVENT_TRIGGER_FN_H
+
+#include "catalog/pg_event_trigger.h"
+
+TrigEventCommand parse_event_tag(char *command, bool noerror);
+
+#endif /* PG_EVENT_TRIGGER_FN_H */