pg_dump_deterministic_order_v3.patch
application/octet-stream
Filename: pg_dump_deterministic_order_v3.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: context
Series: patch v3
| File | + | − |
|---|---|---|
| src/bin/pg_dump/pg_dump.c | 50 | 0 |
| src/bin/pg_dump/pg_dump.h | 1 | 0 |
| src/bin/pg_dump/pg_dump_sort.c | 14 | 0 |
*** a/src/bin/pg_dump/pg_dump.c
--- b/src/bin/pg_dump/pg_dump.c
***************
*** 1668,1673 **** makeTableDataInfo(TableInfo *tbinfo, bool oids)
--- 1668,1674 ----
tdinfo->dobj.catId.oid = tbinfo->dobj.catId.oid;
AssignDumpId(&tdinfo->dobj);
tdinfo->dobj.name = tbinfo->dobj.name;
+ tdinfo->dobj.sortkey = NULL;
tdinfo->dobj.namespace = tbinfo->dobj.namespace;
tdinfo->tdtable = tbinfo;
tdinfo->oids = oids;
***************
*** 2229,2234 **** getBlobs(Archive *fout)
--- 2230,2236 ----
AssignDumpId(&binfo[i].dobj);
binfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, 0));
+ binfo[i].dobj.sortkey = NULL;
if (!PQgetisnull(res, i, 1))
binfo[i].rolname = pg_strdup(PQgetvalue(res, i, 1));
else
***************
*** 2659,2664 **** getNamespaces(Archive *fout, int *numNamespaces)
--- 2661,2667 ----
nsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&nsinfo[i].dobj);
nsinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_nspname));
+ nsinfo[i].dobj.sortkey = NULL;
nsinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
nsinfo[i].nspacl = pg_strdup(PQgetvalue(res, i, i_nspacl));
***************
*** 2708,2713 **** findNamespace(Archive *fout, Oid nsoid, Oid objoid)
--- 2711,2717 ----
nsinfo = findNamespaceByOid(i);
}
+
if (nsinfo == NULL)
exit_horribly(NULL, "schema with OID %u does not exist\n", nsoid);
***************
*** 2779,2784 **** getExtensions(Archive *fout, int *numExtensions)
--- 2783,2789 ----
extinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&extinfo[i].dobj);
extinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_extname));
+ extinfo[i].dobj.sortkey = NULL;
extinfo[i].namespace = pg_strdup(PQgetvalue(res, i, i_nspname));
extinfo[i].relocatable = *(PQgetvalue(res, i, i_extrelocatable)) == 't';
extinfo[i].extversion = pg_strdup(PQgetvalue(res, i, i_extversion));
***************
*** 2936,2941 **** getTypes(Archive *fout, int *numTypes)
--- 2941,2947 ----
tyinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&tyinfo[i].dobj);
tyinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_typname));
+ tyinfo[i].dobj.sortkey = NULL;
tyinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_typnamespace)),
***************
*** 2986,2991 **** getTypes(Archive *fout, int *numTypes)
--- 2992,2998 ----
stinfo->dobj.catId = nilCatalogId;
AssignDumpId(&stinfo->dobj);
stinfo->dobj.name = pg_strdup(tyinfo[i].dobj.name);
+ stinfo->dobj.sortkey = NULL;
stinfo->dobj.namespace = tyinfo[i].dobj.namespace;
stinfo->baseType = &(tyinfo[i]);
tyinfo[i].shellType = stinfo;
***************
*** 3140,3145 **** getOperators(Archive *fout, int *numOprs)
--- 3147,3153 ----
oprinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&oprinfo[i].dobj);
oprinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_oprname));
+ oprinfo[i].dobj.sortkey = NULL;
oprinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_oprnamespace)),
***************
*** 3227,3232 **** getCollations(Archive *fout, int *numCollations)
--- 3235,3241 ----
collinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&collinfo[i].dobj);
collinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_collname));
+ collinfo[i].dobj.sortkey = NULL;
collinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_collnamespace)),
***************
*** 3306,3311 **** getConversions(Archive *fout, int *numConversions)
--- 3315,3321 ----
convinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&convinfo[i].dobj);
convinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname));
+ convinfo[i].dobj.sortkey = NULL;
convinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_connamespace)),
***************
*** 3397,3402 **** getOpclasses(Archive *fout, int *numOpclasses)
--- 3407,3413 ----
opcinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&opcinfo[i].dobj);
opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname));
+ opcinfo[i].dobj.sortkey = NULL;
opcinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_opcnamespace)),
***************
*** 3485,3490 **** getOpfamilies(Archive *fout, int *numOpfamilies)
--- 3496,3502 ----
opfinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&opfinfo[i].dobj);
opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname));
+ opfinfo[i].dobj.sortkey = NULL;
opfinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_opfnamespace)),
***************
*** 3532,3537 **** getAggregates(Archive *fout, int *numAggs)
--- 3544,3550 ----
int i_proargtypes;
int i_rolname;
int i_aggacl;
+ int i_sortkey;
/* Make sure we are in proper schema */
selectSourceSchema(fout, "pg_catalog");
***************
*** 3547,3553 **** getAggregates(Archive *fout, int *numAggs)
"pronamespace AS aggnamespace, "
"pronargs, proargtypes, "
"(%s proowner) AS rolname, "
! "proacl AS aggacl "
"FROM pg_proc p "
"WHERE proisagg AND ("
"pronamespace != "
--- 3560,3567 ----
"pronamespace AS aggnamespace, "
"pronargs, proargtypes, "
"(%s proowner) AS rolname, "
! "proacl AS aggacl, "
! "pg_get_function_identity_arguments(oid) AS sortkey "
"FROM pg_proc p "
"WHERE proisagg AND ("
"pronamespace != "
***************
*** 3570,3576 **** getAggregates(Archive *fout, int *numAggs)
"CASE WHEN proargtypes[0] = 'pg_catalog.\"any\"'::pg_catalog.regtype THEN 0 ELSE 1 END AS pronargs, "
"proargtypes, "
"(%s proowner) AS rolname, "
! "proacl AS aggacl "
"FROM pg_proc "
"WHERE proisagg "
"AND pronamespace != "
--- 3584,3591 ----
"CASE WHEN proargtypes[0] = 'pg_catalog.\"any\"'::pg_catalog.regtype THEN 0 ELSE 1 END AS pronargs, "
"proargtypes, "
"(%s proowner) AS rolname, "
! "proacl AS aggacl, "
! "''::text AS sortkey"
"FROM pg_proc "
"WHERE proisagg "
"AND pronamespace != "
***************
*** 3584,3590 **** getAggregates(Archive *fout, int *numAggs)
"CASE WHEN aggbasetype = 0 THEN 0 ELSE 1 END AS pronargs, "
"aggbasetype AS proargtypes, "
"(%s aggowner) AS rolname, "
! "'{=X}' AS aggacl "
"FROM pg_aggregate "
"where oid > '%u'::oid",
username_subquery,
--- 3599,3606 ----
"CASE WHEN aggbasetype = 0 THEN 0 ELSE 1 END AS pronargs, "
"aggbasetype AS proargtypes, "
"(%s aggowner) AS rolname, "
! "'{=X}' AS aggacl, "
! "''::text AS sortkey"
"FROM pg_aggregate "
"where oid > '%u'::oid",
username_subquery,
***************
*** 3599,3605 **** getAggregates(Archive *fout, int *numAggs)
"CASE WHEN aggbasetype = 0 THEN 0 ELSE 1 END AS pronargs, "
"aggbasetype AS proargtypes, "
"(%s aggowner) AS rolname, "
! "'{=X}' AS aggacl "
"FROM pg_aggregate "
"where oid > '%u'::oid",
username_subquery,
--- 3615,3622 ----
"CASE WHEN aggbasetype = 0 THEN 0 ELSE 1 END AS pronargs, "
"aggbasetype AS proargtypes, "
"(%s aggowner) AS rolname, "
! "'{=X}' AS aggacl, "
! "''::text AS sortkey"
"FROM pg_aggregate "
"where oid > '%u'::oid",
username_subquery,
***************
*** 3621,3626 **** getAggregates(Archive *fout, int *numAggs)
--- 3638,3644 ----
i_proargtypes = PQfnumber(res, "proargtypes");
i_rolname = PQfnumber(res, "rolname");
i_aggacl = PQfnumber(res, "aggacl");
+ i_sortkey = PQfnumber(res, "sortkey");
for (i = 0; i < ntups; i++)
{
***************
*** 3629,3634 **** getAggregates(Archive *fout, int *numAggs)
--- 3647,3653 ----
agginfo[i].aggfn.dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&agginfo[i].aggfn.dobj);
agginfo[i].aggfn.dobj.name = pg_strdup(PQgetvalue(res, i, i_aggname));
+ agginfo[i].aggfn.dobj.sortkey = pg_strdup(PQgetvalue(res, i, i_sortkey));
agginfo[i].aggfn.dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_aggnamespace)),
***************
*** 3691,3696 **** getFuncs(Archive *fout, int *numFuncs)
--- 3710,3716 ----
int i_proargtypes;
int i_prorettype;
int i_proacl;
+ int i_sortkey;
/* Make sure we are in proper schema */
selectSourceSchema(fout, "pg_catalog");
***************
*** 3717,3723 **** getFuncs(Archive *fout, int *numFuncs)
"SELECT tableoid, oid, proname, prolang, "
"pronargs, proargtypes, prorettype, proacl, "
"pronamespace, "
! "(%s proowner) AS rolname "
"FROM pg_proc p "
"WHERE NOT proisagg AND ("
"pronamespace != "
--- 3737,3744 ----
"SELECT tableoid, oid, proname, prolang, "
"pronargs, proargtypes, prorettype, proacl, "
"pronamespace, "
! "(%s proowner) AS rolname, "
! "pg_get_function_identity_arguments(oid) AS sortkey "
"FROM pg_proc p "
"WHERE NOT proisagg AND ("
"pronamespace != "
***************
*** 3745,3751 **** getFuncs(Archive *fout, int *numFuncs)
"pronargs, proargtypes, prorettype, "
"'{=X}' AS proacl, "
"0::oid AS pronamespace, "
! "(%s proowner) AS rolname "
"FROM pg_proc "
"WHERE pg_proc.oid > '%u'::oid",
username_subquery,
--- 3766,3773 ----
"pronargs, proargtypes, prorettype, "
"'{=X}' AS proacl, "
"0::oid AS pronamespace, "
! "(%s proowner) AS rolname, "
! "''::text AS sortkey"
"FROM pg_proc "
"WHERE pg_proc.oid > '%u'::oid",
username_subquery,
***************
*** 3761,3767 **** getFuncs(Archive *fout, int *numFuncs)
"pronargs, proargtypes, prorettype, "
"'{=X}' AS proacl, "
"0::oid AS pronamespace, "
! "(%s proowner) AS rolname "
"FROM pg_proc "
"where pg_proc.oid > '%u'::oid",
username_subquery,
--- 3783,3790 ----
"pronargs, proargtypes, prorettype, "
"'{=X}' AS proacl, "
"0::oid AS pronamespace, "
! "(%s proowner) AS rolname, "
! "''::text AS sortkey"
"FROM pg_proc "
"where pg_proc.oid > '%u'::oid",
username_subquery,
***************
*** 3786,3791 **** getFuncs(Archive *fout, int *numFuncs)
--- 3809,3815 ----
i_proargtypes = PQfnumber(res, "proargtypes");
i_prorettype = PQfnumber(res, "prorettype");
i_proacl = PQfnumber(res, "proacl");
+ i_sortkey = PQfnumber(res, "sortkey");
for (i = 0; i < ntups; i++)
{
***************
*** 3794,3799 **** getFuncs(Archive *fout, int *numFuncs)
--- 3818,3824 ----
finfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&finfo[i].dobj);
finfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_proname));
+ finfo[i].dobj.sortkey = pg_strdup(PQgetvalue(res, i, i_sortkey));
finfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_pronamespace)),
***************
*** 4250,4255 **** getTables(Archive *fout, int *numTables)
--- 4275,4281 ----
tblinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_reloid));
AssignDumpId(&tblinfo[i].dobj);
tblinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_relname));
+ tblinfo[i].dobj.sortkey = NULL;
tblinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_relnamespace)),
***************
*** 4677,4682 **** getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
--- 4703,4709 ----
indxinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
AssignDumpId(&indxinfo[j].dobj);
indxinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_indexname));
+ indxinfo[j].dobj.sortkey = NULL;
indxinfo[j].dobj.namespace = tbinfo->dobj.namespace;
indxinfo[j].indextable = tbinfo;
indxinfo[j].indexdef = pg_strdup(PQgetvalue(res, j, i_indexdef));
***************
*** 4713,4718 **** getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
--- 4740,4746 ----
constrinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_conoid));
AssignDumpId(&constrinfo[j].dobj);
constrinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
+ constrinfo[j].dobj.sortkey = NULL;
constrinfo[j].dobj.namespace = tbinfo->dobj.namespace;
constrinfo[j].contable = tbinfo;
constrinfo[j].condomain = NULL;
***************
*** 4821,4826 **** getConstraints(Archive *fout, TableInfo tblinfo[], int numTables)
--- 4849,4855 ----
constrinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_conoid));
AssignDumpId(&constrinfo[j].dobj);
constrinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
+ constrinfo[j].dobj.sortkey = NULL;
constrinfo[j].dobj.namespace = tbinfo->dobj.namespace;
constrinfo[j].contable = tbinfo;
constrinfo[j].condomain = NULL;
***************
*** 4919,4924 **** getDomainConstraints(Archive *fout, TypeInfo *tyinfo)
--- 4948,4954 ----
constrinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&constrinfo[i].dobj);
constrinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname));
+ constrinfo[i].dobj.sortkey = NULL;
constrinfo[i].dobj.namespace = tyinfo->dobj.namespace;
constrinfo[i].contable = NULL;
constrinfo[i].condomain = tyinfo;
***************
*** 5027,5032 **** getRules(Archive *fout, int *numRules)
--- 5057,5063 ----
ruleinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&ruleinfo[i].dobj);
ruleinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_rulename));
+ ruleinfo[i].dobj.sortkey = NULL;
ruletableoid = atooid(PQgetvalue(res, i, i_ruletable));
ruleinfo[i].ruletable = findTableByOid(ruletableoid);
if (ruleinfo[i].ruletable == NULL)
***************
*** 5234,5239 **** getTriggers(Archive *fout, TableInfo tblinfo[], int numTables)
--- 5265,5271 ----
tginfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
AssignDumpId(&tginfo[j].dobj);
tginfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_tgname));
+ tginfo[j].dobj.sortkey = NULL;
tginfo[j].dobj.namespace = tbinfo->dobj.namespace;
tginfo[j].tgtable = tbinfo;
tginfo[j].tgenabled = *(PQgetvalue(res, j, i_tgenabled));
***************
*** 5413,5418 **** getProcLangs(Archive *fout, int *numProcLangs)
--- 5445,5451 ----
AssignDumpId(&planginfo[i].dobj);
planginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_lanname));
+ planginfo[i].dobj.sortkey = NULL;
planginfo[i].lanpltrusted = *(PQgetvalue(res, i, i_lanpltrusted)) == 't';
planginfo[i].lanplcallfoid = atooid(PQgetvalue(res, i, i_lanplcallfoid));
if (i_laninline >= 0)
***************
*** 5550,5555 **** getCasts(Archive *fout, int *numCasts)
--- 5583,5589 ----
appendPQExpBuffer(&namebuf, "%s %s",
sTypeInfo->dobj.name, tTypeInfo->dobj.name);
castinfo[i].dobj.name = namebuf.data;
+ castinfo[i].dobj.sortkey = NULL;
if (OidIsValid(castinfo[i].castfunc))
{
***************
*** 5924,5929 **** getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
--- 5958,5964 ----
attrdefs[j].adef_expr = pg_strdup(PQgetvalue(res, j, 3));
attrdefs[j].dobj.name = pg_strdup(tbinfo->dobj.name);
+ attrdefs[j].dobj.sortkey = NULL;
attrdefs[j].dobj.namespace = tbinfo->dobj.namespace;
attrdefs[j].dobj.dump = tbinfo->dobj.dump;
***************
*** 6092,6097 **** getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
--- 6127,6133 ----
constrs[j].dobj.catId.oid = atooid(PQgetvalue(res, j, 1));
AssignDumpId(&constrs[j].dobj);
constrs[j].dobj.name = pg_strdup(PQgetvalue(res, j, 2));
+ constrs[j].dobj.sortkey = NULL;
constrs[j].dobj.namespace = tbinfo->dobj.namespace;
constrs[j].contable = tbinfo;
constrs[j].condomain = NULL;
***************
*** 6232,6237 **** getTSParsers(Archive *fout, int *numTSParsers)
--- 6268,6274 ----
prsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&prsinfo[i].dobj);
prsinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_prsname));
+ prsinfo[i].dobj.sortkey = NULL;
prsinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_prsnamespace)),
***************
*** 6316,6321 **** getTSDictionaries(Archive *fout, int *numTSDicts)
--- 6353,6359 ----
dictinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&dictinfo[i].dobj);
dictinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_dictname));
+ dictinfo[i].dobj.sortkey = NULL;
dictinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_dictnamespace)),
***************
*** 6397,6402 **** getTSTemplates(Archive *fout, int *numTSTemplates)
--- 6435,6441 ----
tmplinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&tmplinfo[i].dobj);
tmplinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_tmplname));
+ tmplinfo[i].dobj.sortkey = NULL;
tmplinfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_tmplnamespace)),
***************
*** 6475,6480 **** getTSConfigurations(Archive *fout, int *numTSConfigs)
--- 6514,6520 ----
cfginfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&cfginfo[i].dobj);
cfginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_cfgname));
+ cfginfo[i].dobj.sortkey = NULL;
cfginfo[i].dobj.namespace =
findNamespace(fout,
atooid(PQgetvalue(res, i, i_cfgnamespace)),
***************
*** 6581,6586 **** getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers)
--- 6621,6627 ----
fdwinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&fdwinfo[i].dobj);
fdwinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_fdwname));
+ fdwinfo[i].dobj.sortkey = NULL;
fdwinfo[i].dobj.namespace = NULL;
fdwinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
fdwinfo[i].fdwhandler = pg_strdup(PQgetvalue(res, i, i_fdwhandler));
***************
*** 6670,6675 **** getForeignServers(Archive *fout, int *numForeignServers)
--- 6711,6717 ----
srvinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&srvinfo[i].dobj);
srvinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_srvname));
+ srvinfo[i].dobj.sortkey = NULL;
srvinfo[i].dobj.namespace = NULL;
srvinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
srvinfo[i].srvfdw = atooid(PQgetvalue(res, i, i_srvfdw));
***************
*** 6754,6759 **** getDefaultACLs(Archive *fout, int *numDefaultACLs)
--- 6796,6802 ----
AssignDumpId(&daclinfo[i].dobj);
/* cheesy ... is it worth coming up with a better object name? */
daclinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_defaclobjtype));
+ daclinfo[i].dobj.sortkey = NULL;
if (nspid != InvalidOid)
daclinfo[i].dobj.namespace = findNamespace(fout, nspid,
*** a/src/bin/pg_dump/pg_dump.h
--- b/src/bin/pg_dump/pg_dump.h
***************
*** 135,140 **** typedef struct _dumpableObject
--- 135,141 ----
DumpId *dependencies; /* dumpIds of objects this one depends on */
int nDeps; /* number of valid dependencies */
int allocDeps; /* allocated size of dependencies[] */
+ char *sortkey; /* set to args for functions */
} DumpableObject;
typedef struct _namespaceInfo
*** a/src/bin/pg_dump/pg_dump_sort.c
--- b/src/bin/pg_dump/pg_dump_sort.c
***************
*** 215,220 **** DOTypeNameCompare(const void *p1, const void *p2)
--- 215,234 ----
return cmpval;
}
+ /*
+ * Sort by sortkey.
+ * This element is currently only set for functions to
+ * the function identity arguments,
+ * which allows sorting of overloaded functions
+ * in a deterministic order.
+ */
+ if (obj1->sortkey && obj2->sortkey)
+ {
+ cmpval = strcmp(obj1->sortkey, obj2->sortkey);
+ if (cmpval != 0)
+ return cmpval;
+ }
+
/* Usually shouldn't get here, but if we do, sort by OID */
return oidcmp(obj1->catId.oid, obj2->catId.oid);
}