diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2019-03-20 18:06:29 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2019-03-20 18:06:29 -0400 |
commit | 8aa9dd74b36757342b6208fbfebb5b35c2d67c53 (patch) | |
tree | 0ee9b9aef47d5dfb750d91180424f60916a59047 /src | |
parent | a6da0047158b8a227f883aeed19eb7fcfbef11fb (diff) | |
download | postgresql-8aa9dd74b36757342b6208fbfebb5b35c2d67c53.tar.gz postgresql-8aa9dd74b36757342b6208fbfebb5b35c2d67c53.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/dependency.c | 17 | ||||
-rw-r--r-- | src/backend/catalog/pg_shdepend.c | 8 | ||||
-rw-r--r-- | src/include/catalog/dependency.h | 2 |
3 files changed, 27 insertions, 0 deletions
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 2048d71535b..f7acb4103eb 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -2611,6 +2611,23 @@ record_object_address_dependencies(const ObjectAddress *depender, } /* + * 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. */ void diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c index 1619c1c8a7c..63a7f4838f8 100644 --- a/src/backend/catalog/pg_shdepend.c +++ b/src/backend/catalog/pg_shdepend.c @@ -1266,6 +1266,14 @@ shdepDropOwned(List *roleids, DropBehavior behavior) 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 */ performMultipleDeletions(deleteobjs, behavior, 0); diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h index b235a23f5dc..f537f015879 100644 --- a/src/include/catalog/dependency.h +++ b/src/include/catalog/dependency.h @@ -170,6 +170,8 @@ extern void record_object_address_dependencies(const ObjectAddress *depender, ObjectAddresses *referenced, DependencyType behavior); +extern void sort_object_addresses(ObjectAddresses *addrs); + extern void free_object_addresses(ObjectAddresses *addrs); /* in pg_depend.c */ |