aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/namespace.c51
-rw-r--r--src/test/regress/expected/guc.out34
-rw-r--r--src/test/regress/sql/guc.sql20
3 files changed, 46 insertions, 59 deletions
diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c
index dc8f8eaf3f3..e92efd863ed 100644
--- a/src/backend/catalog/namespace.c
+++ b/src/backend/catalog/namespace.c
@@ -3773,14 +3773,12 @@ ResetTempTableNamespace(void)
* Routines for handling the GUC variable 'search_path'.
*/
-/* check_hook: validate new search_path, if possible */
+/* check_hook: validate new search_path value */
bool
check_search_path(char **newval, void **extra, GucSource source)
{
- bool result = true;
char *rawname;
List *namelist;
- ListCell *l;
/* Need a modifiable copy of string */
rawname = pstrdup(*newval);
@@ -3796,52 +3794,17 @@ check_search_path(char **newval, void **extra, GucSource source)
}
/*
- * If we aren't inside a transaction, we cannot do database access so
- * cannot verify the individual names. Must accept the list on faith.
+ * We used to try to check that the named schemas exist, but there are
+ * many valid use-cases for having search_path settings that include
+ * schemas that don't exist; and often, we are not inside a transaction
+ * here and so can't consult the system catalogs anyway. So now, the only
+ * requirement is syntactic validity of the identifier list.
*/
- if (IsTransactionState())
- {
- /*
- * Verify that all the names are either valid namespace names or
- * "$user" or "pg_temp". We do not require $user to correspond to a
- * valid namespace, and pg_temp might not exist yet. We do not check
- * for USAGE rights, either; should we?
- *
- * When source == PGC_S_TEST, we are checking the argument of an ALTER
- * DATABASE SET or ALTER USER SET command. It could be that the
- * intended use of the search path is for some other database, so we
- * should not error out if it mentions schemas not present in the
- * current database. We issue a NOTICE instead.
- */
- foreach(l, namelist)
- {
- char *curname = (char *) lfirst(l);
-
- if (strcmp(curname, "$user") == 0)
- continue;
- if (strcmp(curname, "pg_temp") == 0)
- continue;
- if (!SearchSysCacheExists1(NAMESPACENAME,
- CStringGetDatum(curname)))
- {
- if (source == PGC_S_TEST)
- ereport(NOTICE,
- (errcode(ERRCODE_UNDEFINED_SCHEMA),
- errmsg("schema \"%s\" does not exist", curname)));
- else
- {
- GUC_check_errdetail("schema \"%s\" does not exist", curname);
- result = false;
- break;
- }
- }
- }
- }
pfree(rawname);
list_free(namelist);
- return result;
+ return true;
}
/* assign_hook: do extra actions as needed */
diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out
index d3248620499..271706d31e9 100644
--- a/src/test/regress/expected/guc.out
+++ b/src/test/regress/expected/guc.out
@@ -605,6 +605,31 @@ SELECT current_user = 'temp_reset_user';
DROP ROLE temp_reset_user;
--
+-- search_path should react to changes in pg_namespace
+--
+set search_path = foo, public, not_there_initially;
+select current_schemas(false);
+ current_schemas
+-----------------
+ {public}
+(1 row)
+
+create schema not_there_initially;
+select current_schemas(false);
+ current_schemas
+------------------------------
+ {public,not_there_initially}
+(1 row)
+
+drop schema not_there_initially;
+select current_schemas(false);
+ current_schemas
+-----------------
+ {public}
+(1 row)
+
+reset search_path;
+--
-- Tests for function-local GUC settings
--
set work_mem = '3MB';
@@ -617,14 +642,7 @@ select report_guc('work_mem'), current_setting('work_mem');
1MB | 3MB
(1 row)
--- this should draw only a warning
-alter function report_guc(text) set search_path = no_such_schema;
-NOTICE: schema "no_such_schema" does not exist
--- with error occurring here
-select report_guc('work_mem'), current_setting('work_mem');
-ERROR: invalid value for parameter "search_path": "no_such_schema"
-DETAIL: schema "no_such_schema" does not exist
-alter function report_guc(text) reset search_path set work_mem = '2MB';
+alter function report_guc(text) set work_mem = '2MB';
select report_guc('work_mem'), current_setting('work_mem');
report_guc | current_setting
------------+-----------------
diff --git a/src/test/regress/sql/guc.sql b/src/test/regress/sql/guc.sql
index 21ed86f26ba..0c217923814 100644
--- a/src/test/regress/sql/guc.sql
+++ b/src/test/regress/sql/guc.sql
@@ -183,6 +183,18 @@ SELECT current_user = 'temp_reset_user';
DROP ROLE temp_reset_user;
--
+-- search_path should react to changes in pg_namespace
+--
+
+set search_path = foo, public, not_there_initially;
+select current_schemas(false);
+create schema not_there_initially;
+select current_schemas(false);
+drop schema not_there_initially;
+select current_schemas(false);
+reset search_path;
+
+--
-- Tests for function-local GUC settings
--
@@ -194,13 +206,7 @@ set work_mem = '1MB';
select report_guc('work_mem'), current_setting('work_mem');
--- this should draw only a warning
-alter function report_guc(text) set search_path = no_such_schema;
-
--- with error occurring here
-select report_guc('work_mem'), current_setting('work_mem');
-
-alter function report_guc(text) reset search_path set work_mem = '2MB';
+alter function report_guc(text) set work_mem = '2MB';
select report_guc('work_mem'), current_setting('work_mem');