mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Repair problem identified by Olivier Prenant: ALTER DATABASE SET search_path
should not be too eager to reject paths involving unknown schemas, since it can't really tell whether the schemas exist in the target database. (Also, when reading pg_dumpall output, it could be that the schemas don't exist yet, but eventually will.) ALTER USER SET has a similar issue. So, reduce the normal ERROR to a NOTICE when checking search_path values for these commands. Supporting this requires changing the API for GUC assign_hook functions, which causes the patch to touch a lot of places, but the changes are conceptually trivial.
This commit is contained in:
@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.92 2003/12/21 04:34:35 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.93 2004/01/19 19:04:40 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -48,7 +48,7 @@ extern char *tzname[];
|
||||
* assign_datestyle: GUC assign_hook for datestyle
|
||||
*/
|
||||
const char *
|
||||
assign_datestyle(const char *value, bool doit, bool interactive)
|
||||
assign_datestyle(const char *value, bool doit, GucSource source)
|
||||
{
|
||||
int newDateStyle = DateStyle;
|
||||
int newDateOrder = DateOrder;
|
||||
@ -69,7 +69,7 @@ assign_datestyle(const char *value, bool doit, bool interactive)
|
||||
/* syntax error in list */
|
||||
pfree(rawstring);
|
||||
freeList(elemlist);
|
||||
if (interactive)
|
||||
if (source >= PGC_S_INTERACTIVE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("invalid list syntax for parameter \"datestyle\"")));
|
||||
@ -137,7 +137,7 @@ assign_datestyle(const char *value, bool doit, bool interactive)
|
||||
const char *subval;
|
||||
|
||||
subval = assign_datestyle(GetConfigOptionResetString("datestyle"),
|
||||
true, interactive);
|
||||
true, source);
|
||||
if (scnt == 0)
|
||||
newDateStyle = DateStyle;
|
||||
if (ocnt == 0)
|
||||
@ -155,7 +155,7 @@ assign_datestyle(const char *value, bool doit, bool interactive)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (interactive)
|
||||
if (source >= PGC_S_INTERACTIVE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("unrecognized \"datestyle\" key word: \"%s\"",
|
||||
@ -173,7 +173,7 @@ assign_datestyle(const char *value, bool doit, bool interactive)
|
||||
|
||||
if (!ok)
|
||||
{
|
||||
if (interactive)
|
||||
if (source >= PGC_S_INTERACTIVE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("conflicting \"datestyle\" specifications")));
|
||||
@ -386,7 +386,7 @@ tz_acceptable(void)
|
||||
* assign_timezone: GUC assign_hook for timezone
|
||||
*/
|
||||
const char *
|
||||
assign_timezone(const char *value, bool doit, bool interactive)
|
||||
assign_timezone(const char *value, bool doit, GucSource source)
|
||||
{
|
||||
char *result;
|
||||
char *endptr;
|
||||
@ -444,7 +444,7 @@ assign_timezone(const char *value, bool doit, bool interactive)
|
||||
pfree(val);
|
||||
if (interval->month != 0)
|
||||
{
|
||||
if (interactive)
|
||||
if (source >= PGC_S_INTERACTIVE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("invalid interval value for time zone: month not allowed")));
|
||||
@ -552,7 +552,7 @@ assign_timezone(const char *value, bool doit, bool interactive)
|
||||
/* Complain if it was bad */
|
||||
if (!known)
|
||||
{
|
||||
ereport(interactive ? ERROR : LOG,
|
||||
ereport((source >= PGC_S_INTERACTIVE) ? ERROR : LOG,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("unrecognized time zone name: \"%s\"",
|
||||
value)));
|
||||
@ -560,7 +560,7 @@ assign_timezone(const char *value, bool doit, bool interactive)
|
||||
}
|
||||
if (!acceptable)
|
||||
{
|
||||
ereport(interactive ? ERROR : LOG,
|
||||
ereport((source >= PGC_S_INTERACTIVE) ? ERROR : LOG,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
errmsg("time zone \"%s\" appears to use leap seconds",
|
||||
value),
|
||||
@ -628,9 +628,9 @@ show_timezone(void)
|
||||
*/
|
||||
|
||||
const char *
|
||||
assign_XactIsoLevel(const char *value, bool doit, bool interactive)
|
||||
assign_XactIsoLevel(const char *value, bool doit, GucSource source)
|
||||
{
|
||||
if (doit && interactive && SerializableSnapshot != NULL)
|
||||
if (doit && source >= PGC_S_INTERACTIVE && SerializableSnapshot != NULL)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_ACTIVE_SQL_TRANSACTION),
|
||||
errmsg("SET TRANSACTION ISOLATION LEVEL must be called before any query")));
|
||||
@ -690,10 +690,10 @@ show_XactIsoLevel(void)
|
||||
*/
|
||||
|
||||
bool
|
||||
assign_random_seed(double value, bool doit, bool interactive)
|
||||
assign_random_seed(double value, bool doit, GucSource source)
|
||||
{
|
||||
/* Can't really roll back on error, so ignore non-interactive setting */
|
||||
if (doit && interactive)
|
||||
if (doit && source >= PGC_S_INTERACTIVE)
|
||||
DirectFunctionCall1(setseed, Float8GetDatum(value));
|
||||
return true;
|
||||
}
|
||||
@ -710,7 +710,7 @@ show_random_seed(void)
|
||||
*/
|
||||
|
||||
const char *
|
||||
assign_client_encoding(const char *value, bool doit, bool interactive)
|
||||
assign_client_encoding(const char *value, bool doit, GucSource source)
|
||||
{
|
||||
int encoding;
|
||||
|
||||
@ -726,7 +726,7 @@ assign_client_encoding(const char *value, bool doit, bool interactive)
|
||||
*/
|
||||
if (SetClientEncoding(encoding, doit) < 0)
|
||||
{
|
||||
if (interactive)
|
||||
if (source >= PGC_S_INTERACTIVE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("conversion between %s and %s is not supported",
|
||||
@ -748,7 +748,7 @@ assign_client_encoding(const char *value, bool doit, bool interactive)
|
||||
* because of the NAMEDATALEN limit on names.
|
||||
*/
|
||||
const char *
|
||||
assign_session_authorization(const char *value, bool doit, bool interactive)
|
||||
assign_session_authorization(const char *value, bool doit, GucSource source)
|
||||
{
|
||||
AclId usesysid = 0;
|
||||
bool is_superuser = false;
|
||||
@ -791,7 +791,7 @@ assign_session_authorization(const char *value, bool doit, bool interactive)
|
||||
0, 0, 0);
|
||||
if (!HeapTupleIsValid(userTup))
|
||||
{
|
||||
if (interactive)
|
||||
if (source >= PGC_S_INTERACTIVE)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("user \"%s\" does not exist", value)));
|
||||
|
Reference in New Issue
Block a user