8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
22
22
#include <limits.h>
23
23
24
24
#include "miscadmin.h"
25
+ #include "utils/guc.h"
25
26
#include "utils/datetime.h"
26
27
27
28
static int DecodeNumber (int flen , char * field ,
@@ -36,7 +37,6 @@ static int DecodeTimezone(char *str, int *tzp);
36
37
static datetkn * datebsearch (char * key , datetkn * base , unsigned int nel );
37
38
static int DecodeDate (char * str , int fmask , int * tmask , struct tm * tm );
38
39
39
- #define USE_DATE_CACHE 1
40
40
#define ROUND_ALL 0
41
41
42
42
static int DecodePosixTimezone (char * str , int * val );
@@ -117,11 +117,7 @@ static datetkn datetktbl[] = {
117
117
{"cdt" , DTZ , NEG (30 )}, /* Central Daylight Time */
118
118
{"cet" , TZ , 6 }, /* Central European Time */
119
119
{"cetdst" , DTZ , 12 }, /* Central European Dayl.Time */
120
- #if USE_AUSTRALIAN_RULES
121
- {"cst" , TZ , 63 }, /* Australia Eastern Std Time */
122
- #else
123
120
{"cst" , TZ , NEG (36 )}, /* Central Standard Time */
124
- #endif
125
121
{DCURRENT , RESERV , DTK_CURRENT }, /* "current" is always now */
126
122
{"dec" , MONTH , 12 },
127
123
{"december" , MONTH , 12 },
@@ -134,11 +130,7 @@ static datetkn datetktbl[] = {
134
130
{"eet" , TZ , 12 }, /* East. Europe, USSR Zone 1 */
135
131
{"eetdst" , DTZ , 18 }, /* Eastern Europe */
136
132
{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
140
133
{"est" , TZ , NEG (30 )}, /* Eastern Standard Time */
141
- #endif
142
134
{"feb" , MONTH , 2 },
143
135
{"february" , MONTH , 2 },
144
136
{"fri" , DOW , 5 },
@@ -199,11 +191,7 @@ static datetkn datetktbl[] = {
199
191
{"pst" , TZ , NEG (48 )}, /* Pacific Standard Time */
200
192
{"sadt" , DTZ , 63 }, /* S. Australian Dayl. Time */
201
193
{"sast" , TZ , 57 }, /* South Australian Std Time */
202
- #if USE_AUSTRALIAN_RULES
203
- {"sat" , TZ , 57 },
204
- #else
205
194
{"sat" , DOW , 6 },
206
- #endif
207
195
{"saturday" , DOW , 6 },
208
196
{"sep" , MONTH , 9 },
209
197
{"sept" , MONTH , 9 },
@@ -247,6 +235,16 @@ static datetkn datetktbl[] = {
247
235
248
236
static unsigned int szdatetktbl = sizeof datetktbl / sizeof datetktbl [0 ];
249
237
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 unsigned int australian_szdatetktbl = sizeof australian_datetktbl /
246
+ sizeof australian_datetktbl [0 ];
247
+
250
248
static datetkn deltatktbl [] = {
251
249
/* text token lexval */
252
250
{"@" , IGNORE , 0 }, /* postgres relative time prefix */
@@ -327,13 +325,10 @@ static datetkn deltatktbl[] = {
327
325
328
326
static unsigned int szdeltatktbl = sizeof deltatktbl / sizeof deltatktbl [0 ];
329
327
330
- #if USE_DATE_CACHE
331
328
datetkn * datecache [MAXDATEFIELDS ] = {NULL };
332
329
333
330
datetkn * deltacache [MAXDATEFIELDS ] = {NULL };
334
331
335
- #endif
336
-
337
332
338
333
/*
339
334
* Calendar time to Julian date conversions.
@@ -1618,18 +1613,19 @@ DecodeSpecial(int field, char *lowtoken, int *val)
1618
1613
int type ;
1619
1614
datetkn * tp ;
1620
1615
1621
- #if USE_DATE_CACHE
1622
1616
if ((datecache [field ] != NULL )
1623
1617
&& (strncmp (lowtoken , datecache [field ]-> token , TOKMAXLEN ) == 0 ))
1624
1618
tp = datecache [field ];
1625
1619
else
1626
1620
{
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 );
1630
1627
}
1631
1628
datecache [field ] = tp ;
1632
- #endif
1633
1629
if (tp == NULL )
1634
1630
{
1635
1631
type = IGNORE ;
@@ -1937,18 +1933,14 @@ DecodeUnits(int field, char *lowtoken, int *val)
1937
1933
int type ;
1938
1934
datetkn * tp ;
1939
1935
1940
- #if USE_DATE_CACHE
1941
1936
if ((deltacache [field ] != NULL )
1942
1937
&& (strncmp (lowtoken , deltacache [field ]-> token , TOKMAXLEN ) == 0 ))
1943
1938
tp = deltacache [field ];
1944
1939
else
1945
1940
{
1946
- #endif
1947
1941
tp = datebsearch (lowtoken , deltatktbl , szdeltatktbl );
1948
- #if USE_DATE_CACHE
1949
1942
}
1950
1943
deltacache [field ] = tp ;
1951
- #endif
1952
1944
if (tp == NULL )
1953
1945
{
1954
1946
type = IGNORE ;
@@ -2455,3 +2447,12 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
2455
2447
2456
2448
return 0 ;
2457
2449
} /* 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
+ }
0 commit comments