aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/dependency.c17
-rw-r--r--src/backend/catalog/pg_shdepend.c8
-rw-r--r--src/include/catalog/dependency.h2
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 */