Re: Australian timezone configure option - Mailing list pgsql-patches

From Chris Dunlop
Subject Re: Australian timezone configure option
Date
Msg-id 20010612144654.A23004@minotaur.onthe.net.au
Whole thread Raw
In response to Re: Australian timezone configure option  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses Re: Australian timezone configure option
List pgsql-patches
On Mon, Jun 11, 2001 at 11:53:59PM -0400, Bruce Momjian wrote:
> > Hi,
> >
> > Being in Australia, it's always been a minor pain building the support
> > for Australian timezone rules by defining USE_AUSTRALIAN_RULES to the
> > compiler.  Not to mention the not inconsiderable pain involved in pawing
> > through the code and documentation trying to work out why the timezones
> > were wrong in the first place.
>
> OK, this patch makes Australian_timezones a GUC option.  It can be set
> anytime in psql.  The code uses a static variable to check if the GUC
> setting has changed and adjust the C struct accordingly.  I have also
> added code to allow the regression tests to pass even if postgresql.conf
> has australian_timezones defined.


Your patch had one reject against 7.1.2 (a single blank line in guc.c),
but it works for me once that was fixed.

Below is the patch against 7.1.2 I generated from your cvs patch.

I guess some documentation would be nice...

Thanks for your effort!


Cheers,

Chris,
OnTheNet



diff -ru postgresql-7.1.2.orig/src/backend/utils/adt/datetime.c postgresql-7.1.2/src/backend/utils/adt/datetime.c
--- postgresql-7.1.2.orig/src/backend/utils/adt/datetime.c    Fri May  4 08:53:07 2001
+++ postgresql-7.1.2/src/backend/utils/adt/datetime.c    Tue Jun 12 14:14:38 2001
@@ -22,6 +22,7 @@
 #include <limits.h>

 #include "miscadmin.h"
+#include "utils/guc.h"
 #include "utils/datetime.h"

 static int DecodeNumber(int flen, char *field,
@@ -35,6 +36,7 @@
 static int    DecodeTimezone(char *str, int *tzp);
 static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel);
 static int    DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);
+static void    CheckAustralianTimezones(int field);

 #define USE_DATE_CACHE 1
 #define ROUND_ALL 0
@@ -85,7 +87,7 @@
  * entries by 10 and truncate the text field at MAXTOKLEN characters.
  * the text field is not guaranteed to be NULL-terminated.
  */
-static datetkn datetktbl[] = {
+datetkn datetktbl[] = {
 /*        text            token    lexval */
     {EARLY, RESERV, DTK_EARLY}, /* "-infinity" reserved for "early time" */
     {"acsst", DTZ, 63},            /* Cent. Australia */
@@ -117,11 +119,7 @@
     {"cdt", DTZ, NEG(30)},        /* Central Daylight Time */
     {"cet", TZ, 6},                /* Central European Time */
     {"cetdst", DTZ, 12},        /* Central European Dayl.Time */
-#if USE_AUSTRALIAN_RULES
-    {"cst", TZ, 63},            /* Australia Eastern Std Time */
-#else
-    {"cst", TZ, NEG(36)},        /* Central Standard Time */
-#endif
+    {"cst", TZ, NEG(36)},        /* Central Standard Time, may be Australian */
     {DCURRENT, RESERV, DTK_CURRENT},    /* "current" is always now */
     {"dec", MONTH, 12},
     {"december", MONTH, 12},
@@ -134,11 +132,7 @@
     {"eet", TZ, 12},            /* East. Europe, USSR Zone 1 */
     {"eetdst", DTZ, 18},        /* Eastern Europe */
     {EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */
-#if USE_AUSTRALIAN_RULES
-    {"est", TZ, 60},            /* Australia Eastern Std Time */
-#else
-    {"est", TZ, NEG(30)},        /* Eastern Standard Time */
-#endif
+    {"est", TZ, NEG(30)},        /* Eastern Standard Time, may be Australian */
     {"feb", MONTH, 2},
     {"february", MONTH, 2},
     {"fri", DOW, 5},
@@ -199,11 +193,7 @@
     {"pst", TZ, NEG(48)},        /* Pacific Standard Time */
     {"sadt", DTZ, 63},            /* S. Australian Dayl. Time */
     {"sast", TZ, 57},            /* South Australian Std Time */
-#if USE_AUSTRALIAN_RULES
-    {"sat", TZ, 57},
-#else
-    {"sat", DOW, 6},
-#endif
+    {"sat", DOW, 6},            /* may be changed to Australian */
     {"saturday", DOW, 6},
     {"sep", MONTH, 9},
     {"sept", MONTH, 9},
@@ -1618,6 +1608,8 @@
     int            type;
     datetkn    *tp;

+    CheckAustralianTimezones(field);
+
 #if USE_DATE_CACHE
     if ((datecache[field] != NULL)
         && (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0))
@@ -2455,3 +2447,49 @@

     return 0;
 }    /* EncodeTimeSpan() */
+
+
+static void    CheckAustralianTimezones(int field)
+{
+    datetkn    *tp;
+    int prev_Australian_timezones = false;    /* structure preloaded as false */
+
+    if (Australian_timezones != prev_Australian_timezones)
+    {
+#if USE_DATE_CACHE
+        datecache[field] = NULL;
+#endif
+        /* CST */
+        tp = datebsearch("cst", datetktbl, szdatetktbl);
+        Assert(tp);
+        tp->type = TZ;
+        if (!Australian_timezones)
+            tp->value = NEG(36);    /* Central Standard Time */
+        else
+            tp->value = 63;            /* Australia Eastern Std Time */
+
+        /* EST */
+        tp = datebsearch("est", datetktbl, szdatetktbl);
+        Assert(tp);
+        tp->type = TZ;
+        if (!Australian_timezones)
+            tp->value = NEG(30);    /* Eastern Standard Time */
+        else
+            tp->value = 60;            /* Australia Eastern Std Time */
+
+        /* SAT */
+        tp = datebsearch("sat", datetktbl, szdatetktbl);
+        Assert(tp);
+        if (!Australian_timezones)
+        {
+            tp->type = DOW;
+            tp->value = 6;
+        }
+        else
+        {
+            tp->type = TZ;
+            tp->value = 57;
+        }
+        prev_Australian_timezones = Australian_timezones;
+    }
+}
diff -ru postgresql-7.1.2.orig/src/backend/utils/misc/guc.c postgresql-7.1.2/src/backend/utils/misc/guc.c
--- postgresql-7.1.2.orig/src/backend/utils/misc/guc.c    Fri Mar 23 04:41:47 2001
+++ postgresql-7.1.2/src/backend/utils/misc/guc.c    Tue Jun 12 14:14:38 2001
@@ -70,6 +70,8 @@

 bool        SQL_inheritance = true;

+bool        Australian_timezones = false;
+
 #ifndef PG_KRB_SRVTAB
 #define PG_KRB_SRVTAB ""
 #endif
@@ -220,6 +222,7 @@
     {"show_source_port", PGC_SIGHUP, &ShowPortNumber, false},

     {"sql_inheritance", PGC_USERSET, &SQL_inheritance, true},
+    {"australian_timezones", PGC_USERSET, &Australian_timezones, false},

     {"fixbtree", PGC_POSTMASTER, &FixBTree, true},

@@ -856,7 +859,7 @@
             elog(FATAL, "out of memory");
     }
     else
-/* no equal sign in string */
+    /* no equal sign in string */
     {
         *name = strdup(string);
         if (!*name)
diff -ru postgresql-7.1.2.orig/src/backend/utils/misc/postgresql.conf.sample
postgresql-7.1.2/src/backend/utils/misc/postgresql.conf.sample
--- postgresql-7.1.2.orig/src/backend/utils/misc/postgresql.conf.sample    Fri Mar 16 16:44:33 2001
+++ postgresql-7.1.2/src/backend/utils/misc/postgresql.conf.sample    Tue Jun 12 14:14:38 2001
@@ -172,3 +172,9 @@
 #trace_lock_oidmin = 16384
 #trace_lock_table = 0
 #endif
+
+
+#
+#    Lock Tracing
+#
+#australian_timezones = false
diff -ru postgresql-7.1.2.orig/src/include/utils/datetime.h postgresql-7.1.2/src/include/utils/datetime.h
--- postgresql-7.1.2.orig/src/include/utils/datetime.h    Fri May  4 08:53:07 2001
+++ postgresql-7.1.2/src/include/utils/datetime.h    Tue Jun 12 14:14:38 2001
@@ -182,6 +182,7 @@
     char        value;            /* this may be unsigned, alas */
 } datetkn;

+extern datetkn datetktbl[];

 /* TMODULO()
  * Macro to replace modf(), which is broken on some platforms.
diff -ru postgresql-7.1.2.orig/src/include/utils/guc.h postgresql-7.1.2/src/include/utils/guc.h
--- postgresql-7.1.2.orig/src/include/utils/guc.h    Thu Mar 22 15:01:12 2001
+++ postgresql-7.1.2/src/include/utils/guc.h    Tue Jun 12 14:14:38 2001
@@ -67,5 +67,6 @@
 extern bool Show_btree_build_stats;

 extern bool SQL_inheritance;
+extern bool Australian_timezones;

 #endif     /* GUC_H */
diff -ru postgresql-7.1.2.orig/src/test/regress/expected/horology-no-DST-before-1970.out
postgresql-7.1.2/src/test/regress/expected/horology-no-DST-before-1970.out
--- postgresql-7.1.2.orig/src/test/regress/expected/horology-no-DST-before-1970.out    Fri Apr  6 15:50:25 2001
+++ postgresql-7.1.2/src/test/regress/expected/horology-no-DST-before-1970.out    Tue Jun 12 14:14:38 2001
@@ -4,6 +4,8 @@
 --
 -- date, time arithmetic
 --
+-- needed so tests pass
+SET australian_timezones = 'off';
 SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
          Date + Time
 ------------------------------
diff -ru postgresql-7.1.2.orig/src/test/regress/expected/horology-solaris-1947.out
postgresql-7.1.2/src/test/regress/expected/horology-solaris-1947.out
--- postgresql-7.1.2.orig/src/test/regress/expected/horology-solaris-1947.out    Fri Apr  6 15:50:25 2001
+++ postgresql-7.1.2/src/test/regress/expected/horology-solaris-1947.out    Tue Jun 12 14:14:38 2001
@@ -4,6 +4,8 @@
 --
 -- date, time arithmetic
 --
+-- needed so tests pass
+SET australian_timezones = 'off';
 SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
          Date + Time
 ------------------------------
diff -ru postgresql-7.1.2.orig/src/test/regress/expected/horology.out
postgresql-7.1.2/src/test/regress/expected/horology.out
--- postgresql-7.1.2.orig/src/test/regress/expected/horology.out    Fri Apr  6 15:50:25 2001
+++ postgresql-7.1.2/src/test/regress/expected/horology.out    Tue Jun 12 14:14:38 2001
@@ -4,6 +4,8 @@
 --
 -- date, time arithmetic
 --
+-- needed so tests pass
+SET australian_timezones = 'off';
 SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
          Date + Time
 ------------------------------
diff -ru postgresql-7.1.2.orig/src/test/regress/expected/timestamp.out
postgresql-7.1.2/src/test/regress/expected/timestamp.out
--- postgresql-7.1.2.orig/src/test/regress/expected/timestamp.out    Fri May  4 05:00:37 2001
+++ postgresql-7.1.2/src/test/regress/expected/timestamp.out    Tue Jun 12 14:14:38 2001
@@ -4,6 +4,8 @@
 -- Shorthand values
 -- Not directly usable for regression testing since these are not constants.
 -- So, just try to test parser and hope for the best - thomas 97/04/26
+-- needed so tests pass
+SET australian_timezones = 'off';
 SELECT (timestamp 'today' = (timestamp 'yesterday' + interval '1 day')) as "True";
  True
 ------
diff -ru postgresql-7.1.2.orig/src/test/regress/sql/horology.sql postgresql-7.1.2/src/test/regress/sql/horology.sql
--- postgresql-7.1.2.orig/src/test/regress/sql/horology.sql    Fri Apr  6 15:50:29 2001
+++ postgresql-7.1.2/src/test/regress/sql/horology.sql    Tue Jun 12 14:14:38 2001
@@ -1,10 +1,11 @@
 --
 -- HOROLOGY
 --
-
 --
 -- date, time arithmetic
 --
+-- needed so tests pass
+SET australian_timezones = 'off';

 SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";

diff -ru postgresql-7.1.2.orig/src/test/regress/sql/timestamp.sql postgresql-7.1.2/src/test/regress/sql/timestamp.sql
--- postgresql-7.1.2.orig/src/test/regress/sql/timestamp.sql    Sat Nov 25 16:00:33 2000
+++ postgresql-7.1.2/src/test/regress/sql/timestamp.sql    Tue Jun 12 14:14:38 2001
@@ -1,10 +1,11 @@
 --
 -- DATETIME
 --
-
 -- Shorthand values
 -- Not directly usable for regression testing since these are not constants.
 -- So, just try to test parser and hope for the best - thomas 97/04/26
+-- needed so tests pass
+SET australian_timezones = 'off';

 SELECT (timestamp 'today' = (timestamp 'yesterday' + interval '1 day')) as "True";
 SELECT (timestamp 'today' = (timestamp 'tomorrow' - interval '1 day')) as "True";

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Patch to include PAM support...
Next
From: Chris Dunlop
Date:
Subject: Re: Australian timezone configure option