diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 45ed717951..58cf97408f 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.95 2004/05/21 05:07:57 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.96 2004/05/23 23:12:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -329,9 +329,13 @@ assign_timezone(const char *value, bool doit, GucSource source) * Otherwise assume it is a timezone name. * * We have to actually apply the change before we can have any - * hope of checking it. So, save the old value in case we - * have to back out. We have to copy since pg_get_current_timezone + * hope of checking it. So, save the old value in case we have + * to back out. We have to copy since pg_get_current_timezone * returns a pointer to its static state. + * + * This would all get a lot simpler if the TZ library had a better + * API that would let us look up and test a timezone name without + * making it the default. */ const char *cur_tz; char *save_tz; @@ -361,8 +365,31 @@ assign_timezone(const char *value, bool doit, GucSource source) */ if (save_tz) pg_tzset(save_tz); - else /* TZ library not initialized yet */ - select_default_timezone(); + else + { + /* + * TZ library wasn't initialized yet. Annoyingly, we will + * come here during startup because guc-file.l checks + * the value with doit = false before actually applying. + * The best approach seems to be as follows: + * + * 1. known && acceptable: leave the setting in place, + * since we'll apply it soon anyway. This is mainly + * so that any log messages printed during this interval + * are timestamped with the user's requested timezone. + * + * 2. known && !acceptable: revert to GMT for lack of + * any better idea. (select_default_timezone() may get + * called later to undo this.) + * + * 3. !known: no need to do anything since TZ library + * did not change its state. + * + * Again, this should all go away sometime soon. + */ + if (known && !acceptable) + pg_tzset("GMT"); + } /* Complain if it was bad */ if (!known) {