mirror of
https://github.com/postgres/postgres.git
synced 2025-06-25 01:02:05 +03:00
pg_event_trigger_dropped_objects: add behavior flags
Add "normal" and "original" flags as output columns to the pg_event_trigger_dropped_objects() function. With this it's possible to distinguish which objects, among those listed, need to be explicitely referenced when trying to replicate a deletion. This is necessary so that the list of objects can be pruned to the minimum necessary to replicate the DROP command in a remote server that might have slightly different schema (for instance, TOAST tables and constraints with different names and such.) Catalog version bumped due to change of function definition. Reviewed by: Abhijit Menon-Sen, Stephen Frost, Heikki Linnakangas, Robert Haas.
This commit is contained in:
@ -206,16 +206,25 @@ deleteObjectsInList(ObjectAddresses *targetObjects, Relation *depRel,
|
||||
/*
|
||||
* Keep track of objects for event triggers, if necessary.
|
||||
*/
|
||||
if (trackDroppedObjectsNeeded())
|
||||
if (trackDroppedObjectsNeeded() && !(flags & PERFORM_DELETION_INTERNAL))
|
||||
{
|
||||
for (i = 0; i < targetObjects->numrefs; i++)
|
||||
{
|
||||
ObjectAddress *thisobj = targetObjects->refs + i;
|
||||
const ObjectAddress *thisobj = &targetObjects->refs[i];
|
||||
const ObjectAddressExtra *extra = &targetObjects->extras[i];
|
||||
bool original = false;
|
||||
bool normal = false;
|
||||
|
||||
if ((!(flags & PERFORM_DELETION_INTERNAL)) &&
|
||||
EventTriggerSupportsObjectClass(getObjectClass(thisobj)))
|
||||
if (extra->flags & DEPFLAG_ORIGINAL)
|
||||
original = true;
|
||||
if (extra->flags & DEPFLAG_NORMAL)
|
||||
normal = true;
|
||||
if (extra->flags & DEPFLAG_REVERSE)
|
||||
normal = true;
|
||||
|
||||
if (EventTriggerSupportsObjectClass(getObjectClass(thisobj)))
|
||||
{
|
||||
EventTriggerSQLDropAddObject(thisobj);
|
||||
EventTriggerSQLDropAddObject(thisobj, original, normal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -117,6 +117,8 @@ typedef struct SQLDropObject
|
||||
const char *objname;
|
||||
const char *objidentity;
|
||||
const char *objecttype;
|
||||
bool original;
|
||||
bool normal;
|
||||
slist_node next;
|
||||
} SQLDropObject;
|
||||
|
||||
@ -1238,7 +1240,7 @@ trackDroppedObjectsNeeded(void)
|
||||
* Register one object as being dropped by the current command.
|
||||
*/
|
||||
void
|
||||
EventTriggerSQLDropAddObject(ObjectAddress *object)
|
||||
EventTriggerSQLDropAddObject(const ObjectAddress *object, bool original, bool normal)
|
||||
{
|
||||
SQLDropObject *obj;
|
||||
MemoryContext oldcxt;
|
||||
@ -1257,6 +1259,8 @@ EventTriggerSQLDropAddObject(ObjectAddress *object)
|
||||
|
||||
obj = palloc0(sizeof(SQLDropObject));
|
||||
obj->address = *object;
|
||||
obj->original = original;
|
||||
obj->normal = normal;
|
||||
|
||||
/*
|
||||
* Obtain schema names from the object's catalog tuple, if one exists;
|
||||
@ -1384,8 +1388,8 @@ pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SQLDropObject *obj;
|
||||
int i = 0;
|
||||
Datum values[7];
|
||||
bool nulls[7];
|
||||
Datum values[9];
|
||||
bool nulls[9];
|
||||
|
||||
obj = slist_container(SQLDropObject, next, iter.cur);
|
||||
|
||||
@ -1401,6 +1405,12 @@ pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS)
|
||||
/* objsubid */
|
||||
values[i++] = Int32GetDatum(obj->address.objectSubId);
|
||||
|
||||
/* original */
|
||||
values[i++] = BoolGetDatum(obj->original);
|
||||
|
||||
/* normal */
|
||||
values[i++] = BoolGetDatum(obj->normal);
|
||||
|
||||
/* object_type */
|
||||
values[i++] = CStringGetTextDatum(obj->objecttype);
|
||||
|
||||
|
Reference in New Issue
Block a user