On 2020-06-25 08:58, Fabien COELHO wrote:
You changed the query strings to use "\n" instead of " ". I would not have
changed that, because it departs from the style around, and I do not think
it improves readability at the C code level.

This was the style that was introduced by daa9fe8a5264a3f192efa5ddee8fb011ad9da365.

However, on version < 8.4, ISTM that funcargs and funciargs are always
added: is this voluntary?.

That was a mistake.

Would it make sense to accumulate in the other direction, older to newer,
so that new attributes are added at the end of the select?

I think that could make sense, but the current style was introduced by daa9fe8a5264a3f192efa5ddee8fb011ad9da365. Should we revise that?

Should array_to_string be pg_catalog.array_to_string? All other calls seem
to have an explicit schema.

It's not handled fully consistently in pg_dump. But my understanding is that this is no longer necessary because pg_dump explicitly sets the search path before running.

--
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From 617adf2512484610e40f2178a46d8c0af9b746b4 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Mon, 29 Jun 2020 15:03:07 +0200
Subject: [PATCH v2] pg_dump: Reorganize dumpFunc() and dumpAgg()

Similar to daa9fe8a5264a3f192efa5ddee8fb011ad9da365, instead of
repeating the almost same large query in each version branch, use one
query and add a few columns to the SELECT list depending on the
version.  This saves a lot of duplication.
---
 src/bin/pg_dump/pg_dump.c | 492 ++++++++++++--------------------------
 1 file changed, 157 insertions(+), 335 deletions(-)

diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index a41a3db876..f3ad1a5d9e 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -11847,171 +11847,88 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
        asPart = createPQExpBuffer();
 
        /* Fetch function-specific details */
+       appendPQExpBuffer(query,
+                                         "SELECT\n"
+                                         "proretset,\n"
+                                         "prosrc,\n"
+                                         "probin,\n"
+                                         "provolatile,\n"
+                                         "proisstrict,\n"
+                                         "prosecdef,\n"
+                                         "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname,\n");
+
        if (fout->remoteVersion >= 120000)
-       {
-               /*
-                * prosupport was added in 12
-                */
                appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
-                                                 
"pg_catalog.pg_get_function_result(oid) AS funcresult, "
-                                                 "array_to_string(protrftypes, 
' ') AS protrftypes, "
-                                                 "prokind, provolatile, 
proisstrict, prosecdef, "
-                                                 "proleakproof, proconfig, 
procost, prorows, "
-                                                 "prosupport, proparallel, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 110000)
-       {
-               /*
-                * prokind was added in 11
-                */
+                                                 "prosupport,\n");
+       else
                appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
-                                                 
"pg_catalog.pg_get_function_result(oid) AS funcresult, "
-                                                 "array_to_string(protrftypes, 
' ') AS protrftypes, "
-                                                 "prokind, provolatile, 
proisstrict, prosecdef, "
-                                                 "proleakproof, proconfig, 
procost, prorows, "
-                                                 "'-' AS prosupport, 
proparallel, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 90600)
-       {
-               /*
-                * proparallel was added in 9.6
-                */
+                                                 "'-' AS prosupport,\n");
+
+       if (fout->remoteVersion >= 110000)
                appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
-                                                 
"pg_catalog.pg_get_function_result(oid) AS funcresult, "
-                                                 "array_to_string(protrftypes, 
' ') AS protrftypes, "
-                                                 "CASE WHEN proiswindow THEN 
'w' ELSE 'f' END AS prokind, "
-                                                 "provolatile, proisstrict, 
prosecdef, "
-                                                 "proleakproof, proconfig, 
procost, prorows, "
-                                                 "'-' AS prosupport, 
proparallel, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 90500)
-       {
-               /*
-                * protrftypes was added in 9.5
-                */
+                                                 "prokind,\n");
+       else if (fout->remoteVersion >= 80400)
                appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
-                                                 
"pg_catalog.pg_get_function_result(oid) AS funcresult, "
-                                                 "array_to_string(protrftypes, 
' ') AS protrftypes, "
-                                                 "CASE WHEN proiswindow THEN 
'w' ELSE 'f' END AS prokind, "
-                                                 "provolatile, proisstrict, 
prosecdef, "
-                                                 "proleakproof, proconfig, 
procost, prorows, "
-                                                 "'-' AS prosupport, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 90200)
-       {
-               /*
-                * proleakproof was added in 9.2
-                */
+                                                 "CASE WHEN proiswindow THEN 
'w' ELSE 'f' END AS prokind,\n");
+       else
                appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
-                                                 
"pg_catalog.pg_get_function_result(oid) AS funcresult, "
-                                                 "CASE WHEN proiswindow THEN 
'w' ELSE 'f' END AS prokind, "
-                                                 "provolatile, proisstrict, 
prosecdef, "
-                                                 "proleakproof, proconfig, 
procost, prorows, "
-                                                 "'-' AS prosupport, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 80400)
+                                                 "'f' AS prokind,\n");
+
+       if (fout->remoteVersion >= 90600)
+               appendPQExpBuffer(query,
+                                                 "proparallel,\n");
+       else
+               appendPQExpBuffer(query,
+                                                 "'u' AS proparallel,\n");
+
+       if (fout->remoteVersion >= 90500)
+               appendPQExpBuffer(query,
+                                                 "array_to_string(protrftypes, 
' ') AS protrftypes,\n");
+
+       if (fout->remoteVersion >= 90200)
+               appendPQExpBuffer(query,
+                                                 "proleakproof,\n");
+       else
+               appendPQExpBuffer(query,
+                                                 "false AS proleakproof,\n");
+
+       if (fout->remoteVersion >= 80400)
        {
                /*
                 * In 8.4 and up we rely on pg_get_function_arguments and
                 * pg_get_function_result instead of examining proallargtypes 
etc.
                 */
                appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
-                                                 
"pg_catalog.pg_get_function_result(oid) AS funcresult, "
-                                                 "CASE WHEN proiswindow THEN 
'w' ELSE 'f' END AS prokind, "
-                                                 "provolatile, proisstrict, 
prosecdef, "
-                                                 "false AS proleakproof, "
-                                                 " proconfig, procost, 
prorows, "
-                                                 "'-' AS prosupport, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 80300)
-       {
-               appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 "proallargtypes, proargmodes, 
proargnames, "
-                                                 "'f' AS prokind, "
-                                                 "provolatile, proisstrict, 
prosecdef, "
-                                                 "false AS proleakproof, "
-                                                 "proconfig, procost, prorows, 
"
-                                                 "'-' AS prosupport, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
+                                                 
"pg_catalog.pg_get_function_arguments(oid) AS funcargs,\n"
+                                                 
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs,\n"
+                                                 
"pg_catalog.pg_get_function_result(oid) AS funcresult,\n");
        }
        else if (fout->remoteVersion >= 80100)
-       {
                appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 "proallargtypes, proargmodes, 
proargnames, "
-                                                 "'f' AS prokind, "
-                                                 "provolatile, proisstrict, 
prosecdef, "
-                                                 "false AS proleakproof, "
-                                                 "null AS proconfig, 0 AS 
procost, 0 AS prorows, "
-                                                 "'-' AS prosupport, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
-       }
+                                                 "proallargtypes,\n"
+                                                 "proargmodes,\n"
+                                                 "proargnames,\n");
        else
-       {
                appendPQExpBuffer(query,
-                                                 "SELECT proretset, prosrc, 
probin, "
-                                                 "null AS proallargtypes, "
-                                                 "null AS proargmodes, "
-                                                 "proargnames, "
-                                                 "'f' AS prokind, "
-                                                 "provolatile, proisstrict, 
prosecdef, "
-                                                 "false AS proleakproof, "
-                                                 "null AS proconfig, 0 AS 
procost, 0 AS prorows, "
-                                                 "'-' AS prosupport, "
-                                                 "(SELECT lanname FROM 
pg_catalog.pg_language WHERE oid = prolang) AS lanname "
-                                                 "FROM pg_catalog.pg_proc "
-                                                 "WHERE oid = 
'%u'::pg_catalog.oid",
-                                                 finfo->dobj.catId.oid);
-       }
+                                                 "null AS proallargtypes,\n"
+                                                 "null AS proargmodes,\n"
+                                                 "proargnames,\n");
+
+       if (fout->remoteVersion >= 80300)
+               appendPQExpBuffer(query,
+                                                 "proconfig,\n"
+                                                 "procost,\n"
+                                                 "prorows\n");
+       else
+               appendPQExpBuffer(query,
+                                                 "null AS proconfig,\n"
+                                                 "0 AS procost,\n"
+                                                 "0 AS prorows\n");
+
+       appendPQExpBuffer(query,
+                                         "FROM pg_catalog.pg_proc "
+                                         "WHERE oid = '%u'::pg_catalog.oid",
+                                         finfo->dobj.catId.oid);
 
        res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
@@ -12045,12 +11962,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
        procost = PQgetvalue(res, 0, PQfnumber(res, "procost"));
        prorows = PQgetvalue(res, 0, PQfnumber(res, "prorows"));
        prosupport = PQgetvalue(res, 0, PQfnumber(res, "prosupport"));
-
-       if (PQfnumber(res, "proparallel") != -1)
-               proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
-       else
-               proparallel = NULL;
-
+       proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
        lanname = PQgetvalue(res, 0, PQfnumber(res, "lanname"));
 
        /*
@@ -12264,7 +12176,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
                appendPQExpBuffer(q, " SUPPORT %s", prosupport);
        }
 
-       if (proparallel != NULL && proparallel[0] != PROPARALLEL_UNSAFE)
+       if (proparallel[0] != PROPARALLEL_UNSAFE)
        {
                if (proparallel[0] == PROPARALLEL_SAFE)
                        appendPQExpBufferStr(q, " PARALLEL SAFE");
@@ -13939,27 +13851,8 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
        char       *aggfullsig = NULL;  /* full signature */
        char       *aggsig_tag;
        PGresult   *res;
-       int                     i_aggtransfn;
-       int                     i_aggfinalfn;
-       int                     i_aggcombinefn;
-       int                     i_aggserialfn;
-       int                     i_aggdeserialfn;
-       int                     i_aggmtransfn;
-       int                     i_aggminvtransfn;
-       int                     i_aggmfinalfn;
-       int                     i_aggfinalextra;
-       int                     i_aggmfinalextra;
-       int                     i_aggfinalmodify;
-       int                     i_aggmfinalmodify;
-       int                     i_aggsortop;
-       int                     i_aggkind;
-       int                     i_aggtranstype;
-       int                     i_aggtransspace;
-       int                     i_aggmtranstype;
-       int                     i_aggmtransspace;
        int                     i_agginitval;
        int                     i_aggminitval;
-       int                     i_proparallel;
        const char *aggtransfn;
        const char *aggfinalfn;
        const char *aggcombinefn;
@@ -13994,170 +13887,104 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
        details = createPQExpBuffer();
 
        /* Get aggregate-specific details */
+       appendPQExpBuffer(query,
+                                         "SELECT\n"
+                                         "aggtransfn,\n"
+                                         "aggfinalfn,\n"
+                                         "aggtranstype::pg_catalog.regtype,\n"
+                                         "agginitval,\n");
+
        if (fout->remoteVersion >= 110000)
-       {
-               appendPQExpBuffer(query, "SELECT aggtransfn, "
-                                                 "aggfinalfn, 
aggtranstype::pg_catalog.regtype, "
-                                                 "aggcombinefn, aggserialfn, 
aggdeserialfn, aggmtransfn, "
-                                                 "aggminvtransfn, aggmfinalfn, 
aggmtranstype::pg_catalog.regtype, "
-                                                 "aggfinalextra, 
aggmfinalextra, "
-                                                 "aggfinalmodify, 
aggmfinalmodify, "
-                                                 "aggsortop, "
-                                                 "aggkind, "
-                                                 "aggtransspace, agginitval, "
-                                                 "aggmtransspace, aggminitval, 
"
-                                                 
"pg_catalog.pg_get_function_arguments(p.oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs, "
-                                                 "p.proparallel "
-                                                 "FROM pg_catalog.pg_aggregate 
a, pg_catalog.pg_proc p "
-                                                 "WHERE a.aggfnoid = p.oid "
-                                                 "AND p.oid = 
'%u'::pg_catalog.oid",
-                                                 
agginfo->aggfn.dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 90600)
-       {
-               appendPQExpBuffer(query, "SELECT aggtransfn, "
-                                                 "aggfinalfn, 
aggtranstype::pg_catalog.regtype, "
-                                                 "aggcombinefn, aggserialfn, 
aggdeserialfn, aggmtransfn, "
-                                                 "aggminvtransfn, aggmfinalfn, 
aggmtranstype::pg_catalog.regtype, "
-                                                 "aggfinalextra, 
aggmfinalextra, "
-                                                 "'0' AS aggfinalmodify, '0' 
AS aggmfinalmodify, "
-                                                 "aggsortop, "
-                                                 "aggkind, "
-                                                 "aggtransspace, agginitval, "
-                                                 "aggmtransspace, aggminitval, 
"
-                                                 
"pg_catalog.pg_get_function_arguments(p.oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs, "
-                                                 "p.proparallel "
-                                                 "FROM pg_catalog.pg_aggregate 
a, pg_catalog.pg_proc p "
-                                                 "WHERE a.aggfnoid = p.oid "
-                                                 "AND p.oid = 
'%u'::pg_catalog.oid",
-                                                 
agginfo->aggfn.dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 90400)
-       {
-               appendPQExpBuffer(query, "SELECT aggtransfn, "
-                                                 "aggfinalfn, 
aggtranstype::pg_catalog.regtype, "
-                                                 "'-' AS aggcombinefn, '-' AS 
aggserialfn, "
-                                                 "'-' AS aggdeserialfn, 
aggmtransfn, aggminvtransfn, "
-                                                 "aggmfinalfn, 
aggmtranstype::pg_catalog.regtype, "
-                                                 "aggfinalextra, 
aggmfinalextra, "
-                                                 "'0' AS aggfinalmodify, '0' 
AS aggmfinalmodify, "
-                                                 "aggsortop, "
-                                                 "aggkind, "
-                                                 "aggtransspace, agginitval, "
-                                                 "aggmtransspace, aggminitval, 
"
-                                                 
"pg_catalog.pg_get_function_arguments(p.oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs "
-                                                 "FROM pg_catalog.pg_aggregate 
a, pg_catalog.pg_proc p "
-                                                 "WHERE a.aggfnoid = p.oid "
-                                                 "AND p.oid = 
'%u'::pg_catalog.oid",
-                                                 
agginfo->aggfn.dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 80400)
-       {
-               appendPQExpBuffer(query, "SELECT aggtransfn, "
-                                                 "aggfinalfn, 
aggtranstype::pg_catalog.regtype, "
-                                                 "'-' AS aggcombinefn, '-' AS 
aggserialfn, "
-                                                 "'-' AS aggdeserialfn, '-' AS 
aggmtransfn, "
-                                                 "'-' AS aggminvtransfn, '-' 
AS aggmfinalfn, "
-                                                 "0 AS aggmtranstype, false AS 
aggfinalextra, "
-                                                 "false AS aggmfinalextra, "
-                                                 "'0' AS aggfinalmodify, '0' 
AS aggmfinalmodify, "
-                                                 "aggsortop, "
-                                                 "'n' AS aggkind, "
-                                                 "0 AS aggtransspace, 
agginitval, "
-                                                 "0 AS aggmtransspace, NULL AS 
aggminitval, "
-                                                 
"pg_catalog.pg_get_function_arguments(p.oid) AS funcargs, "
-                                                 
"pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs "
-                                                 "FROM pg_catalog.pg_aggregate 
a, pg_catalog.pg_proc p "
-                                                 "WHERE a.aggfnoid = p.oid "
-                                                 "AND p.oid = 
'%u'::pg_catalog.oid",
-                                                 
agginfo->aggfn.dobj.catId.oid);
-       }
-       else if (fout->remoteVersion >= 80100)
-       {
-               appendPQExpBuffer(query, "SELECT aggtransfn, "
-                                                 "aggfinalfn, 
aggtranstype::pg_catalog.regtype, "
-                                                 "'-' AS aggcombinefn, '-' AS 
aggserialfn, "
-                                                 "'-' AS aggdeserialfn, '-' AS 
aggmtransfn, "
-                                                 "'-' AS aggminvtransfn, '-' 
AS aggmfinalfn, "
-                                                 "0 AS aggmtranstype, false AS 
aggfinalextra, "
-                                                 "false AS aggmfinalextra, "
-                                                 "'0' AS aggfinalmodify, '0' 
AS aggmfinalmodify, "
-                                                 "aggsortop, "
-                                                 "'n' AS aggkind, "
-                                                 "0 AS aggtransspace, 
agginitval, "
-                                                 "0 AS aggmtransspace, NULL AS 
aggminitval "
-                                                 "FROM pg_catalog.pg_aggregate 
a, pg_catalog.pg_proc p "
-                                                 "WHERE a.aggfnoid = p.oid "
-                                                 "AND p.oid = 
'%u'::pg_catalog.oid",
-                                                 
agginfo->aggfn.dobj.catId.oid);
-       }
+               appendPQExpBuffer(query,
+                                                 "aggfinalmodify,\n"
+                                                 "aggmfinalmodify,\n");
        else
-       {
-               appendPQExpBuffer(query, "SELECT aggtransfn, "
-                                                 "aggfinalfn, 
aggtranstype::pg_catalog.regtype, "
-                                                 "'-' AS aggcombinefn, '-' AS 
aggserialfn, "
-                                                 "'-' AS aggdeserialfn, '-' AS 
aggmtransfn, "
-                                                 "'-' AS aggminvtransfn, '-' 
AS aggmfinalfn, "
-                                                 "0 AS aggmtranstype, false AS 
aggfinalextra, "
-                                                 "false AS aggmfinalextra, "
-                                                 "'0' AS aggfinalmodify, '0' 
AS aggmfinalmodify, "
-                                                 "0 AS aggsortop, "
-                                                 "'n' AS aggkind, "
-                                                 "0 AS aggtransspace, 
agginitval, "
-                                                 "0 AS aggmtransspace, NULL AS 
aggminitval "
-                                                 "FROM pg_catalog.pg_aggregate 
a, pg_catalog.pg_proc p "
-                                                 "WHERE a.aggfnoid = p.oid "
-                                                 "AND p.oid = 
'%u'::pg_catalog.oid",
-                                                 
agginfo->aggfn.dobj.catId.oid);
-       }
+               appendPQExpBuffer(query,
+                                                 "'0' AS aggfinalmodify,\n"
+                                                 "'0' AS aggmfinalmodify,\n");
+
+       if (fout->remoteVersion >= 90600)
+               appendPQExpBuffer(query,
+                                                 "aggcombinefn,\n"
+                                                 "aggserialfn,\n"
+                                                 "aggdeserialfn,\n"
+                                                 "proparallel,\n");
+       else
+               appendPQExpBuffer(query,
+                                                 "'-' AS aggcombinefn,\n"
+                                                 "'-' AS aggserialfn,\n"
+                                                 "'-' AS aggdeserialfn,\n"
+                                                 "'u' AS proparallel,\n");
+
+       if (fout->remoteVersion >= 90400)
+               appendPQExpBuffer(query,
+                                                 "aggkind,\n"
+                                                 "aggmtransfn,\n"
+                                                 "aggminvtransfn,\n"
+                                                 "aggmfinalfn,\n"
+                                                 
"aggmtranstype::pg_catalog.regtype,\n"
+                                                 "aggfinalextra,\n"
+                                                 "aggmfinalextra,\n"
+                                                 "aggtransspace,\n"
+                                                 "aggmtransspace,\n"
+                                                 "aggminitval,\n");
+       else
+               appendPQExpBuffer(query,
+                                                 "'n' AS aggkind,\n"
+                                                 "'-' AS aggmtransfn,\n"
+                                                 "'-' AS aggminvtransfn,\n"
+                                                 "'-' AS aggmfinalfn,\n"
+                                                 "0 AS aggmtranstype,\n"
+                                                 "false AS aggfinalextra,\n"
+                                                 "false AS aggmfinalextra,\n"
+                                                 "0 AS aggtransspace,\n"
+                                                 "0 AS aggmtransspace,\n"
+                                                 "NULL AS aggminitval,\n");
+
+       if (fout->remoteVersion >= 80400)
+               appendPQExpBuffer(query,
+                                                 
"pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
+                                                 
"pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n");
+
+       if (fout->remoteVersion >= 80100)
+               appendPQExpBuffer(query,
+                                                 "aggsortop\n");
+       else
+               appendPQExpBuffer(query,
+                                                 "0 AS aggsortop\n");
+
+       appendPQExpBuffer(query,
+                                         "FROM pg_catalog.pg_aggregate a, 
pg_catalog.pg_proc p "
+                                         "WHERE a.aggfnoid = p.oid "
+                                         "AND p.oid = '%u'::pg_catalog.oid",
+                                         agginfo->aggfn.dobj.catId.oid);
 
        res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
-       i_aggtransfn = PQfnumber(res, "aggtransfn");
-       i_aggfinalfn = PQfnumber(res, "aggfinalfn");
-       i_aggcombinefn = PQfnumber(res, "aggcombinefn");
-       i_aggserialfn = PQfnumber(res, "aggserialfn");
-       i_aggdeserialfn = PQfnumber(res, "aggdeserialfn");
-       i_aggmtransfn = PQfnumber(res, "aggmtransfn");
-       i_aggminvtransfn = PQfnumber(res, "aggminvtransfn");
-       i_aggmfinalfn = PQfnumber(res, "aggmfinalfn");
-       i_aggfinalextra = PQfnumber(res, "aggfinalextra");
-       i_aggmfinalextra = PQfnumber(res, "aggmfinalextra");
-       i_aggfinalmodify = PQfnumber(res, "aggfinalmodify");
-       i_aggmfinalmodify = PQfnumber(res, "aggmfinalmodify");
-       i_aggsortop = PQfnumber(res, "aggsortop");
-       i_aggkind = PQfnumber(res, "aggkind");
-       i_aggtranstype = PQfnumber(res, "aggtranstype");
-       i_aggtransspace = PQfnumber(res, "aggtransspace");
-       i_aggmtranstype = PQfnumber(res, "aggmtranstype");
-       i_aggmtransspace = PQfnumber(res, "aggmtransspace");
        i_agginitval = PQfnumber(res, "agginitval");
        i_aggminitval = PQfnumber(res, "aggminitval");
-       i_proparallel = PQfnumber(res, "proparallel");
-
-       aggtransfn = PQgetvalue(res, 0, i_aggtransfn);
-       aggfinalfn = PQgetvalue(res, 0, i_aggfinalfn);
-       aggcombinefn = PQgetvalue(res, 0, i_aggcombinefn);
-       aggserialfn = PQgetvalue(res, 0, i_aggserialfn);
-       aggdeserialfn = PQgetvalue(res, 0, i_aggdeserialfn);
-       aggmtransfn = PQgetvalue(res, 0, i_aggmtransfn);
-       aggminvtransfn = PQgetvalue(res, 0, i_aggminvtransfn);
-       aggmfinalfn = PQgetvalue(res, 0, i_aggmfinalfn);
-       aggfinalextra = (PQgetvalue(res, 0, i_aggfinalextra)[0] == 't');
-       aggmfinalextra = (PQgetvalue(res, 0, i_aggmfinalextra)[0] == 't');
-       aggfinalmodify = PQgetvalue(res, 0, i_aggfinalmodify)[0];
-       aggmfinalmodify = PQgetvalue(res, 0, i_aggmfinalmodify)[0];
-       aggsortop = PQgetvalue(res, 0, i_aggsortop);
-       aggkind = PQgetvalue(res, 0, i_aggkind)[0];
-       aggtranstype = PQgetvalue(res, 0, i_aggtranstype);
-       aggtransspace = PQgetvalue(res, 0, i_aggtransspace);
-       aggmtranstype = PQgetvalue(res, 0, i_aggmtranstype);
-       aggmtransspace = PQgetvalue(res, 0, i_aggmtransspace);
+
+       aggtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggtransfn"));
+       aggfinalfn = PQgetvalue(res, 0, PQfnumber(res, "aggfinalfn"));
+       aggcombinefn = PQgetvalue(res, 0, PQfnumber(res, "aggcombinefn"));
+       aggserialfn = PQgetvalue(res, 0, PQfnumber(res, "aggserialfn"));
+       aggdeserialfn = PQgetvalue(res, 0, PQfnumber(res, "aggdeserialfn"));
+       aggmtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggmtransfn"));
+       aggminvtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggminvtransfn"));
+       aggmfinalfn = PQgetvalue(res, 0, PQfnumber(res, "aggmfinalfn"));
+       aggfinalextra = (PQgetvalue(res, 0, PQfnumber(res, "aggfinalextra"))[0] 
== 't');
+       aggmfinalextra = (PQgetvalue(res, 0, PQfnumber(res, 
"aggmfinalextra"))[0] == 't');
+       aggfinalmodify = PQgetvalue(res, 0, PQfnumber(res, 
"aggfinalmodify"))[0];
+       aggmfinalmodify = PQgetvalue(res, 0, PQfnumber(res, 
"aggmfinalmodify"))[0];
+       aggsortop = PQgetvalue(res, 0, PQfnumber(res, "aggsortop"));
+       aggkind = PQgetvalue(res, 0, PQfnumber(res, "aggkind"))[0];
+       aggtranstype = PQgetvalue(res, 0, PQfnumber(res, "aggtranstype"));
+       aggtransspace = PQgetvalue(res, 0, PQfnumber(res, "aggtransspace"));
+       aggmtranstype = PQgetvalue(res, 0, PQfnumber(res, "aggmtranstype"));
+       aggmtransspace = PQgetvalue(res, 0, PQfnumber(res, "aggmtransspace"));
        agginitval = PQgetvalue(res, 0, i_agginitval);
        aggminitval = PQgetvalue(res, 0, i_aggminitval);
+       proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
 
        if (fout->remoteVersion >= 80400)
        {
@@ -14176,11 +14003,6 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
 
        aggsig_tag = format_aggregate_signature(agginfo, fout, false);
 
-       if (i_proparallel != -1)
-               proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
-       else
-               proparallel = NULL;
-
        /* identify default modify flag for aggkind (must match 
DefineAggregate) */
        defaultfinalmodify = (aggkind == AGGKIND_NORMAL) ? AGGMODIFY_READ_ONLY 
: AGGMODIFY_READ_WRITE;
        /* replace omitted flags for old versions */
@@ -14299,7 +14121,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
        if (aggkind == AGGKIND_HYPOTHETICAL)
                appendPQExpBufferStr(details, ",\n    HYPOTHETICAL");
 
-       if (proparallel != NULL && proparallel[0] != PROPARALLEL_UNSAFE)
+       if (proparallel[0] != PROPARALLEL_UNSAFE)
        {
                if (proparallel[0] == PROPARALLEL_SAFE)
                        appendPQExpBufferStr(details, ",\n    PARALLEL = safe");
-- 
2.27.0

Reply via email to