1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-18 12:22:09 +03:00

pg_dump: provide a stable sort order for rules.

Previously, we sorted rules by schema name and then rule name;
if that wasn't unique, we sorted by rule OID.  This can be
problematic for comparing dumps from databases with different
histories, especially since certain rule names like "_RETURN"
are very common.  Let's make the sort key schema name, rule name,
table name, which should be unique.  (This is the same behavior
we've long used for triggers and RLS policies.)

Andreas Karlsson

This back-patches v18 commit 350e6b8ea8 to
all supported branches.  The next commit will assert that pg_dump
provides a stable sort order for all object types.  That assertion would
fail without stabilizing DO_RULE order as this commit did.

Discussion: https://postgr.es/m/b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se
Discussion: https://postgr.es/m/20250707192654.9e.nmisch@google.com
Backpatch-through: 13-17
This commit is contained in:
Tom Lane
2024-11-04 13:30:30 -05:00
committed by Noah Misch
parent 612f5b8062
commit cc9a62c51a

View File

@@ -238,6 +238,17 @@ DOTypeNameCompare(const void *p1, const void *p2)
if (cmpval != 0)
return cmpval;
}
else if (obj1->objType == DO_RULE)
{
RuleInfo *robj1 = *(RuleInfo *const *) p1;
RuleInfo *robj2 = *(RuleInfo *const *) p2;
/* Sort by table name (table namespace was considered already) */
cmpval = strcmp(robj1->ruletable->dobj.name,
robj2->ruletable->dobj.name);
if (cmpval != 0)
return cmpval;
}
else if (obj1->objType == DO_TRIGGER)
{
TriggerInfo *tobj1 = *(TriggerInfo *const *) p1;