aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2021-04-28 11:17:58 +0900
committerMichael Paquier <michael@paquier.xyz>2021-04-28 11:17:58 +0900
commitf7aab36d61fd2fdbd949d5880247e8cae9ee4be0 (patch)
tree92ecdf31e0a1517948cb4b09c078d7f1de4a561d
parentfa26eba221a9e837493df47d0255ce615129e9a8 (diff)
downloadpostgresql-f7aab36d61fd2fdbd949d5880247e8cae9ee4be0.tar.gz
postgresql-f7aab36d61fd2fdbd949d5880247e8cae9ee4be0.zip
Fix pg_identify_object_as_address() with event triggers
Attempting to use this function with event triggers failed, as, since its introduction in a676201, this code has never associated an object name with event triggers. This addresses the failure by adding the event trigger name to the set defining its object address. Note that regression tests are added within event_trigger and not object_address to avoid issues with concurrent connections in parallel schedules. Author: Joel Jacobson Discussion: https://postgr.es/m/3c905e77-a026-46ae-8835-c3f6cd1d24c8@www.fastmail.com Backpatch-through: 9.6
-rw-r--r--src/backend/catalog/objectaddress.c11
-rw-r--r--src/test/regress/expected/event_trigger.out17
-rw-r--r--src/test/regress/sql/event_trigger.sql11
3 files changed, 33 insertions, 6 deletions
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 6d88b690d87..ad9740098e4 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -5607,10 +5607,7 @@ getObjectIdentityParts(const ObjectAddress *object,
{
HeapTuple tup;
Form_pg_event_trigger trigForm;
-
- /* no objname support here */
- if (objname)
- *objname = NIL;
+ char *evtname;
tup = SearchSysCache1(EVENTTRIGGEROID,
ObjectIdGetDatum(object->objectId));
@@ -5622,8 +5619,10 @@ getObjectIdentityParts(const ObjectAddress *object,
break;
}
trigForm = (Form_pg_event_trigger) GETSTRUCT(tup);
- appendStringInfoString(&buffer,
- quote_identifier(NameStr(trigForm->evtname)));
+ evtname = NameStr(trigForm->evtname);
+ appendStringInfoString(&buffer, quote_identifier(evtname));
+ if (objname)
+ *objname = list_make1(evtname);
ReleaseSysCache(tup);
break;
}
diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out
index bdd0ffcdaf3..369f3d7d84f 100644
--- a/src/test/regress/expected/event_trigger.out
+++ b/src/test/regress/expected/event_trigger.out
@@ -533,6 +533,23 @@ DROP POLICY p2 ON event_trigger_test;
NOTICE: DROP POLICY - ddl_command_start
NOTICE: DROP POLICY - sql_drop
NOTICE: DROP POLICY - ddl_command_end
+-- Check the object addresses of all the event triggers.
+SELECT
+ e.evtname,
+ pg_describe_object('pg_event_trigger'::regclass, e.oid, 0) as descr,
+ b.type, b.object_names, b.object_args,
+ pg_identify_object(a.classid, a.objid, a.objsubid) as ident
+ FROM pg_event_trigger as e,
+ LATERAL pg_identify_object_as_address('pg_event_trigger'::regclass, e.oid, 0) as b,
+ LATERAL pg_get_object_address(b.type, b.object_names, b.object_args) as a
+ ORDER BY e.evtname;
+ evtname | descr | type | object_names | object_args | ident
+-------------------+---------------------------------+---------------+---------------------+-------------+--------------------------------------------------------
+ end_rls_command | event trigger end_rls_command | event trigger | {end_rls_command} | {} | ("event trigger",,end_rls_command,end_rls_command)
+ sql_drop_command | event trigger sql_drop_command | event trigger | {sql_drop_command} | {} | ("event trigger",,sql_drop_command,sql_drop_command)
+ start_rls_command | event trigger start_rls_command | event trigger | {start_rls_command} | {} | ("event trigger",,start_rls_command,start_rls_command)
+(3 rows)
+
DROP EVENT TRIGGER start_rls_command;
DROP EVENT TRIGGER end_rls_command;
DROP EVENT TRIGGER sql_drop_command;
diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql
index 18b2a267cbe..e79c5f0b5dc 100644
--- a/src/test/regress/sql/event_trigger.sql
+++ b/src/test/regress/sql/event_trigger.sql
@@ -426,6 +426,17 @@ ALTER POLICY p1 ON event_trigger_test USING (TRUE);
ALTER POLICY p1 ON event_trigger_test RENAME TO p2;
DROP POLICY p2 ON event_trigger_test;
+-- Check the object addresses of all the event triggers.
+SELECT
+ e.evtname,
+ pg_describe_object('pg_event_trigger'::regclass, e.oid, 0) as descr,
+ b.type, b.object_names, b.object_args,
+ pg_identify_object(a.classid, a.objid, a.objsubid) as ident
+ FROM pg_event_trigger as e,
+ LATERAL pg_identify_object_as_address('pg_event_trigger'::regclass, e.oid, 0) as b,
+ LATERAL pg_get_object_address(b.type, b.object_names, b.object_args) as a
+ ORDER BY e.evtname;
+
DROP EVENT TRIGGER start_rls_command;
DROP EVENT TRIGGER end_rls_command;
DROP EVENT TRIGGER sql_drop_command;