提交 7dac7785 编写于 作者: B Bruce Momjian

Add GUC setting for Australian timezones. Uses new GUC boolean callback

functions to clear date cache.  Allow regression tests to pass when
timezone set.
上级 49ce6fff
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.67 2001/05/17 17:44:17 petere Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/runtime.sgml,v 1.68 2001/06/18 16:14:43 momjian Exp $
--> -->
<Chapter Id="runtime"> <Chapter Id="runtime">
...@@ -1201,6 +1201,17 @@ dynamic_library_path = '/usr/local/lib:/home/my_project/lib:$libdir:$libdir/cont ...@@ -1201,6 +1201,17 @@ dynamic_library_path = '/usr/local/lib:/home/my_project/lib:$libdir:$libdir/cont
</listitem> </listitem>
</varlistentry> </varlistentry>
<term>AUSTRALIAN_TIMEZONES (<type>bool</type>)</term>
<listitem>
<para>
If set to true, <literal>CST</literal>, <literal>EST</literal>,
and <literal>SAT</literal> are interpreted as Australian
timezones rather than as North American Central/Eastern
Timezones and Saturday. The default is false.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<indexterm> <indexterm>
<primary>SSL</primary> <primary>SSL</primary>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.64 2001/05/03 22:53:07 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.65 2001/06/18 16:14:43 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <limits.h> #include <limits.h>
#include "miscadmin.h" #include "miscadmin.h"
#include "utils/guc.h"
#include "utils/datetime.h" #include "utils/datetime.h"
static int DecodeNumber(int flen, char *field, static int DecodeNumber(int flen, char *field,
...@@ -36,7 +37,6 @@ static int DecodeTimezone(char *str, int *tzp); ...@@ -36,7 +37,6 @@ static int DecodeTimezone(char *str, int *tzp);
static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel); static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel);
static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm); static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);
#define USE_DATE_CACHE 1
#define ROUND_ALL 0 #define ROUND_ALL 0
static int DecodePosixTimezone(char *str, int *val); static int DecodePosixTimezone(char *str, int *val);
...@@ -117,11 +117,7 @@ static datetkn datetktbl[] = { ...@@ -117,11 +117,7 @@ static datetkn datetktbl[] = {
{"cdt", DTZ, NEG(30)}, /* Central Daylight Time */ {"cdt", DTZ, NEG(30)}, /* Central Daylight Time */
{"cet", TZ, 6}, /* Central European Time */ {"cet", TZ, 6}, /* Central European Time */
{"cetdst", DTZ, 12}, /* Central European Dayl.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 */ {"cst", TZ, NEG(36)}, /* Central Standard Time */
#endif
{DCURRENT, RESERV, DTK_CURRENT}, /* "current" is always now */ {DCURRENT, RESERV, DTK_CURRENT}, /* "current" is always now */
{"dec", MONTH, 12}, {"dec", MONTH, 12},
{"december", MONTH, 12}, {"december", MONTH, 12},
...@@ -134,11 +130,7 @@ static datetkn datetktbl[] = { ...@@ -134,11 +130,7 @@ static datetkn datetktbl[] = {
{"eet", TZ, 12}, /* East. Europe, USSR Zone 1 */ {"eet", TZ, 12}, /* East. Europe, USSR Zone 1 */
{"eetdst", DTZ, 18}, /* Eastern Europe */ {"eetdst", DTZ, 18}, /* Eastern Europe */
{EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */ {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 */ {"est", TZ, NEG(30)}, /* Eastern Standard Time */
#endif
{"feb", MONTH, 2}, {"feb", MONTH, 2},
{"february", MONTH, 2}, {"february", MONTH, 2},
{"fri", DOW, 5}, {"fri", DOW, 5},
...@@ -199,11 +191,7 @@ static datetkn datetktbl[] = { ...@@ -199,11 +191,7 @@ static datetkn datetktbl[] = {
{"pst", TZ, NEG(48)}, /* Pacific Standard Time */ {"pst", TZ, NEG(48)}, /* Pacific Standard Time */
{"sadt", DTZ, 63}, /* S. Australian Dayl. Time */ {"sadt", DTZ, 63}, /* S. Australian Dayl. Time */
{"sast", TZ, 57}, /* South Australian Std Time */ {"sast", TZ, 57}, /* South Australian Std Time */
#if USE_AUSTRALIAN_RULES
{"sat", TZ, 57},
#else
{"sat", DOW, 6}, {"sat", DOW, 6},
#endif
{"saturday", DOW, 6}, {"saturday", DOW, 6},
{"sep", MONTH, 9}, {"sep", MONTH, 9},
{"sept", MONTH, 9}, {"sept", MONTH, 9},
...@@ -247,6 +235,16 @@ static datetkn datetktbl[] = { ...@@ -247,6 +235,16 @@ static datetkn datetktbl[] = {
static unsigned int szdatetktbl = sizeof datetktbl / sizeof datetktbl[0]; static unsigned int szdatetktbl = sizeof datetktbl / sizeof datetktbl[0];
/* Used for SET australian_timezones to override North American ones */
static datetkn australian_datetktbl[] = {
{"cst", TZ, 63}, /* Australia Eastern Std Time */
{"est", TZ, 60}, /* Australia Eastern Std Time */
{"sat", TZ, 57},
};
static unsigned int australian_szdatetktbl = sizeof australian_datetktbl /
sizeof australian_datetktbl[0];
static datetkn deltatktbl[] = { static datetkn deltatktbl[] = {
/* text token lexval */ /* text token lexval */
{"@", IGNORE, 0}, /* postgres relative time prefix */ {"@", IGNORE, 0}, /* postgres relative time prefix */
...@@ -327,13 +325,10 @@ static datetkn deltatktbl[] = { ...@@ -327,13 +325,10 @@ static datetkn deltatktbl[] = {
static unsigned int szdeltatktbl = sizeof deltatktbl / sizeof deltatktbl[0]; static unsigned int szdeltatktbl = sizeof deltatktbl / sizeof deltatktbl[0];
#if USE_DATE_CACHE
datetkn *datecache[MAXDATEFIELDS] = {NULL}; datetkn *datecache[MAXDATEFIELDS] = {NULL};
datetkn *deltacache[MAXDATEFIELDS] = {NULL}; datetkn *deltacache[MAXDATEFIELDS] = {NULL};
#endif
/* /*
* Calendar time to Julian date conversions. * Calendar time to Julian date conversions.
...@@ -1618,18 +1613,19 @@ DecodeSpecial(int field, char *lowtoken, int *val) ...@@ -1618,18 +1613,19 @@ DecodeSpecial(int field, char *lowtoken, int *val)
int type; int type;
datetkn *tp; datetkn *tp;
#if USE_DATE_CACHE
if ((datecache[field] != NULL) if ((datecache[field] != NULL)
&& (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0)) && (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0))
tp = datecache[field]; tp = datecache[field];
else else
{ {
#endif tp = NULL;
tp = datebsearch(lowtoken, datetktbl, szdatetktbl); if (Australian_timezones)
#if USE_DATE_CACHE tp = datebsearch(lowtoken, australian_datetktbl,
australian_szdatetktbl);
if (!tp)
tp = datebsearch(lowtoken, datetktbl, szdatetktbl);
} }
datecache[field] = tp; datecache[field] = tp;
#endif
if (tp == NULL) if (tp == NULL)
{ {
type = IGNORE; type = IGNORE;
...@@ -1937,18 +1933,14 @@ DecodeUnits(int field, char *lowtoken, int *val) ...@@ -1937,18 +1933,14 @@ DecodeUnits(int field, char *lowtoken, int *val)
int type; int type;
datetkn *tp; datetkn *tp;
#if USE_DATE_CACHE
if ((deltacache[field] != NULL) if ((deltacache[field] != NULL)
&& (strncmp(lowtoken, deltacache[field]->token, TOKMAXLEN) == 0)) && (strncmp(lowtoken, deltacache[field]->token, TOKMAXLEN) == 0))
tp = deltacache[field]; tp = deltacache[field];
else else
{ {
#endif
tp = datebsearch(lowtoken, deltatktbl, szdeltatktbl); tp = datebsearch(lowtoken, deltatktbl, szdeltatktbl);
#if USE_DATE_CACHE
} }
deltacache[field] = tp; deltacache[field] = tp;
#endif
if (tp == NULL) if (tp == NULL)
{ {
type = IGNORE; type = IGNORE;
...@@ -2455,3 +2447,12 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str) ...@@ -2455,3 +2447,12 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
return 0; return 0;
} /* EncodeTimeSpan() */ } /* EncodeTimeSpan() */
void ClearDateCache(bool dummy)
{
int i;
for (i=0; i < MAXDATEFIELDS; i++)
datecache[i] = NULL;
}
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Support for grand unified configuration scheme, including SET * Support for grand unified configuration scheme, including SET
* command, configuration file, and command line options. * command, configuration file, and command line options.
* *
* $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.38 2001/06/12 22:54:06 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.39 2001/06/18 16:14:43 momjian Exp $
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>. * Written by Peter Eisentraut <peter_e@gmx.net>.
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "parser/parse_expr.h" #include "parser/parse_expr.h"
#include "storage/proc.h" #include "storage/proc.h"
#include "tcop/tcopprot.h" #include "tcop/tcopprot.h"
#include "utils/datetime.h"
/* XXX these should be in other modules' header files */ /* XXX these should be in other modules' header files */
...@@ -69,6 +70,8 @@ bool Show_btree_build_stats = false; ...@@ -69,6 +70,8 @@ bool Show_btree_build_stats = false;
bool SQL_inheritance = true; bool SQL_inheritance = true;
bool Australian_timezones = false;
#ifndef PG_KRB_SRVTAB #ifndef PG_KRB_SRVTAB
#define PG_KRB_SRVTAB "" #define PG_KRB_SRVTAB ""
#endif #endif
...@@ -229,6 +232,9 @@ static struct config_bool ...@@ -229,6 +232,9 @@ static struct config_bool
{"sql_inheritance", PGC_USERSET, &SQL_inheritance, true, NULL}, {"sql_inheritance", PGC_USERSET, &SQL_inheritance, true, NULL},
{"australian_timezones", PGC_USERSET, &Australian_timezones,
false, ClearDateCache},
{"fixbtree", PGC_POSTMASTER, &FixBTree, true, NULL}, {"fixbtree", PGC_POSTMASTER, &FixBTree, true, NULL},
{NULL, 0, NULL, false, NULL} {NULL, 0, NULL, false, NULL}
...@@ -327,8 +333,8 @@ static struct config_real ...@@ -327,8 +333,8 @@ static struct config_real
DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX, NULL, NULL}, DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX, NULL, NULL},
{"geqo_selection_bias", PGC_USERSET, &Geqo_selection_bias, {"geqo_selection_bias", PGC_USERSET, &Geqo_selection_bias,
DEFAULT_GEQO_SELECTION_BIAS, MIN_GEQO_SELECTION_BIAS, DEFAULT_GEQO_SELECTION_BIAS, MIN_GEQO_SELECTION_BIAS,
MAX_GEQO_SELECTION_BIAS, NULL, NULL}, MAX_GEQO_SELECTION_BIAS, NULL, NULL},
{NULL, 0, NULL, 0.0, 0.0, 0.0, NULL, NULL} {NULL, 0, NULL, 0.0, 0.0, 0.0, NULL, NULL}
}; };
...@@ -360,8 +366,8 @@ static struct config_string ...@@ -360,8 +366,8 @@ static struct config_string
"", NULL, NULL}, "", NULL, NULL},
{"wal_sync_method", PGC_SIGHUP, &XLOG_sync_method, {"wal_sync_method", PGC_SIGHUP, &XLOG_sync_method,
XLOG_sync_method_default, XLOG_sync_method_default, check_xlog_sync_method,
check_xlog_sync_method, assign_xlog_sync_method}, assign_xlog_sync_method},
{NULL, 0, NULL, NULL, NULL, NULL} {NULL, 0, NULL, NULL, NULL, NULL}
}; };
...@@ -956,6 +962,7 @@ _ShowOption(enum config_type opttype, struct config_generic *record) ...@@ -956,6 +962,7 @@ _ShowOption(enum config_type opttype, struct config_generic *record)
case PGC_BOOL: case PGC_BOOL:
val = *((struct config_bool *) record)->variable ? "on" : "off"; val = *((struct config_bool *) record)->variable ? "on" : "off";
break; break;
case PGC_INT: case PGC_INT:
snprintf(buffer, sizeof(buffer), "%d", snprintf(buffer, sizeof(buffer), "%d",
*((struct config_int *) record)->variable); *((struct config_int *) record)->variable);
......
...@@ -84,24 +84,6 @@ ...@@ -84,24 +84,6 @@
#geqo_random_seed = -1 # auto-compute seed #geqo_random_seed = -1 # auto-compute seed
#
# Inheritance
#
#sql_inheritance = true
#
# Deadlock
#
#deadlock_timeout = 1000
#
# Expression Depth Limitation
#
#max_expr_depth = 10000 # min 10
# #
# Write-ahead log (WAL) # Write-ahead log (WAL)
# #
...@@ -172,3 +154,13 @@ ...@@ -172,3 +154,13 @@
#trace_lock_oidmin = 16384 #trace_lock_oidmin = 16384
#trace_lock_table = 0 #trace_lock_table = 0
#endif #endif
#
# Misc
#
#sql_inheritance = true
#australian_timezones = false
#deadlock_timeout = 1000
#max_expr_depth = 10000 # min 10
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: datetime.h,v 1.18 2001/05/03 22:53:07 tgl Exp $ * $Id: datetime.h,v 1.19 2001/06/18 16:14:43 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -182,6 +182,7 @@ typedef struct ...@@ -182,6 +182,7 @@ typedef struct
char value; /* this may be unsigned, alas */ char value; /* this may be unsigned, alas */
} datetkn; } datetkn;
extern datetkn datetktbl[];
/* TMODULO() /* TMODULO()
* Macro to replace modf(), which is broken on some platforms. * Macro to replace modf(), which is broken on some platforms.
...@@ -264,6 +265,7 @@ extern int EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str); ...@@ -264,6 +265,7 @@ extern int EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str);
extern int DecodeSpecial(int field, char *lowtoken, int *val); extern int DecodeSpecial(int field, char *lowtoken, int *val);
extern int DecodeUnits(int field, char *lowtoken, int *val); extern int DecodeUnits(int field, char *lowtoken, int *val);
extern void ClearDateCache(bool);
extern int j2day(int jd); extern int j2day(int jd);
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* External declarations pertaining to backend/utils/misc/guc.c and * External declarations pertaining to backend/utils/misc/guc.c and
* backend/utils/misc/guc-file.l * backend/utils/misc/guc-file.l
* *
* $Id: guc.h,v 1.8 2001/06/12 22:54:06 tgl Exp $ * $Id: guc.h,v 1.9 2001/06/18 16:14:43 momjian Exp $
*/ */
#ifndef GUC_H #ifndef GUC_H
#define GUC_H #define GUC_H
...@@ -70,5 +70,6 @@ extern bool Show_query_stats; ...@@ -70,5 +70,6 @@ extern bool Show_query_stats;
extern bool Show_btree_build_stats; extern bool Show_btree_build_stats;
extern bool SQL_inheritance; extern bool SQL_inheritance;
extern bool Australian_timezones;
#endif /* GUC_H */ #endif /* GUC_H */
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
-- --
-- date, time arithmetic -- date, time arithmetic
-- --
-- needed so tests pass
SET australian_timezones = 'off';
SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time"; SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
Date + Time Date + Time
------------------------------ ------------------------------
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
-- --
-- date, time arithmetic -- date, time arithmetic
-- --
-- needed so tests pass
SET australian_timezones = 'off';
SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time"; SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
Date + Time Date + Time
------------------------------ ------------------------------
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
-- --
-- date, time arithmetic -- date, time arithmetic
-- --
-- needed so tests pass
SET australian_timezones = 'off';
SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time"; SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
Date + Time Date + Time
------------------------------ ------------------------------
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
-- Shorthand values -- Shorthand values
-- Not directly usable for regression testing since these are not constants. -- 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 -- 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 'yesterday' + interval '1 day')) as "True";
True True
------ ------
......
-- --
-- HOROLOGY -- HOROLOGY
-- --
-- --
-- date, time arithmetic -- date, time arithmetic
-- --
-- needed so tests pass
SET australian_timezones = 'off';
SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time"; SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
......
-- --
-- DATETIME -- DATETIME
-- --
-- Shorthand values -- Shorthand values
-- Not directly usable for regression testing since these are not constants. -- 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 -- 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 'yesterday' + interval '1 day')) as "True";
SELECT (timestamp 'today' = (timestamp 'tomorrow' - interval '1 day')) as "True"; SELECT (timestamp 'today' = (timestamp 'tomorrow' - interval '1 day')) as "True";
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册