Skip to content

Commit 5102f39

Browse files
committed
Stabilize pg_dump output order for similarly-named triggers and policies.
The code only compared two triggers' names and namespaces (the latter being the owning table's schema). This could result in falling back to an OID-based sort of similarly-named triggers on different tables. We prefer to avoid that, so add a comparison of the table names too. (The sort order is thus table namespace, trigger name, table name, which is a bit odd, but it doesn't seem worth contorting the code to work around that.) Likewise for policy objects, in 9.5 and up. Complaint and fix by Benjie Gillam. Back-patch to all supported branches. Discussion: https://postgr.es/m/CAMThMzEEt2mvBbPgCaZ1Ap1N-moGn=Edxmadddjq89WG4NpPtQ@mail.gmail.com
1 parent ec28808 commit 5102f39

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

src/bin/pg_dump/pg_dump_sort.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ DOTypeNameCompare(const void *p1, const void *p2)
164164
FuncInfo *fobj2 = *(FuncInfo *const *) p2;
165165
int i;
166166

167+
/* Sort by number of arguments, then argument type names */
167168
cmpval = fobj1->nargs - fobj2->nargs;
168169
if (cmpval != 0)
169170
return cmpval;
@@ -202,10 +203,33 @@ DOTypeNameCompare(const void *p1, const void *p2)
202203
AttrDefInfo *adobj1 = *(AttrDefInfo *const *) p1;
203204
AttrDefInfo *adobj2 = *(AttrDefInfo *const *) p2;
204205

206+
/* Sort by attribute number */
205207
cmpval = (adobj1->adnum - adobj2->adnum);
206208
if (cmpval != 0)
207209
return cmpval;
208210
}
211+
else if (obj1->objType == DO_POLICY)
212+
{
213+
PolicyInfo *pobj1 = *(PolicyInfo *const *) p1;
214+
PolicyInfo *pobj2 = *(PolicyInfo *const *) p2;
215+
216+
/* Sort by table name (table namespace was considered already) */
217+
cmpval = strcmp(pobj1->poltable->dobj.name,
218+
pobj2->poltable->dobj.name);
219+
if (cmpval != 0)
220+
return cmpval;
221+
}
222+
else if (obj1->objType == DO_TRIGGER)
223+
{
224+
TriggerInfo *tobj1 = *(TriggerInfo *const *) p1;
225+
TriggerInfo *tobj2 = *(TriggerInfo *const *) p2;
226+
227+
/* Sort by table name (table namespace was considered already) */
228+
cmpval = strcmp(tobj1->tgtable->dobj.name,
229+
tobj2->tgtable->dobj.name);
230+
if (cmpval != 0)
231+
return cmpval;
232+
}
209233

210234
/* Usually shouldn't get here, but if we do, sort by OID */
211235
return oidcmp(obj1->catId.oid, obj2->catId.oid);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy