mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
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. Reviewed-by: Fabien COELHO <coelho@cri.ensmp.fr> Discussion: https://www.postgresql.org/message-id/flat/6594334b-40fd-14f1-6bc5-877afa3feed5@2ndquadrant.com
This commit is contained in:
parent
1d09fb1f0a
commit
ed2c7f65bd
@ -11794,171 +11794,88 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
|||||||
asPart = createPQExpBuffer();
|
asPart = createPQExpBuffer();
|
||||||
|
|
||||||
/* Fetch function-specific details */
|
/* Fetch function-specific details */
|
||||||
if (fout->remoteVersion >= 120000)
|
appendPQExpBuffer(query,
|
||||||
{
|
"SELECT\n"
|
||||||
/*
|
"proretset,\n"
|
||||||
* prosupport was added in 12
|
"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 >= 80300)
|
||||||
appendPQExpBuffer(query,
|
appendPQExpBuffer(query,
|
||||||
"SELECT proretset, prosrc, probin, "
|
"proconfig,\n"
|
||||||
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
|
"procost,\n"
|
||||||
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
|
"prorows,\n");
|
||||||
"pg_catalog.pg_get_function_result(oid) AS funcresult, "
|
else
|
||||||
"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
|
|
||||||
*/
|
|
||||||
appendPQExpBuffer(query,
|
appendPQExpBuffer(query,
|
||||||
"SELECT proretset, prosrc, probin, "
|
"null AS proconfig,\n"
|
||||||
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
|
"0 AS procost,\n"
|
||||||
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
|
"0 AS prorows,\n");
|
||||||
"pg_catalog.pg_get_function_result(oid) AS funcresult, "
|
|
||||||
"array_to_string(protrftypes, ' ') AS protrftypes, "
|
if (fout->remoteVersion >= 80400)
|
||||||
"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
|
|
||||||
*/
|
|
||||||
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
|
|
||||||
*/
|
|
||||||
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
|
|
||||||
*/
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* In 8.4 and up we rely on pg_get_function_arguments and
|
* In 8.4 and up we rely on pg_get_function_arguments and
|
||||||
* pg_get_function_result instead of examining proallargtypes etc.
|
* pg_get_function_result instead of examining proallargtypes etc.
|
||||||
*/
|
*/
|
||||||
appendPQExpBuffer(query,
|
appendPQExpBuffer(query,
|
||||||
"SELECT proretset, prosrc, probin, "
|
"pg_catalog.pg_get_function_arguments(oid) AS funcargs,\n"
|
||||||
"pg_catalog.pg_get_function_arguments(oid) AS funcargs, "
|
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs,\n"
|
||||||
"pg_catalog.pg_get_function_identity_arguments(oid) AS funciargs, "
|
"pg_catalog.pg_get_function_result(oid) AS funcresult,\n");
|
||||||
"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);
|
|
||||||
}
|
}
|
||||||
else if (fout->remoteVersion >= 80100)
|
else if (fout->remoteVersion >= 80100)
|
||||||
{
|
|
||||||
appendPQExpBuffer(query,
|
appendPQExpBuffer(query,
|
||||||
"SELECT proretset, prosrc, probin, "
|
"proallargtypes,\n"
|
||||||
"proallargtypes, proargmodes, proargnames, "
|
"proargmodes,\n"
|
||||||
"'f' AS prokind, "
|
"proargnames,\n");
|
||||||
"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);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
appendPQExpBuffer(query,
|
appendPQExpBuffer(query,
|
||||||
"SELECT proretset, prosrc, probin, "
|
"null AS proallargtypes,\n"
|
||||||
"null AS proallargtypes, "
|
"null AS proargmodes,\n"
|
||||||
"null AS proargmodes, "
|
"proargnames,\n");
|
||||||
"proargnames, "
|
|
||||||
"'f' AS prokind, "
|
if (fout->remoteVersion >= 90200)
|
||||||
"provolatile, proisstrict, prosecdef, "
|
appendPQExpBuffer(query,
|
||||||
"false AS proleakproof, "
|
"proleakproof,\n");
|
||||||
"null AS proconfig, 0 AS procost, 0 AS prorows, "
|
else
|
||||||
"'-' AS prosupport, "
|
appendPQExpBuffer(query,
|
||||||
"(SELECT lanname FROM pg_catalog.pg_language WHERE oid = prolang) AS lanname "
|
"false AS proleakproof,\n");
|
||||||
"FROM pg_catalog.pg_proc "
|
|
||||||
"WHERE oid = '%u'::pg_catalog.oid",
|
if (fout->remoteVersion >= 90500)
|
||||||
finfo->dobj.catId.oid);
|
appendPQExpBuffer(query,
|
||||||
}
|
"array_to_string(protrftypes, ' ') AS protrftypes,\n");
|
||||||
|
|
||||||
|
if (fout->remoteVersion >= 90600)
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"proparallel,\n");
|
||||||
|
else
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"'u' AS proparallel,\n");
|
||||||
|
|
||||||
|
if (fout->remoteVersion >= 110000)
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"prokind,\n");
|
||||||
|
else if (fout->remoteVersion >= 80400)
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"CASE WHEN proiswindow THEN 'w' ELSE 'f' END AS prokind,\n");
|
||||||
|
else
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"'f' AS prokind,\n");
|
||||||
|
|
||||||
|
if (fout->remoteVersion >= 120000)
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"prosupport\n");
|
||||||
|
else
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"'-' AS prosupport\n");
|
||||||
|
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"FROM pg_catalog.pg_proc "
|
||||||
|
"WHERE oid = '%u'::pg_catalog.oid",
|
||||||
|
finfo->dobj.catId.oid);
|
||||||
|
|
||||||
res = ExecuteSqlQueryForSingleRow(fout, query->data);
|
res = ExecuteSqlQueryForSingleRow(fout, query->data);
|
||||||
|
|
||||||
@ -11992,12 +11909,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
|||||||
procost = PQgetvalue(res, 0, PQfnumber(res, "procost"));
|
procost = PQgetvalue(res, 0, PQfnumber(res, "procost"));
|
||||||
prorows = PQgetvalue(res, 0, PQfnumber(res, "prorows"));
|
prorows = PQgetvalue(res, 0, PQfnumber(res, "prorows"));
|
||||||
prosupport = PQgetvalue(res, 0, PQfnumber(res, "prosupport"));
|
prosupport = PQgetvalue(res, 0, PQfnumber(res, "prosupport"));
|
||||||
|
proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
|
||||||
if (PQfnumber(res, "proparallel") != -1)
|
|
||||||
proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
|
|
||||||
else
|
|
||||||
proparallel = NULL;
|
|
||||||
|
|
||||||
lanname = PQgetvalue(res, 0, PQfnumber(res, "lanname"));
|
lanname = PQgetvalue(res, 0, PQfnumber(res, "lanname"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -12211,7 +12123,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
|
|||||||
appendPQExpBuffer(q, " SUPPORT %s", prosupport);
|
appendPQExpBuffer(q, " SUPPORT %s", prosupport);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proparallel != NULL && proparallel[0] != PROPARALLEL_UNSAFE)
|
if (proparallel[0] != PROPARALLEL_UNSAFE)
|
||||||
{
|
{
|
||||||
if (proparallel[0] == PROPARALLEL_SAFE)
|
if (proparallel[0] == PROPARALLEL_SAFE)
|
||||||
appendPQExpBufferStr(q, " PARALLEL SAFE");
|
appendPQExpBufferStr(q, " PARALLEL SAFE");
|
||||||
@ -13886,27 +13798,8 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
|
|||||||
char *aggfullsig = NULL; /* full signature */
|
char *aggfullsig = NULL; /* full signature */
|
||||||
char *aggsig_tag;
|
char *aggsig_tag;
|
||||||
PGresult *res;
|
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_agginitval;
|
||||||
int i_aggminitval;
|
int i_aggminitval;
|
||||||
int i_proparallel;
|
|
||||||
const char *aggtransfn;
|
const char *aggtransfn;
|
||||||
const char *aggfinalfn;
|
const char *aggfinalfn;
|
||||||
const char *aggcombinefn;
|
const char *aggcombinefn;
|
||||||
@ -13941,170 +13834,104 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
|
|||||||
details = createPQExpBuffer();
|
details = createPQExpBuffer();
|
||||||
|
|
||||||
/* Get aggregate-specific details */
|
/* Get aggregate-specific details */
|
||||||
if (fout->remoteVersion >= 110000)
|
appendPQExpBuffer(query,
|
||||||
{
|
"SELECT\n"
|
||||||
appendPQExpBuffer(query, "SELECT aggtransfn, "
|
"aggtransfn,\n"
|
||||||
"aggfinalfn, aggtranstype::pg_catalog.regtype, "
|
"aggfinalfn,\n"
|
||||||
"aggcombinefn, aggserialfn, aggdeserialfn, aggmtransfn, "
|
"aggtranstype::pg_catalog.regtype,\n"
|
||||||
"aggminvtransfn, aggmfinalfn, aggmtranstype::pg_catalog.regtype, "
|
"agginitval,\n");
|
||||||
"aggfinalextra, aggmfinalextra, "
|
|
||||||
"aggfinalmodify, aggmfinalmodify, "
|
if (fout->remoteVersion >= 80100)
|
||||||
"aggsortop, "
|
appendPQExpBuffer(query,
|
||||||
"aggkind, "
|
"aggsortop,\n");
|
||||||
"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);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
appendPQExpBuffer(query,
|
||||||
appendPQExpBuffer(query, "SELECT aggtransfn, "
|
"0 AS aggsortop,\n");
|
||||||
"aggfinalfn, aggtranstype::pg_catalog.regtype, "
|
|
||||||
"'-' AS aggcombinefn, '-' AS aggserialfn, "
|
if (fout->remoteVersion >= 80400)
|
||||||
"'-' AS aggdeserialfn, '-' AS aggmtransfn, "
|
appendPQExpBuffer(query,
|
||||||
"'-' AS aggminvtransfn, '-' AS aggmfinalfn, "
|
"pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
|
||||||
"0 AS aggmtranstype, false AS aggfinalextra, "
|
"pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n");
|
||||||
"false AS aggmfinalextra, "
|
|
||||||
"'0' AS aggfinalmodify, '0' AS aggmfinalmodify, "
|
if (fout->remoteVersion >= 90400)
|
||||||
"0 AS aggsortop, "
|
appendPQExpBuffer(query,
|
||||||
"'n' AS aggkind, "
|
"aggkind,\n"
|
||||||
"0 AS aggtransspace, agginitval, "
|
"aggmtransfn,\n"
|
||||||
"0 AS aggmtransspace, NULL AS aggminitval "
|
"aggminvtransfn,\n"
|
||||||
"FROM pg_catalog.pg_aggregate a, pg_catalog.pg_proc p "
|
"aggmfinalfn,\n"
|
||||||
"WHERE a.aggfnoid = p.oid "
|
"aggmtranstype::pg_catalog.regtype,\n"
|
||||||
"AND p.oid = '%u'::pg_catalog.oid",
|
"aggfinalextra,\n"
|
||||||
agginfo->aggfn.dobj.catId.oid);
|
"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 >= 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 >= 110000)
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"aggfinalmodify,\n"
|
||||||
|
"aggmfinalmodify\n");
|
||||||
|
else
|
||||||
|
appendPQExpBuffer(query,
|
||||||
|
"'0' AS aggfinalmodify,\n"
|
||||||
|
"'0' AS aggmfinalmodify\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);
|
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_agginitval = PQfnumber(res, "agginitval");
|
||||||
i_aggminitval = PQfnumber(res, "aggminitval");
|
i_aggminitval = PQfnumber(res, "aggminitval");
|
||||||
i_proparallel = PQfnumber(res, "proparallel");
|
|
||||||
|
|
||||||
aggtransfn = PQgetvalue(res, 0, i_aggtransfn);
|
aggtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggtransfn"));
|
||||||
aggfinalfn = PQgetvalue(res, 0, i_aggfinalfn);
|
aggfinalfn = PQgetvalue(res, 0, PQfnumber(res, "aggfinalfn"));
|
||||||
aggcombinefn = PQgetvalue(res, 0, i_aggcombinefn);
|
aggcombinefn = PQgetvalue(res, 0, PQfnumber(res, "aggcombinefn"));
|
||||||
aggserialfn = PQgetvalue(res, 0, i_aggserialfn);
|
aggserialfn = PQgetvalue(res, 0, PQfnumber(res, "aggserialfn"));
|
||||||
aggdeserialfn = PQgetvalue(res, 0, i_aggdeserialfn);
|
aggdeserialfn = PQgetvalue(res, 0, PQfnumber(res, "aggdeserialfn"));
|
||||||
aggmtransfn = PQgetvalue(res, 0, i_aggmtransfn);
|
aggmtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggmtransfn"));
|
||||||
aggminvtransfn = PQgetvalue(res, 0, i_aggminvtransfn);
|
aggminvtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggminvtransfn"));
|
||||||
aggmfinalfn = PQgetvalue(res, 0, i_aggmfinalfn);
|
aggmfinalfn = PQgetvalue(res, 0, PQfnumber(res, "aggmfinalfn"));
|
||||||
aggfinalextra = (PQgetvalue(res, 0, i_aggfinalextra)[0] == 't');
|
aggfinalextra = (PQgetvalue(res, 0, PQfnumber(res, "aggfinalextra"))[0] == 't');
|
||||||
aggmfinalextra = (PQgetvalue(res, 0, i_aggmfinalextra)[0] == 't');
|
aggmfinalextra = (PQgetvalue(res, 0, PQfnumber(res, "aggmfinalextra"))[0] == 't');
|
||||||
aggfinalmodify = PQgetvalue(res, 0, i_aggfinalmodify)[0];
|
aggfinalmodify = PQgetvalue(res, 0, PQfnumber(res, "aggfinalmodify"))[0];
|
||||||
aggmfinalmodify = PQgetvalue(res, 0, i_aggmfinalmodify)[0];
|
aggmfinalmodify = PQgetvalue(res, 0, PQfnumber(res, "aggmfinalmodify"))[0];
|
||||||
aggsortop = PQgetvalue(res, 0, i_aggsortop);
|
aggsortop = PQgetvalue(res, 0, PQfnumber(res, "aggsortop"));
|
||||||
aggkind = PQgetvalue(res, 0, i_aggkind)[0];
|
aggkind = PQgetvalue(res, 0, PQfnumber(res, "aggkind"))[0];
|
||||||
aggtranstype = PQgetvalue(res, 0, i_aggtranstype);
|
aggtranstype = PQgetvalue(res, 0, PQfnumber(res, "aggtranstype"));
|
||||||
aggtransspace = PQgetvalue(res, 0, i_aggtransspace);
|
aggtransspace = PQgetvalue(res, 0, PQfnumber(res, "aggtransspace"));
|
||||||
aggmtranstype = PQgetvalue(res, 0, i_aggmtranstype);
|
aggmtranstype = PQgetvalue(res, 0, PQfnumber(res, "aggmtranstype"));
|
||||||
aggmtransspace = PQgetvalue(res, 0, i_aggmtransspace);
|
aggmtransspace = PQgetvalue(res, 0, PQfnumber(res, "aggmtransspace"));
|
||||||
agginitval = PQgetvalue(res, 0, i_agginitval);
|
agginitval = PQgetvalue(res, 0, i_agginitval);
|
||||||
aggminitval = PQgetvalue(res, 0, i_aggminitval);
|
aggminitval = PQgetvalue(res, 0, i_aggminitval);
|
||||||
|
proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
|
||||||
|
|
||||||
if (fout->remoteVersion >= 80400)
|
if (fout->remoteVersion >= 80400)
|
||||||
{
|
{
|
||||||
@ -14123,11 +13950,6 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
|
|||||||
|
|
||||||
aggsig_tag = format_aggregate_signature(agginfo, fout, false);
|
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) */
|
/* identify default modify flag for aggkind (must match DefineAggregate) */
|
||||||
defaultfinalmodify = (aggkind == AGGKIND_NORMAL) ? AGGMODIFY_READ_ONLY : AGGMODIFY_READ_WRITE;
|
defaultfinalmodify = (aggkind == AGGKIND_NORMAL) ? AGGMODIFY_READ_ONLY : AGGMODIFY_READ_WRITE;
|
||||||
/* replace omitted flags for old versions */
|
/* replace omitted flags for old versions */
|
||||||
@ -14246,7 +14068,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
|
|||||||
if (aggkind == AGGKIND_HYPOTHETICAL)
|
if (aggkind == AGGKIND_HYPOTHETICAL)
|
||||||
appendPQExpBufferStr(details, ",\n HYPOTHETICAL");
|
appendPQExpBufferStr(details, ",\n HYPOTHETICAL");
|
||||||
|
|
||||||
if (proparallel != NULL && proparallel[0] != PROPARALLEL_UNSAFE)
|
if (proparallel[0] != PROPARALLEL_UNSAFE)
|
||||||
{
|
{
|
||||||
if (proparallel[0] == PROPARALLEL_SAFE)
|
if (proparallel[0] == PROPARALLEL_SAFE)
|
||||||
appendPQExpBufferStr(details, ",\n PARALLEL = safe");
|
appendPQExpBufferStr(details, ",\n PARALLEL = safe");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user