Sort the dependent objects before deletion in DROP OWNED BY.
This finishes a task we left undone in commit f1ad067fc, by extending the delete-in-descending-OID-order rule to deletions triggered by DROP OWNED BY. We've coped with machine-dependent deletion orders one time too many, and the new issues caused by Peter G's recent nbtree hacking seem like the last straw. Discussion: https://postgr.es/m/E1h6eep-0001Mw-Vd@gemulon.postgresql.org
This commit is contained in:
parent
a6da004715
commit
8aa9dd74b3
@ -2610,6 +2610,23 @@ record_object_address_dependencies(const ObjectAddress *depender,
|
|||||||
behavior);
|
behavior);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sort the items in an ObjectAddresses array.
|
||||||
|
*
|
||||||
|
* The major sort key is OID-descending, so that newer objects will be listed
|
||||||
|
* first in most cases. This is primarily useful for ensuring stable outputs
|
||||||
|
* from regression tests; it's not recommended if the order of the objects is
|
||||||
|
* determined by user input, such as the order of targets in a DROP command.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
sort_object_addresses(ObjectAddresses *addrs)
|
||||||
|
{
|
||||||
|
if (addrs->numrefs > 1)
|
||||||
|
qsort((void *) addrs->refs, addrs->numrefs,
|
||||||
|
sizeof(ObjectAddress),
|
||||||
|
object_address_comparator);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clean up when done with an ObjectAddresses array.
|
* Clean up when done with an ObjectAddresses array.
|
||||||
*/
|
*/
|
||||||
|
@ -1266,6 +1266,14 @@ shdepDropOwned(List *roleids, DropBehavior behavior)
|
|||||||
systable_endscan(scan);
|
systable_endscan(scan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For stability of deletion-report ordering, sort the objects into
|
||||||
|
* approximate reverse creation order before deletion. (This might also
|
||||||
|
* make the deletion go a bit faster, since there's less chance of having
|
||||||
|
* to rearrange the objects due to dependencies.)
|
||||||
|
*/
|
||||||
|
sort_object_addresses(deleteobjs);
|
||||||
|
|
||||||
/* the dependency mechanism does the actual work */
|
/* the dependency mechanism does the actual work */
|
||||||
performMultipleDeletions(deleteobjs, behavior, 0);
|
performMultipleDeletions(deleteobjs, behavior, 0);
|
||||||
|
|
||||||
|
@ -170,6 +170,8 @@ extern void record_object_address_dependencies(const ObjectAddress *depender,
|
|||||||
ObjectAddresses *referenced,
|
ObjectAddresses *referenced,
|
||||||
DependencyType behavior);
|
DependencyType behavior);
|
||||||
|
|
||||||
|
extern void sort_object_addresses(ObjectAddresses *addrs);
|
||||||
|
|
||||||
extern void free_object_addresses(ObjectAddresses *addrs);
|
extern void free_object_addresses(ObjectAddresses *addrs);
|
||||||
|
|
||||||
/* in pg_depend.c */
|
/* in pg_depend.c */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user