diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 53aeb12f9a..2016c5a8b0 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -17835,6 +17835,24 @@ FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); identifier present in the identity is quoted if necessary. + + address_names + text[] + + An array that, together with object_type and + address_args, + can be used by the pg_get_object_address() to + recreate the object address in a remote server containing an + identically named object of the same kind. + + + + address_args + text[] + + Complement for address_names above. + + diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 34dd3c01ad..7563ae5150 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -117,6 +117,8 @@ typedef struct SQLDropObject const char *objname; const char *objidentity; const char *objecttype; + List *addrnames; + List *addrargs; bool original; bool normal; slist_node next; @@ -1324,10 +1326,11 @@ EventTriggerSQLDropAddObject(const ObjectAddress *object, bool original, bool no heap_close(catalog, AccessShareLock); } - /* object identity */ - obj->objidentity = getObjectIdentity(&obj->address); + /* object identity, objname and objargs */ + obj->objidentity = + getObjectIdentityParts(&obj->address, &obj->addrnames, &obj->addrargs); - /* and object type, too */ + /* object type */ obj->objecttype = getObjectTypeDescription(&obj->address); slist_push_head(&(currentEventTriggerState->SQLDropList), &obj->next); @@ -1390,8 +1393,8 @@ pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS) { SQLDropObject *obj; int i = 0; - Datum values[9]; - bool nulls[9]; + Datum values[11]; + bool nulls[11]; obj = slist_container(SQLDropObject, next, iter.cur); @@ -1434,6 +1437,22 @@ pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS) else nulls[i++] = true; + /* address_names and address_args */ + if (obj->addrnames) + { + values[i++] = PointerGetDatum(strlist_to_textarray(obj->addrnames)); + + if (obj->addrargs) + values[i++] = PointerGetDatum(strlist_to_textarray(obj->addrargs)); + else + values[i++] = PointerGetDatum(construct_empty_array(TEXTOID)); + } + else + { + nulls[i++] = true; + nulls[i++] = true; + } + tuplestore_putvalues(tupstore, tupdesc, values, nulls); } diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 5c10d96ce2..54d1f2ec97 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -5081,7 +5081,8 @@ DATA(insert OID = 3785 ( pg_logical_slot_peek_binary_changes PGNSP PGUID 12 100 DESCR("peek at binary changes from replication slot"); /* event triggers */ -DATA(insert OID = 3566 ( pg_event_trigger_dropped_objects PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{26,26,23,16,16,25,25,25,25}" "{o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, original, normal, object_type, schema_name, object_name, object_identity}" _null_ pg_event_trigger_dropped_objects _null_ _null_ _null_ )); +DATA(insert OID = 3566 ( pg_event_trigger_dropped_objects PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{26,26,23,16,16,25,25,25,25,1009,1009}" "{o,o,o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, original, normal, object_type, schema_name, object_name, object_identity, address_names, address_args}" _null_ pg_event_trigger_dropped_objects _null_ _null_ _null_ )); + DESCR("list objects dropped by the current command"); DATA(insert OID = 4566 ( pg_event_trigger_table_rewrite_oid PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 26 "" "{26}" "{o}" "{oid}" _null_ pg_event_trigger_table_rewrite_oid _null_ _null_ _null_ )); DESCR("return Oid of the table getting rewritten"); diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out index 72e1660d6b..869d713f5b 100644 --- a/src/test/regress/expected/event_trigger.out +++ b/src/test/regress/expected/event_trigger.out @@ -305,8 +305,9 @@ BEGIN IF NOT r.normal AND NOT r.original THEN CONTINUE; END IF; - RAISE NOTICE 'NORMAL: orig=% normal=% type=% identity=%', - r.original, r.normal, r.object_type, r.object_identity; + RAISE NOTICE 'NORMAL: orig=% normal=% type=% identity=% name=% args=%', + r.original, r.normal, r.object_type, r.object_identity, + r.address_names, r.address_args; END LOOP; END; $$; CREATE EVENT TRIGGER regress_event_trigger_report_dropped ON sql_drop @@ -316,23 +317,23 @@ CREATE SCHEMA evttrig CREATE INDEX one_idx ON one (col_b) CREATE TABLE two (col_c INTEGER CHECK (col_c > 0) REFERENCES one DEFAULT 42); ALTER TABLE evttrig.two DROP COLUMN col_c; -NOTICE: NORMAL: orig=t normal=f type=table column identity=evttrig.two.col_c -NOTICE: NORMAL: orig=f normal=t type=table constraint identity=two_col_c_check on evttrig.two +NOTICE: NORMAL: orig=t normal=f type=table column identity=evttrig.two.col_c name={evttrig,two,col_c} args={} +NOTICE: NORMAL: orig=f normal=t type=table constraint identity=two_col_c_check on evttrig.two name={evttrig,two,two_col_c_check} args={} ALTER TABLE evttrig.one ALTER COLUMN col_b DROP DEFAULT; -NOTICE: NORMAL: orig=t normal=f type=default value identity=for evttrig.one.col_b +NOTICE: NORMAL: orig=t normal=f type=default value identity=for evttrig.one.col_b name={evttrig,one,col_b} args={} ALTER TABLE evttrig.one DROP CONSTRAINT one_pkey; -NOTICE: NORMAL: orig=t normal=f type=table constraint identity=one_pkey on evttrig.one +NOTICE: NORMAL: orig=t normal=f type=table constraint identity=one_pkey on evttrig.one name={evttrig,one,one_pkey} args={} DROP INDEX evttrig.one_idx; -NOTICE: NORMAL: orig=t normal=f type=index identity=evttrig.one_idx +NOTICE: NORMAL: orig=t normal=f type=index identity=evttrig.one_idx name={evttrig,one_idx} args={} DROP SCHEMA evttrig CASCADE; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to table evttrig.one drop cascades to table evttrig.two -NOTICE: NORMAL: orig=t normal=f type=schema identity=evttrig -NOTICE: NORMAL: orig=f normal=t type=table identity=evttrig.one -NOTICE: NORMAL: orig=f normal=t type=sequence identity=evttrig.one_col_a_seq -NOTICE: NORMAL: orig=f normal=t type=default value identity=for evttrig.one.col_a -NOTICE: NORMAL: orig=f normal=t type=table identity=evttrig.two +NOTICE: NORMAL: orig=t normal=f type=schema identity=evttrig name={evttrig} args={} +NOTICE: NORMAL: orig=f normal=t type=table identity=evttrig.one name={evttrig,one} args={} +NOTICE: NORMAL: orig=f normal=t type=sequence identity=evttrig.one_col_a_seq name={evttrig,one_col_a_seq} args={} +NOTICE: NORMAL: orig=f normal=t type=default value identity=for evttrig.one.col_a name={evttrig,one,col_a} args={} +NOTICE: NORMAL: orig=f normal=t type=table identity=evttrig.two name={evttrig,two} args={} DROP EVENT TRIGGER regress_event_trigger_report_dropped; -- only allowed from within an event trigger function, should fail select pg_event_trigger_table_rewrite_oid(); diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql index 7987fde50b..b2c89315fc 100644 --- a/src/test/regress/sql/event_trigger.sql +++ b/src/test/regress/sql/event_trigger.sql @@ -218,8 +218,9 @@ BEGIN IF NOT r.normal AND NOT r.original THEN CONTINUE; END IF; - RAISE NOTICE 'NORMAL: orig=% normal=% type=% identity=%', - r.original, r.normal, r.object_type, r.object_identity; + RAISE NOTICE 'NORMAL: orig=% normal=% type=% identity=% name=% args=%', + r.original, r.normal, r.object_type, r.object_identity, + r.address_names, r.address_args; END LOOP; END; $$; CREATE EVENT TRIGGER regress_event_trigger_report_dropped ON sql_drop