* by PostgreSQL
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.413 2005/07/02 17:01:51 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.414 2005/07/10 14:26:29 momjian Exp $
*
*-------------------------------------------------------------------------
*/
int i_proargtypes;
int i_prorettype;
int i_proacl;
+ int i_is_pl_handler;
/* Make sure we are in proper schema */
selectSourceSchema("pg_catalog");
if (g_fout->remoteVersion >= 70300)
{
+ /*
+ * We now collect info on pg_catalog resident functions, but
+ * only if they are language call handlers or validators, and
+ * only for non-default languages (i.e. not internal/C/SQL).
+ */
appendPQExpBuffer(query,
"SELECT tableoid, oid, proname, prolang, "
"pronargs, proargtypes, prorettype, proacl, "
"pronamespace, "
- "(select usename from pg_user where proowner = usesysid) as usename "
+ "(select usename from pg_user "
+ " where proowner = usesysid) as usename, "
+ "CASE WHEN oid IN "
+ " (select lanplcallfoid from pg_language "
+ " where lanplcallfoid != 0) THEN true "
+ " WHEN oid IN "
+ " (select lanvalidator from pg_language "
+ " where lanplcallfoid != 0) THEN true "
+ " ELSE false END AS is_pl_handler "
"FROM pg_proc "
"WHERE NOT proisagg "
- "AND pronamespace != "
- "(select oid from pg_namespace where nspname = 'pg_catalog')");
+ "AND (pronamespace != "
+ " (select oid from pg_namespace "
+ " where nspname = 'pg_catalog')"
+ " OR oid IN "
+ " (select lanplcallfoid from pg_language "
+ " where lanplcallfoid != 0) "
+ " OR oid IN "
+ " (select lanvalidator from pg_language "
+ " where lanplcallfoid != 0))"
+ );
}
else if (g_fout->remoteVersion >= 70100)
{
"pronargs, proargtypes, prorettype, "
"'{=X}' as proacl, "
"0::oid as pronamespace, "
- "(select usename from pg_user where proowner = usesysid) as usename "
+ "(select usename from pg_user "
+ " where proowner = usesysid) as usename, "
+ "false AS is_pl_handler "
"FROM pg_proc "
"where pg_proc.oid > '%u'::oid",
g_last_builtin_oid);
{
appendPQExpBuffer(query,
"SELECT "
- "(SELECT oid FROM pg_class WHERE relname = 'pg_proc') AS tableoid, "
+ "(SELECT oid FROM pg_class "
+ " WHERE relname = 'pg_proc') AS tableoid, "
"oid, proname, prolang, "
"pronargs, proargtypes, prorettype, "
"'{=X}' as proacl, "
"0::oid as pronamespace, "
- "(select usename from pg_user where proowner = usesysid) as usename "
+ "(select usename from pg_user "
+ " where proowner = usesysid) as usename, "
+ "false AS is_pl_handler "
"FROM pg_proc "
"where pg_proc.oid > '%u'::oid",
g_last_builtin_oid);
i_proargtypes = PQfnumber(res, "proargtypes");
i_prorettype = PQfnumber(res, "prorettype");
i_proacl = PQfnumber(res, "proacl");
+ i_is_pl_handler = PQfnumber(res,"is_pl_handler");
for (i = 0; i < ntups; i++)
{
finfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
AssignDumpId(&finfo[i].dobj);
finfo[i].dobj.name = strdup(PQgetvalue(res, i, i_proname));
- finfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_pronamespace)),
+ finfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_pronamespace)),
finfo[i].dobj.catId.oid);
finfo[i].usename = strdup(PQgetvalue(res, i, i_usename));
finfo[i].lang = atooid(PQgetvalue(res, i, i_prolang));
finfo[i].prorettype = atooid(PQgetvalue(res, i, i_prorettype));
finfo[i].proacl = strdup(PQgetvalue(res, i, i_proacl));
finfo[i].nargs = atoi(PQgetvalue(res, i, i_pronargs));
+ finfo[i].isProlangFunc =
+ strcmp(PQgetvalue(res, i, i_is_pl_handler), "t") == 0;
if (finfo[i].nargs == 0)
finfo[i].argtypes = NULL;
else
}
if (strlen(finfo[i].usename) == 0)
- write_msg(NULL, "WARNING: owner of function \"%s\" appears to be invalid\n",
+ write_msg(NULL,
+ "WARNING: owner of function \"%s\" appears to be invalid\n",
finfo[i].dobj.name);
}
return;
/*
- * Current theory is to dump PLs iff their underlying functions will
- * be dumped (are in a dumpable namespace, or have a non-system OID in
- * pre-7.3 databases). Actually, we treat the PL itself as being in
+ * We dump PLs iff their underlying call handler functions have been
+ * marked as language functions (or have a non-system OID in
+ * pre-7.3 databases). We treat the PL itself as being in
* the underlying function's namespace, though it isn't really. This
* avoids searchpath problems for the HANDLER clause.
*
- * If the underlying function is in the pg_catalog namespace, we won't
- * have loaded it into finfo[] at all; therefore, treat failure to
- * find it in finfo[] as indicating we shouldn't dump it, not as an
- * error condition. Ditto for the validator.
*/
funcInfo = findFuncByOid(plang->lanplcallfoid);
if (funcInfo == NULL)
return;
- if (!funcInfo->dobj.namespace->dump)
+ if (!funcInfo->isProlangFunc && !funcInfo->dobj.namespace->dump)
return;
if (OidIsValid(plang->lanvalidator))
char **argmodes = NULL;
char **argnames = NULL;
- /* Dump only funcs in dumpable namespaces */
- if (!finfo->dobj.namespace->dump || dataOnly)
+ /* Dump only funcs in dumpable namespaces, or needed language handlers */
+ if ((!finfo->isProlangFunc && !finfo->dobj.namespace->dump) || dataOnly)
return;
+
query = createPQExpBuffer();
q = createPQExpBuffer();
delqry = createPQExpBuffer();
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.h,v 1.116 2005/06/30 03:03:02 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.h,v 1.117 2005/07/10 14:26:29 momjian Exp $
*
*-------------------------------------------------------------------------
*/
Oid *argtypes;
Oid prorettype;
char *proacl;
+ bool isProlangFunc;
} FuncInfo;
/* AggInfo is a superset of FuncInfo */
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/bin/scripts/createlang.c,v 1.17 2005/06/22 16:45:50 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/scripts/createlang.c,v 1.18 2005/07/10 14:26:30 momjian Exp $
*
*-------------------------------------------------------------------------
*/
conn = connectDatabase(dbname, host, port, username, password, progname);
- printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", (CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" FROM pg_language WHERE lanispl IS TRUE;", _("Name"), _("yes"), _("no"), _("Trusted?"));
+ printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", (CASE WHEN lanpltrusted "
+ "THEN '%s' ELSE '%s' END) as \"%s\" FROM pg_language "
+ "WHERE lanispl IS TRUE;",
+ _("Name"), _("yes"), _("no"), _("Trusted?"));
result = executeQuery(conn, sql.data, progname, echo);
memset(&popt, 0, sizeof(popt));
}
else
{
- fprintf(stderr, _("%s: unsupported language \"%s\"\n"), progname, langname);
- fprintf(stderr, _("Supported languages are plpgsql, pltcl, pltclu, plperl, plperlu, and plpythonu.\n"));
+ fprintf(stderr, _("%s: unsupported language \"%s\"\n"),
+ progname, langname);
+ fprintf(stderr, _("Supported languages are plpgsql, pltcl, pltclu, "
+ "plperl, plperlu, and plpythonu.\n"));
exit(1);
}
/*
* Make sure the language isn't already installed
*/
- printfPQExpBuffer(&sql, "SELECT oid FROM pg_language WHERE lanname = '%s';", langname);
+ printfPQExpBuffer(&sql,
+ "SELECT oid FROM pg_language WHERE lanname = '%s';",
+ langname);
result = executeQuery(conn, sql.data, progname, echo);
if (PQntuples(result) > 0)
{
PQfinish(conn);
fprintf(stderr,
- _("%s: language \"%s\" is already installed in database \"%s\"\n"),
+ _("%s: language \"%s\" is already installed in "
+ "database \"%s\"\n"),
progname, langname, dbname);
/* separate exit status for "already installed" */
exit(2);
/*
* Check whether the call handler exists
*/
- printfPQExpBuffer(&sql, "SELECT oid FROM pg_proc WHERE proname = '%s' AND prorettype = 'pg_catalog.language_handler'::regtype AND pronargs = 0;", handler);
+ printfPQExpBuffer(&sql, "SELECT oid FROM pg_proc WHERE proname = '%s' "
+ "AND prorettype = 'pg_catalog.language_handler'::regtype "
+ "AND pronargs = 0;", handler);
result = executeQuery(conn, sql.data, progname, echo);
handlerexists = (PQntuples(result) > 0);
PQclear(result);
*/
if (validator)
{
- printfPQExpBuffer(&sql, "SELECT oid FROM pg_proc WHERE proname = '%s' AND proargtypes[0] = 'pg_catalog.oid'::regtype AND pronargs = 1;", validator);
+ printfPQExpBuffer(&sql, "SELECT oid FROM pg_proc WHERE proname = '%s'"
+ " AND proargtypes[0] = 'pg_catalog.oid'::regtype "
+ " AND pronargs = 1;", validator);
result = executeQuery(conn, sql.data, progname, echo);
validatorexists = (PQntuples(result) > 0);
PQclear(result);
if (!handlerexists)
appendPQExpBuffer(&sql,
- "CREATE FUNCTION \"%s\" () RETURNS language_handler AS '%s/%s' LANGUAGE C;\n",
+ "CREATE FUNCTION pg_catalog.\"%s\" () RETURNS "
+ "language_handler AS '%s/%s' LANGUAGE C;\n",
handler, pglib, object);
if (!validatorexists)
appendPQExpBuffer(&sql,
- "CREATE FUNCTION \"%s\" (oid) RETURNS void AS '%s/%s' LANGUAGE C;\n",
+ "CREATE FUNCTION pg_catalog.\"%s\" (oid) RETURNS "
+ "void AS '%s/%s' LANGUAGE C;\n",
validator, pglib, object);
appendPQExpBuffer(&sql,
- "CREATE %sLANGUAGE \"%s\" HANDLER \"%s\"",
+ "CREATE %sLANGUAGE \"%s\" HANDLER pg_catalog.\"%s\"",
(trusted ? "TRUSTED " : ""), langname, handler);
if (validator)
- appendPQExpBuffer(&sql, " VALIDATOR \"%s\"", validator);
+ appendPQExpBuffer(&sql, " VALIDATOR pg_catalog.\"%s\"", validator);
appendPQExpBuffer(&sql, ";\n");
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/bin/scripts/droplang.c,v 1.15 2005/06/14 02:57:45 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/scripts/droplang.c,v 1.16 2005/07/10 14:26:30 momjian Exp $
*
*-------------------------------------------------------------------------
*/
Oid lanvalidator;
char *handler;
char *validator;
+ char *handler_ns;
+ char *validator_ns;
bool keephandler;
bool keepvalidator;
{
printQueryOpt popt;
- conn = connectDatabase(dbname, host, port, username, password, progname);
+ conn = connectDatabase(dbname, host, port, username, password,
+ progname);
- printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", (CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" FROM pg_language WHERE lanispl IS TRUE;", _("Name"), _("yes"), _("no"), _("Trusted?"));
+ printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", (CASE "
+ "WHEN lanpltrusted THEN '%s' ELSE '%s' END) "
+ "as \"%s\" FROM pg_language WHERE lanispl IS TRUE;",
+ _("Name"), _("yes"), _("no"), _("Trusted?"));
result = executeQuery(conn, sql.data, progname, echo);
memset(&popt, 0, sizeof(popt));
if (langname == NULL)
{
- fprintf(stderr, _("%s: missing required argument language name\n"), progname);
- fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+ fprintf(stderr, _("%s: missing required argument language name\n"),
+ progname);
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ progname);
exit(1);
}
* Make sure the language is installed and find the OIDs of the
* handler and validator functions
*/
- printfPQExpBuffer(&sql, "SELECT lanplcallfoid, lanvalidator FROM pg_language WHERE lanname = '%s' AND lanispl;", langname);
+ printfPQExpBuffer(&sql, "SELECT lanplcallfoid, lanvalidator "
+ "FROM pg_language WHERE lanname = '%s' AND lanispl;",
+ langname);
result = executeQuery(conn, sql.data, progname, echo);
if (PQntuples(result) == 0)
{
PQfinish(conn);
- fprintf(stderr, _("%s: language \"%s\" is not installed in database \"%s\"\n"),
+ fprintf(stderr, _("%s: language \"%s\" is not installed in "
+ "database \"%s\"\n"),
progname, langname, dbname);
exit(1);
}
/*
* Check that there are no functions left defined in that language
*/
- printfPQExpBuffer(&sql, "SELECT count(proname) FROM pg_proc P, pg_language L WHERE P.prolang = L.oid AND L.lanname = '%s';", langname);
+ printfPQExpBuffer(&sql, "SELECT count(proname) FROM pg_proc P, "
+ "pg_language L WHERE P.prolang = L.oid "
+ "AND L.lanname = '%s';", langname);
result = executeQuery(conn, sql.data, progname, echo);
if (strcmp(PQgetvalue(result, 0, 0), "0") != 0)
{
PQfinish(conn);
fprintf(stderr,
- _("%s: still %s functions declared in language \"%s\"; language not removed\n"),
+ _("%s: still %s functions declared in language \"%s\"; "
+ "language not removed\n"),
progname, PQgetvalue(result, 0, 0), langname);
exit(1);
}
/*
* Check that the handler function isn't used by some other language
*/
- printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language WHERE lanplcallfoid = %u AND lanname <> '%s';", lanplcallfoid, langname);
+ printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language "
+ "WHERE lanplcallfoid = %u AND lanname <> '%s';",
+ lanplcallfoid, langname);
result = executeQuery(conn, sql.data, progname, echo);
if (strcmp(PQgetvalue(result, 0, 0), "0") == 0)
keephandler = false;
*/
if (!keephandler)
{
- printfPQExpBuffer(&sql, "SELECT proname FROM pg_proc WHERE oid = %u;", lanplcallfoid);
+ printfPQExpBuffer(&sql, "SELECT proname, (SELECT nspname "
+ "FROM pg_namespace ns WHERE ns.oid = pronamespace) "
+ "AS prons FROM pg_proc WHERE oid = %u;",
+ lanplcallfoid);
result = executeQuery(conn, sql.data, progname, echo);
handler = strdup(PQgetvalue(result, 0, 0));
+ handler_ns = strdup(PQgetvalue(result, 0, 1));
PQclear(result);
}
else
+ {
handler = NULL;
+ handler_ns = NULL;
+ }
/*
* Check that the validator function isn't used by some other language
*/
if (OidIsValid(lanvalidator))
{
- printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language WHERE lanvalidator = %u AND lanname <> '%s';", lanvalidator, langname);
+ printfPQExpBuffer(&sql, "SELECT count(*) FROM pg_language WHERE "
+ "lanvalidator = %u AND lanname <> '%s';",
+ lanvalidator, langname);
result = executeQuery(conn, sql.data, progname, echo);
if (strcmp(PQgetvalue(result, 0, 0), "0") == 0)
keepvalidator = false;
*/
if (!keepvalidator)
{
- printfPQExpBuffer(&sql, "SELECT proname FROM pg_proc WHERE oid = %u;", lanvalidator);
+ printfPQExpBuffer(&sql, "SELECT proname, (SELECT nspname "
+ "FROM pg_namespace ns WHERE ns.oid = pronamespace) "
+ "AS prons FROM pg_proc WHERE oid = %u;",
+ lanvalidator);
result = executeQuery(conn, sql.data, progname, echo);
validator = strdup(PQgetvalue(result, 0, 0));
+ validator_ns = strdup(PQgetvalue(result, 0, 1));
PQclear(result);
}
else
+ {
validator = NULL;
+ validator_ns = NULL;
+ }
/*
* Drop the language and the functions
*/
printfPQExpBuffer(&sql, "DROP LANGUAGE \"%s\";\n", langname);
if (!keephandler)
- appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\" ();\n", handler);
+ appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\".\"%s\" ();\n",
+ handler_ns, handler);
if (!keepvalidator)
- appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\" (oid);\n", validator);
+ appendPQExpBuffer(&sql, "DROP FUNCTION \"%s\".\"%s\" (oid);\n",
+ validator_ns, validator);
if (echo)
printf("%s", sql.data);
result = PQexec(conn, sql.data);