1212 *by PostgreSQL
1313 *
1414 * IDENTIFICATION
15- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.361 2003/12/19 14:21:56 petere Exp $
15+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.362 2004/01/07 00:44:21 tgl Exp $
1616 *
1717 *-------------------------------------------------------------------------
1818 */
@@ -135,7 +135,8 @@ static void dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
135135static void getDependencies (void );
136136static void getDomainConstraints (TypeInfo * tinfo );
137137static void getTableData (TableInfo * tblinfo ,int numTables ,bool oids );
138- static char * format_function_signature (FuncInfo * finfo ,bool honor_quotes );
138+ static char * format_function_signature (FuncInfo * finfo ,char * * argnames ,
139+ bool honor_quotes );
139140static const char * convertRegProcReference (const char * proc );
140141static const char * convertOperatorReference (const char * opr );
141142static Oid findLastBuiltinOid_V71 (const char * );
@@ -4650,9 +4651,12 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
46504651 *
46514652 * The argument type names are qualified if needed. The function name
46524653 * is never qualified.
4654+ *
4655+ * argnames may be NULL if no names are available.
46534656 */
46544657static char *
4655- format_function_signature (FuncInfo * finfo ,bool honor_quotes )
4658+ format_function_signature (FuncInfo * finfo ,char * * argnames ,
4659+ bool honor_quotes )
46564660{
46574661PQExpBufferData fn ;
46584662int j ;
@@ -4665,10 +4669,18 @@ format_function_signature(FuncInfo *finfo, bool honor_quotes)
46654669for (j = 0 ;j < finfo -> nargs ;j ++ )
46664670{
46674671char * typname ;
4672+ char * argname ;
46684673
46694674typname = getFormattedTypeName (finfo -> argtypes [j ],zeroAsOpaque );
4670- appendPQExpBuffer (& fn ,"%s%s" ,
4675+
4676+ argname = argnames ?argnames [j ] : (char * )NULL ;
4677+ if (argname && argname [0 ]== '\0' )
4678+ argname = NULL ;
4679+
4680+ appendPQExpBuffer (& fn ,"%s%s%s%s" ,
46714681 (j > 0 ) ?", " :"" ,
4682+ argname ?fmtId (argname ) :"" ,
4683+ argname ?" " :"" ,
46724684typname );
46734685free (typname );
46744686}
@@ -4695,11 +4707,13 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
46954707char * proretset ;
46964708char * prosrc ;
46974709char * probin ;
4710+ char * proargnames ;
46984711char * provolatile ;
46994712char * proisstrict ;
47004713char * prosecdef ;
47014714char * lanname ;
47024715char * rettypename ;
4716+ char * * argnamearray = NULL ;
47034717
47044718/* Dump only funcs in dumpable namespaces */
47054719if (!finfo -> pronamespace -> dump || dataOnly )
@@ -4714,10 +4728,22 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
47144728selectSourceSchema (finfo -> pronamespace -> nspname );
47154729
47164730/* Fetch function-specific details */
4717- if (g_fout -> remoteVersion >=70300 )
4731+ if (g_fout -> remoteVersion >=70500 )
47184732{
47194733appendPQExpBuffer (query ,
47204734"SELECT proretset, prosrc, probin, "
4735+ "proargnames, "
4736+ "provolatile, proisstrict, prosecdef, "
4737+ "(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
4738+ "FROM pg_catalog.pg_proc "
4739+ "WHERE oid = '%u'::pg_catalog.oid" ,
4740+ finfo -> dobj .catId .oid );
4741+ }
4742+ else if (g_fout -> remoteVersion >=70300 )
4743+ {
4744+ appendPQExpBuffer (query ,
4745+ "SELECT proretset, prosrc, probin, "
4746+ "null::text as proargnames, "
47214747"provolatile, proisstrict, prosecdef, "
47224748"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) as lanname "
47234749"FROM pg_catalog.pg_proc "
@@ -4728,6 +4754,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
47284754{
47294755appendPQExpBuffer (query ,
47304756"SELECT proretset, prosrc, probin, "
4757+ "null::text as proargnames, "
47314758"case when proiscachable then 'i' else 'v' end as provolatile, "
47324759"proisstrict, "
47334760"'f'::boolean as prosecdef, "
@@ -4740,6 +4767,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
47404767{
47414768appendPQExpBuffer (query ,
47424769"SELECT proretset, prosrc, probin, "
4770+ "null::text as proargnames, "
47434771"case when proiscachable then 'i' else 'v' end as provolatile, "
47444772"'f'::boolean as proisstrict, "
47454773"'f'::boolean as prosecdef, "
@@ -4764,6 +4792,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
47644792proretset = PQgetvalue (res ,0 ,PQfnumber (res ,"proretset" ));
47654793prosrc = PQgetvalue (res ,0 ,PQfnumber (res ,"prosrc" ));
47664794probin = PQgetvalue (res ,0 ,PQfnumber (res ,"probin" ));
4795+ proargnames = PQgetvalue (res ,0 ,PQfnumber (res ,"proargnames" ));
47674796provolatile = PQgetvalue (res ,0 ,PQfnumber (res ,"provolatile" ));
47684797proisstrict = PQgetvalue (res ,0 ,PQfnumber (res ,"proisstrict" ));
47694798prosecdef = PQgetvalue (res ,0 ,PQfnumber (res ,"prosecdef" ));
@@ -4792,8 +4821,22 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
47924821}
47934822}
47944823
4795- funcsig = format_function_signature (finfo , true);
4796- funcsig_tag = format_function_signature (finfo , false);
4824+ if (proargnames && * proargnames )
4825+ {
4826+ int nitems = 0 ;
4827+
4828+ if (!parsePGArray (proargnames ,& argnamearray ,& nitems )||
4829+ nitems != finfo -> nargs )
4830+ {
4831+ write_msg (NULL ,"WARNING: could not parse proargnames array\n" );
4832+ if (argnamearray )
4833+ free (argnamearray );
4834+ argnamearray = NULL ;
4835+ }
4836+ }
4837+
4838+ funcsig = format_function_signature (finfo ,argnamearray , true);
4839+ funcsig_tag = format_function_signature (finfo ,NULL , false);
47974840
47984841/*
47994842 * DROP must be fully qualified in case same name appears in
@@ -4864,6 +4907,8 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
48644907destroyPQExpBuffer (asPart );
48654908free (funcsig );
48664909free (funcsig_tag );
4910+ if (argnamearray )
4911+ free (argnamearray );
48674912}
48684913
48694914
@@ -4953,7 +4998,7 @@ dumpCast(Archive *fout, CastInfo *cast)
49534998appendPQExpBuffer (defqry ,"WITHOUT FUNCTION" );
49544999else
49555000appendPQExpBuffer (defqry ,"WITH FUNCTION %s" ,
4956- format_function_signature (funcInfo , true));
5001+ format_function_signature (funcInfo ,NULL , true));
49575002
49585003if (cast -> castcontext == 'a' )
49595004appendPQExpBuffer (defqry ," AS ASSIGNMENT" );
@@ -5892,8 +5937,8 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
58925937free (aggsig );
58935938free (aggsig_tag );
58945939
5895- aggsig = format_function_signature (& agginfo -> aggfn , true);
5896- aggsig_tag = format_function_signature (& agginfo -> aggfn , false);
5940+ aggsig = format_function_signature (& agginfo -> aggfn ,NULL , true);
5941+ aggsig_tag = format_function_signature (& agginfo -> aggfn ,NULL , false);
58975942
58985943dumpACL (fout ,agginfo -> aggfn .dobj .catId ,agginfo -> aggfn .dobj .dumpId ,
58995944"FUNCTION" ,