diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-08-15 21:02:26 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-08-15 21:02:26 +0000 |
commit | 9a9328003d65f2b5f1a9598ea423db37952976ca (patch) | |
tree | 2ef0e0c10d89fd8be56e2cccb489bf548ef54633 /src/bin/scripts/createlang.c | |
parent | 866ffc2fe35f63b06fb6ed63ef1f531a741d920e (diff) | |
download | postgresql-9a9328003d65f2b5f1a9598ea423db37952976ca.tar.gz postgresql-9a9328003d65f2b5f1a9598ea423db37952976ca.zip |
Make createlang and droplang proof against weird search_path settings
by forcing search_path to be just pg_catalog.
Diffstat (limited to 'src/bin/scripts/createlang.c')
-rw-r--r-- | src/bin/scripts/createlang.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c index 78a46ed4a17..082f348f968 100644 --- a/src/bin/scripts/createlang.c +++ b/src/bin/scripts/createlang.c @@ -5,7 +5,7 @@ * 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.18 2005/07/10 14:26:30 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/scripts/createlang.c,v 1.19 2005/08/15 21:02:26 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -138,11 +138,12 @@ main(int argc, char *argv[]) { 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;", + printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " + "(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" " + "FROM pg_catalog.pg_language WHERE lanispl;", _("Name"), _("yes"), _("no"), _("Trusted?")); result = executeQuery(conn, sql.data, progname, echo); @@ -222,6 +223,13 @@ main(int argc, char *argv[]) conn = connectDatabase(dbname, host, port, username, password, progname); /* + * Force schema search path to be just pg_catalog, so that we don't + * have to be paranoid about search paths below. + */ + executeCommand(conn, "SET search_path = pg_catalog;", + progname, echo); + + /* * Make sure the language isn't already installed */ printfPQExpBuffer(&sql, @@ -232,8 +240,7 @@ main(int argc, char *argv[]) { 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); @@ -244,7 +251,8 @@ main(int argc, char *argv[]) * Check whether the call handler exists */ printfPQExpBuffer(&sql, "SELECT oid FROM pg_proc WHERE proname = '%s' " - "AND prorettype = 'pg_catalog.language_handler'::regtype " + "AND pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog') " + "AND prorettype = 'language_handler'::regtype " "AND pronargs = 0;", handler); result = executeQuery(conn, sql.data, progname, echo); handlerexists = (PQntuples(result) > 0); @@ -255,9 +263,10 @@ main(int argc, char *argv[]) */ 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 pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog') " + "AND proargtypes[0] = 'oid'::regtype " + "AND pronargs = 1;", validator); result = executeQuery(conn, sql.data, progname, echo); validatorexists = (PQntuples(result) > 0); PQclear(result); @@ -267,27 +276,30 @@ main(int argc, char *argv[]) /* * Create the function(s) and the language + * + * NOTE: the functions will be created in pg_catalog because + * of our previous "SET search_path". */ resetPQExpBuffer(&sql); if (!handlerexists) appendPQExpBuffer(&sql, - "CREATE FUNCTION pg_catalog.\"%s\" () RETURNS " - "language_handler AS '%s/%s' LANGUAGE C;\n", + "CREATE FUNCTION \"%s\" () RETURNS language_handler " + "AS '%s/%s' LANGUAGE C;\n", handler, pglib, object); if (!validatorexists) appendPQExpBuffer(&sql, - "CREATE FUNCTION pg_catalog.\"%s\" (oid) RETURNS " - "void AS '%s/%s' LANGUAGE C;\n", + "CREATE FUNCTION \"%s\" (oid) RETURNS void " + "AS '%s/%s' LANGUAGE C;\n", validator, pglib, object); appendPQExpBuffer(&sql, - "CREATE %sLANGUAGE \"%s\" HANDLER pg_catalog.\"%s\"", + "CREATE %sLANGUAGE \"%s\" HANDLER \"%s\"", (trusted ? "TRUSTED " : ""), langname, handler); if (validator) - appendPQExpBuffer(&sql, " VALIDATOR pg_catalog.\"%s\"", validator); + appendPQExpBuffer(&sql, " VALIDATOR \"%s\"", validator); appendPQExpBuffer(&sql, ";\n"); |