*** 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);
  }
