aboutsummaryrefslogtreecommitdiff
path: root/src/bin/pg_dump/pg_dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_dump/pg_dump.c')
-rw-r--r--src/bin/pg_dump/pg_dump.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 5e1d3ecd0dc..2e0295fc844 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -22,7 +22,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.263 2002/05/19 10:08:25 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.264 2002/05/22 17:21:00 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -3108,6 +3108,7 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
int i_lanname;
int i_lanpltrusted;
int i_lanplcallfoid;
+ int i_lanvalidator = -1;
int i_lancompiler;
int i_lanacl = -1;
char *lanoid;
@@ -3115,10 +3116,12 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
char *lancompiler;
char *lanacl;
const char *lanplcallfoid;
+ const char *lanvalidator;
const char *((*deps)[]);
int depIdx;
int i,
- fidx;
+ fidx,
+ vidx = -1;
/* Make sure we are in proper schema */
selectSourceSchema("pg_catalog");
@@ -3142,7 +3145,10 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
i_lancompiler = PQfnumber(res, "lancompiler");
i_oid = PQfnumber(res, "oid");
if (fout->remoteVersion >= 70300)
+ {
+ i_lanvalidator = PQfnumber(res, "lanvalidator");
i_lanacl = PQfnumber(res, "lanacl");
+ }
for (i = 0; i < ntups; i++)
{
@@ -3151,9 +3157,15 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
lanname = PQgetvalue(res, i, i_lanname);
lancompiler = PQgetvalue(res, i, i_lancompiler);
if (fout->remoteVersion >= 70300)
+ {
+ lanvalidator = PQgetvalue(res, i, i_lanvalidator);
lanacl = PQgetvalue(res, i, i_lanacl);
+ }
else
- lanacl = "{=U}";
+ {
+ lanvalidator = "0";
+ lanacl = "{=U}";
+ }
fidx = findFuncByOid(finfo, numFuncs, lanplcallfoid);
if (fidx < 0)
@@ -3163,6 +3175,17 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
exit_nicely();
}
+ if (strcmp(lanvalidator, "0") != 0)
+ {
+ vidx = findFuncByOid(finfo, numFuncs, lanvalidator);
+ if (vidx < 0)
+ {
+ write_msg(NULL, "validator procedure for procedural language %s not found\n",
+ lanname);
+ exit_nicely();
+ }
+ }
+
/*
* Current theory is to dump PLs iff their underlying functions
* will be dumped (are in a dumpable namespace, or have a non-system
@@ -3178,7 +3201,7 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
resetPQExpBuffer(delqry);
/* Make a dependency to ensure function is dumped first */
- deps = malloc(sizeof(char *) * 2);
+ deps = malloc(sizeof(char *) * (2 + (strcmp(lanvalidator, "0")!=0) ? 1 : 0));
depIdx = 0;
(*deps)[depIdx++] = strdup(lanplcallfoid);
@@ -3189,8 +3212,15 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs)
(PQgetvalue(res, i, i_lanpltrusted)[0] == 't') ?
"TRUSTED " : "",
fmtId(lanname, force_quotes));
- appendPQExpBuffer(defqry, " HANDLER %s;\n",
+ appendPQExpBuffer(defqry, " HANDLER %s",
fmtId(finfo[fidx].proname, force_quotes));
+ if (strcmp(lanvalidator, "0")!=0)
+ {
+ appendPQExpBuffer(defqry, " VALIDATOR %s",
+ fmtId(finfo[vidx].proname, force_quotes));
+ (*deps)[depIdx++] = strdup(lanvalidator);
+ }
+ appendPQExpBuffer(defqry, ";\n");
(*deps)[depIdx++] = NULL; /* End of List */