From 967d6add8da648f8a58d9331fe8c5fd864ffc03a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 14 Mar 2007 17:38:29 +0000 Subject: [PATCH] Arrange to install a "posixrules" entry in our timezone database, so that POSIX-style timezone specs that don't exactly match any database entry will be treated as having correct USA DST rules. Also, document that this can be changed if you want to use some other DST rules with a POSIX zone spec. We could consider changing localtime.c's TZDEFRULESTRING, but since that facility can only deal with one DST transition rule, it seems fairly useless now; might as well just plan to override it using a "posixrules" entry. Backpatch as far as 8.0. There isn't much we can do in 7.x ... either your libc gets it right, or it doesn't. --- doc/src/sgml/datetime.sgml | 37 +++++++++++++++++++++++-------------- src/timezone/Makefile | 8 ++++++-- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/doc/src/sgml/datetime.sgml b/doc/src/sgml/datetime.sgml index 0e42e34fd69..9e23e6490e7 100644 --- a/doc/src/sgml/datetime.sgml +++ b/doc/src/sgml/datetime.sgml @@ -1,5 +1,5 @@ @@ -2230,24 +2230,33 @@ $PostgreSQL: pgsql/doc/src/sgml/datetime.sgml,v 2.45 2005/01/09 18:58:10 tgl Exp In addition to the names listed in the table, - PostgreSQL will accept time zone names of the - form STDoffset or + PostgreSQL will accept POSIX-style time zone + specifications of the form STDoffset or STDoffsetDST, where STD is a zone abbreviation, offset is a numeric offset in hours west from UTC, and DST is an - optional daylight-savings zone abbreviation, assumed to stand for one hour - ahead of the given offset. For example, if EST5EDT were not - already a recognized zone name, it would be accepted and would be - functionally equivalent to USA East Coast time. When a daylight-savings - zone name is present, it is assumed to be used according to USA time zone - rules, so this feature is of limited use outside North America. - One should also be wary that this provision can lead to - silently accepting bogus input, since there is no check on the - reasonableness of the zone abbreviations. For example, - SET TIMEZONE TO FOOBAR0 will work, leaving the system - effectively using a rather peculiar abbreviation for GMT. + optional daylight-savings zone abbreviation, assumed to stand for one + hour ahead of the given offset. For example, if EST5EDT + were not already a recognized zone name, it would be accepted and would + be functionally equivalent to USA East Coast time. When a + daylight-savings zone name is present, it is assumed to be used + according to the same daylight-savings transition rules used in the + zic time zone database's posixrules entry. + In a standard PostgreSQL installation, + posixrules is the same as US/Eastern, so + that POSIX-style time zone specifications follow USA daylight-savings + rules. If needed, you can adjust this behavior by replacing the + posixrules file. + + One should be wary that the POSIX-style time zone feature can + lead to silently accepting bogus input, since there is no check on the + reasonableness of the zone abbreviations. For example, SET + TIMEZONE TO FOOBAR0 will work, leaving the system effectively using + a rather peculiar abbreviation for UTC. + + diff --git a/src/timezone/Makefile b/src/timezone/Makefile index e468b73dce6..2b5a98c2517 100644 --- a/src/timezone/Makefile +++ b/src/timezone/Makefile @@ -4,7 +4,7 @@ # Makefile for the timezone library # IDENTIFICATION -# $PostgreSQL: pgsql/src/timezone/Makefile,v 1.17 2004/12/31 19:01:54 tgl Exp $ +# $PostgreSQL: pgsql/src/timezone/Makefile,v 1.17.4.1 2007/03/14 17:38:29 tgl Exp $ # #------------------------------------------------------------------------- @@ -25,6 +25,10 @@ TZDATA := africa antarctica asia australasia europe northamerica southamerica \ pacificnew etcetera factory backward systemv solar87 solar88 solar89 TZDATAFILES := $(TZDATA:%=$(srcdir)/data/%) +# which zone should determine the DST rules (not the specific UTC offset!) +# for POSIX-style timezone specs +POSIXRULES = US/Eastern + all: SUBSYS.o submake-libpgport zic SUBSYS.o: $(OBJS) @@ -34,7 +38,7 @@ zic: $(ZICOBJS) $(CC) $(CFLAGS) $(ZICOBJS) $(LDFLAGS) $(LIBS) -o $@$(X) install: all installdirs - ./zic -d $(DESTDIR)$(datadir)/timezone $(TZDATAFILES) + ./zic -d $(DESTDIR)$(datadir)/timezone -p $(POSIXRULES) $(TZDATAFILES) installdirs: $(mkinstalldirs) $(DESTDIR)$(datadir)