diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 53aeb12f9a5..2016c5a8b06 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 34dd3c01ad1..7563ae51503 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 5c10d96ce29..54d1f2ec978 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 72e1660d6b9..869d713f5b7 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 7987fde50b9..b2c89315fcd 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