88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.64 2001/05/03 22:53:07 tgl Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.65 2001/06/18 16:14:43 momjian Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
2222#include <limits.h>
2323
2424#include "miscadmin.h"
25+ #include "utils/guc.h"
2526#include "utils/datetime.h"
2627
2728static int DecodeNumber (int flen ,char * field ,
@@ -36,7 +37,6 @@ static intDecodeTimezone(char *str, int *tzp);
3637static datetkn * datebsearch (char * key ,datetkn * base ,unsignedint nel );
3738static int DecodeDate (char * str ,int fmask ,int * tmask ,struct tm * tm );
3839
39- #define USE_DATE_CACHE 1
4040#define ROUND_ALL 0
4141
4242static int DecodePosixTimezone (char * str ,int * val );
@@ -117,11 +117,7 @@ static datetkn datetktbl[] = {
117117{"cdt" ,DTZ ,NEG (30 )},/* Central Daylight Time */
118118{"cet" ,TZ ,6 },/* Central European Time */
119119{"cetdst" ,DTZ ,12 },/* Central European Dayl.Time */
120- #if USE_AUSTRALIAN_RULES
121- {"cst" ,TZ ,63 },/* Australia Eastern Std Time */
122- #else
123120{"cst" ,TZ ,NEG (36 )},/* Central Standard Time */
124- #endif
125121{DCURRENT ,RESERV ,DTK_CURRENT },/* "current" is always now */
126122{"dec" ,MONTH ,12 },
127123{"december" ,MONTH ,12 },
@@ -134,11 +130,7 @@ static datetkn datetktbl[] = {
134130{"eet" ,TZ ,12 },/* East. Europe, USSR Zone 1 */
135131{"eetdst" ,DTZ ,18 },/* Eastern Europe */
136132{EPOCH ,RESERV ,DTK_EPOCH },/* "epoch" reserved for system epoch time */
137- #if USE_AUSTRALIAN_RULES
138- {"est" ,TZ ,60 },/* Australia Eastern Std Time */
139- #else
140133{"est" ,TZ ,NEG (30 )},/* Eastern Standard Time */
141- #endif
142134{"feb" ,MONTH ,2 },
143135{"february" ,MONTH ,2 },
144136{"fri" ,DOW ,5 },
@@ -199,11 +191,7 @@ static datetkn datetktbl[] = {
199191{"pst" ,TZ ,NEG (48 )},/* Pacific Standard Time */
200192{"sadt" ,DTZ ,63 },/* S. Australian Dayl. Time */
201193{"sast" ,TZ ,57 },/* South Australian Std Time */
202- #if USE_AUSTRALIAN_RULES
203- {"sat" ,TZ ,57 },
204- #else
205194{"sat" ,DOW ,6 },
206- #endif
207195{"saturday" ,DOW ,6 },
208196{"sep" ,MONTH ,9 },
209197{"sept" ,MONTH ,9 },
@@ -247,6 +235,16 @@ static datetkn datetktbl[] = {
247235
248236static unsignedint szdatetktbl = sizeof datetktbl /sizeof datetktbl [0 ];
249237
238+ /* Used for SET australian_timezones to override North American ones */
239+ static datetkn australian_datetktbl []= {
240+ {"cst" ,TZ ,63 },/* Australia Eastern Std Time */
241+ {"est" ,TZ ,60 },/* Australia Eastern Std Time */
242+ {"sat" ,TZ ,57 },
243+ };
244+
245+ static unsignedint australian_szdatetktbl = sizeof australian_datetktbl /
246+ sizeof australian_datetktbl [0 ];
247+
250248static datetkn deltatktbl []= {
251249/*texttokenlexval */
252250{"@" ,IGNORE ,0 },/* postgres relative time prefix */
@@ -327,13 +325,10 @@ static datetkn deltatktbl[] = {
327325
328326static unsignedint szdeltatktbl = sizeof deltatktbl /sizeof deltatktbl [0 ];
329327
330- #if USE_DATE_CACHE
331328datetkn * datecache [MAXDATEFIELDS ]= {NULL };
332329
333330datetkn * deltacache [MAXDATEFIELDS ]= {NULL };
334331
335- #endif
336-
337332
338333/*
339334 * Calendar time to Julian date conversions.
@@ -1618,18 +1613,19 @@ DecodeSpecial(int field, char *lowtoken, int *val)
16181613int type ;
16191614datetkn * tp ;
16201615
1621- #if USE_DATE_CACHE
16221616if ((datecache [field ]!= NULL )
16231617&& (strncmp (lowtoken ,datecache [field ]-> token ,TOKMAXLEN )== 0 ))
16241618tp = datecache [field ];
16251619else
16261620{
1627- #endif
1628- tp = datebsearch (lowtoken ,datetktbl ,szdatetktbl );
1629- #if USE_DATE_CACHE
1621+ tp = NULL ;
1622+ if (Australian_timezones )
1623+ tp = datebsearch (lowtoken ,australian_datetktbl ,
1624+ australian_szdatetktbl );
1625+ if (!tp )
1626+ tp = datebsearch (lowtoken ,datetktbl ,szdatetktbl );
16301627}
16311628datecache [field ]= tp ;
1632- #endif
16331629if (tp == NULL )
16341630{
16351631type = IGNORE ;
@@ -1937,18 +1933,14 @@ DecodeUnits(int field, char *lowtoken, int *val)
19371933int type ;
19381934datetkn * tp ;
19391935
1940- #if USE_DATE_CACHE
19411936if ((deltacache [field ]!= NULL )
19421937&& (strncmp (lowtoken ,deltacache [field ]-> token ,TOKMAXLEN )== 0 ))
19431938tp = deltacache [field ];
19441939else
19451940{
1946- #endif
19471941tp = datebsearch (lowtoken ,deltatktbl ,szdeltatktbl );
1948- #if USE_DATE_CACHE
19491942}
19501943deltacache [field ]= tp ;
1951- #endif
19521944if (tp == NULL )
19531945{
19541946type = IGNORE ;
@@ -2455,3 +2447,12 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
24552447
24562448return 0 ;
24572449}/* EncodeTimeSpan() */
2450+
2451+
2452+ void ClearDateCache (bool dummy )
2453+ {
2454+ int i ;
2455+
2456+ for (i = 0 ;i < MAXDATEFIELDS ;i ++ )
2457+ datecache [i ]= NULL ;
2458+ }