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 intDecodeTimezone(char *str, int *tzp);
36
37
static datetkn * datebsearch (char * key ,datetkn * base ,unsignedint 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 unsignedint 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 unsignedint australian_szdatetktbl = sizeof australian_datetktbl /
246
+ sizeof australian_datetktbl [0 ];
247
+
250
248
static datetkn deltatktbl []= {
251
249
/*texttokenlexval */
252
250
{"@" ,IGNORE ,0 },/* postgres relative time prefix */
@@ -327,13 +325,10 @@ static datetkn deltatktbl[] = {
327
325
328
326
static unsignedint 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
+ }