*** a/src/bin/pg_dump/pg_dump.c
--- b/src/bin/pg_dump/pg_dump.c
***************
*** 2229,2234 **** getBlobs(Archive *fout)
--- 2229,2235 ----
  			AssignDumpId(&binfo[i].dobj);
  
  			binfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, 0));
+ 			binfo[i].dobj.proargs = NULL;
  			if (!PQgetisnull(res, i, 1))
  				binfo[i].rolname = pg_strdup(PQgetvalue(res, i, 1));
  			else
***************
*** 2659,2664 **** getNamespaces(Archive *fout, int *numNamespaces)
--- 2660,2666 ----
  		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.proargs = NULL;
  		nsinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
  		nsinfo[i].nspacl = pg_strdup(PQgetvalue(res, i, i_nspacl));
  
***************
*** 2779,2784 **** getExtensions(Archive *fout, int *numExtensions)
--- 2781,2787 ----
  		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.proargs = 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)
--- 2939,2945 ----
  		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.proargs = NULL;
  		tyinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_typnamespace)),
***************
*** 2986,2991 **** getTypes(Archive *fout, int *numTypes)
--- 2990,2996 ----
  			stinfo->dobj.catId = nilCatalogId;
  			AssignDumpId(&stinfo->dobj);
  			stinfo->dobj.name = pg_strdup(tyinfo[i].dobj.name);
+ 			stinfo->dobj.proargs = NULL;
  			stinfo->dobj.namespace = tyinfo[i].dobj.namespace;
  			stinfo->baseType = &(tyinfo[i]);
  			tyinfo[i].shellType = stinfo;
***************
*** 3140,3145 **** getOperators(Archive *fout, int *numOprs)
--- 3145,3151 ----
  		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.proargs = NULL;
  		oprinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_oprnamespace)),
***************
*** 3227,3232 **** getCollations(Archive *fout, int *numCollations)
--- 3233,3239 ----
  		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.proargs = NULL;
  		collinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_collnamespace)),
***************
*** 3306,3311 **** getConversions(Archive *fout, int *numConversions)
--- 3313,3319 ----
  		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.proargs = NULL;
  		convinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_connamespace)),
***************
*** 3397,3402 **** getOpclasses(Archive *fout, int *numOpclasses)
--- 3405,3411 ----
  		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.proargs = NULL;
  		opcinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_opcnamespace)),
***************
*** 3485,3490 **** getOpfamilies(Archive *fout, int *numOpfamilies)
--- 3494,3500 ----
  		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.proargs = NULL;
  		opfinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_opfnamespace)),
***************
*** 3691,3696 **** getFuncs(Archive *fout, int *numFuncs)
--- 3701,3707 ----
  	int			i_proargtypes;
  	int			i_prorettype;
  	int			i_proacl;
+ 	int			i_proargs;
  
  	/* 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 != "
--- 3728,3735 ----
  						  "SELECT tableoid, oid, proname, prolang, "
  						  "pronargs, proargtypes, prorettype, proacl, "
  						  "pronamespace, "
! 						  "(%s proowner) AS rolname, "
! 						  "pg_get_function_identity_arguments(oid) AS proargs"
  						  "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,
--- 3757,3764 ----
  						  "pronargs, proargtypes, prorettype, "
  						  "'{=X}' AS proacl, "
  						  "0::oid AS pronamespace, "
! 						  "(%s proowner) AS rolname, "
! 						  "''::text AS proargs"
  						  "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,
--- 3774,3781 ----
  						  "pronargs, proargtypes, prorettype, "
  						  "'{=X}' AS proacl, "
  						  "0::oid AS pronamespace, "
! 						  "(%s proowner) AS rolname, "
! 						  "''::text AS proargs"
  						  "FROM pg_proc "
  						  "where pg_proc.oid > '%u'::oid",
  						  username_subquery,
***************
*** 3786,3791 **** getFuncs(Archive *fout, int *numFuncs)
--- 3800,3806 ----
  	i_proargtypes = PQfnumber(res, "proargtypes");
  	i_prorettype = PQfnumber(res, "prorettype");
  	i_proacl = PQfnumber(res, "proacl");
+ 	i_proargs = PQfnumber(res, "proargs");
  
  	for (i = 0; i < ntups; i++)
  	{
***************
*** 3794,3799 **** getFuncs(Archive *fout, int *numFuncs)
--- 3809,3815 ----
  		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.proargs = pg_strdup(PQgetvalue(res, i, i_proargs));
  		finfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_pronamespace)),
***************
*** 4919,4924 **** getDomainConstraints(Archive *fout, TypeInfo *tyinfo)
--- 4935,4941 ----
  		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.proargs = NULL;
  		constrinfo[i].dobj.namespace = tyinfo->dobj.namespace;
  		constrinfo[i].contable = NULL;
  		constrinfo[i].condomain = tyinfo;
***************
*** 5027,5032 **** getRules(Archive *fout, int *numRules)
--- 5044,5050 ----
  		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.proargs = NULL;
  		ruletableoid = atooid(PQgetvalue(res, i, i_ruletable));
  		ruleinfo[i].ruletable = findTableByOid(ruletableoid);
  		if (ruleinfo[i].ruletable == NULL)
***************
*** 5413,5418 **** getProcLangs(Archive *fout, int *numProcLangs)
--- 5431,5437 ----
  		AssignDumpId(&planginfo[i].dobj);
  
  		planginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_lanname));
+ 		planginfo[i].dobj.proargs = 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)
--- 5569,5575 ----
  			appendPQExpBuffer(&namebuf, "%s %s",
  							  sTypeInfo->dobj.name, tTypeInfo->dobj.name);
  		castinfo[i].dobj.name = namebuf.data;
+ 		castinfo[i].dobj.proargs = NULL;
  
  		if (OidIsValid(castinfo[i].castfunc))
  		{
***************
*** 6232,6237 **** getTSParsers(Archive *fout, int *numTSParsers)
--- 6252,6258 ----
  		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.proargs = NULL;
  		prsinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_prsnamespace)),
***************
*** 6316,6321 **** getTSDictionaries(Archive *fout, int *numTSDicts)
--- 6337,6343 ----
  		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.proargs = NULL;
  		dictinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_dictnamespace)),
***************
*** 6397,6402 **** getTSTemplates(Archive *fout, int *numTSTemplates)
--- 6419,6425 ----
  		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.proargs = NULL;
  		tmplinfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_tmplnamespace)),
***************
*** 6475,6480 **** getTSConfigurations(Archive *fout, int *numTSConfigs)
--- 6498,6504 ----
  		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.proargs = NULL;
  		cfginfo[i].dobj.namespace =
  			findNamespace(fout,
  						  atooid(PQgetvalue(res, i, i_cfgnamespace)),
***************
*** 6581,6586 **** getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers)
--- 6605,6611 ----
  		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.proargs = 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)
--- 6695,6701 ----
  		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.proargs = 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)
--- 6780,6786 ----
  		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.proargs = 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	   *proargs;			/* pg_get_function_identity_arguments(oid) */
  } DumpableObject;
  
  typedef struct _namespaceInfo
*** a/src/bin/pg_dump/pg_dump_sort.c
--- b/src/bin/pg_dump/pg_dump_sort.c
***************
*** 185,190 **** DOTypeNameCompare(const void *p1, const void *p2)
--- 185,198 ----
  	if (cmpval != 0)
  		return cmpval;
  
+ 	/* Sort by function identity arguments */
+ 	if (obj1->proargs && obj2->proargs)
+ 	{
+ 		cmpval = strcmp(obj1->proargs, obj2->proargs);
+ 		if (cmpval != 0)
+ 			return cmpval;
+ 	}
+ 
  	/* To have a stable sort order, break ties for some object types */
  	if (obj1->objType == DO_FUNC || obj1->objType == DO_AGG)
  	{
