aboutsummaryrefslogtreecommitdiff
path: root/src/bin/scripts/createlang.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-08-15 21:02:26 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-08-15 21:02:26 +0000
commit9a9328003d65f2b5f1a9598ea423db37952976ca (patch)
tree2ef0e0c10d89fd8be56e2cccb489bf548ef54633 /src/bin/scripts/createlang.c
parent866ffc2fe35f63b06fb6ed63ef1f531a741d920e (diff)
downloadpostgresql-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.c46
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");