pg_dump: provide a stable sort order for rules.
authorTom Lane <[email protected]>
Mon, 4 Nov 2024 18:30:30 +0000 (13:30 -0500)
committerTom Lane <[email protected]>
Mon, 4 Nov 2024 18:31:12 +0000 (13:31 -0500)
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

Discussion: https://postgr.es/m/b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se

src/bin/pg_dump/pg_dump_sort.c

index 4cb754caa55fdad1f78960ec49ebd54dc86139dd..675bbf12338c11a7a8defed21ec18c1dc0d235c5 100644 (file)
@@ -294,6 +294,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;