mirror of
https://github.com/postgres/postgres.git
synced 2025-08-25 20:23:07 +03:00
Make createlang and droplang proof against weird search_path settings
by forcing search_path to be just pg_catalog.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -221,6 +222,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
|
||||
*/
|
||||
@@ -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");
|
||||
|
||||
|
Reference in New Issue
Block a user