postgresql/src/timezone
Tom Lane e3860ffa4d Initial pgindent run with pg_bsd_indent version 2.0.
The new indent version includes numerous fixes thanks to Piotr Stefaniak.
The main changes visible in this commit are:

* Nicer formatting of function-pointer declarations.
* No longer unexpectedly removes spaces in expressions using casts,
  sizeof, or offsetof.
* No longer wants to add a space in "struct structname *varname", as
  well as some similar cases for const- or volatile-qualified pointers.
* Declarations using PG_USED_FOR_ASSERTS_ONLY are formatted more nicely.
* Fixes bug where comments following declarations were sometimes placed
  with no space separating them from the code.
* Fixes some odd decisions for comments following case labels.
* Fixes some cases where comments following code were indented to less
  than the expected column 33.

On the less good side, it now tends to put more whitespace around typedef
names that are not listed in typedefs.list.  This might encourage us to
put more effort into typedef name collection; it's not really a bug in
indent itself.

There are more changes coming after this round, having to do with comment
indentation and alignment of lines appearing within parentheses.  I wanted
to limit the size of the diffs to something that could be reviewed without
one's eyes completely glazing over, so it seemed better to split up the
changes as much as practical.

Discussion: https://postgr.es/m/E1dAmxK-0006EE-1r@gemulon.postgresql.org
Discussion: https://postgr.es/m/30527.1495162840@sss.pgh.pa.us
2017-06-21 14:39:04 -04:00
..
data Update time zone data files to tzdata release 2017b. 2017-05-01 11:53:11 -04:00
tznames Update time zone data files to tzdata release 2017b. 2017-05-01 11:53:11 -04:00
.gitignore Semi-automatically detect changes in timezone abbreviations. 2013-03-23 19:17:44 -04:00
Makefile Sync our copy of the timezone library with IANA release tzcode2016c. 2016-03-28 15:10:17 -04:00
README Improve performance of timezone loading, especially pg_timezone_names view. 2017-05-02 21:50:35 -04:00
known_abbrevs.txt Update time zone data files to tzdata release 2017b. 2017-05-01 11:53:11 -04:00
localtime.c Initial pgindent run with pg_bsd_indent version 2.0. 2017-06-21 14:39:04 -04:00
pgtz.c Restore fullname[] contents before falling through in pg_open_tzfile(). 2017-05-07 11:34:31 -04:00
pgtz.h Initial pgindent run with pg_bsd_indent version 2.0. 2017-06-21 14:39:04 -04:00
private.h Sync our copy of the timezone library with IANA release tzcode2017b. 2017-04-30 15:13:51 -04:00
strftime.c Initial pgindent run with pg_bsd_indent version 2.0. 2017-06-21 14:39:04 -04:00
tzfile.h Sync our copy of the timezone library with IANA release tzcode2017b. 2017-04-30 15:13:51 -04:00
zic.c Initial pgindent run with pg_bsd_indent version 2.0. 2017-06-21 14:39:04 -04:00

README

src/timezone/README

This is a PostgreSQL adapted version of the IANA timezone library from

	http://www.iana.org/time-zones

The latest versions of both the tzdata and tzcode tarballs are normally
available right from that page.  Historical versions can be found
elsewhere on the site.

Since time zone rules change frequently in some parts of the world,
we should endeavor to update the data files before each PostgreSQL
release.  The code need not be updated as often, but we must track
changes that might affect interpretation of the data files.


Time Zone data
==============

The data files under data/ are an exact copy of the latest tzdata set,
except that we omit some files that are not of interest for our purposes.

While the files under data/ can just be duplicated when updating, manual
effort is needed to update the time zone abbreviation lists under tznames/.
These need to be changed whenever new abbreviations are invented or the
UTC offset associated with an existing abbreviation changes.  To detect
if this has happened, after installing new files under data/ do
	make abbrevs.txt
which will produce a file showing all abbreviations that are in current
use according to the data/ files.  Compare this to known_abbrevs.txt,
which is the list that existed last time the tznames/ files were updated.
Update tznames/ as seems appropriate, then replace known_abbrevs.txt
in the same commit.  Usually, if a known abbreviation has changed meaning,
the appropriate fix is to make it refer to a long-form zone name instead
of a fixed GMT offset.

The core regression test suite does some simple validation of the zone
data and abbreviations data (notably by checking that the pg_timezone_names
and pg_timezone_abbrevs views don't throw errors).  It's worth running it
as a cross-check on proposed updates.

When there has been a new release of Windows (probably including Service
Packs), the list of matching timezones need to be updated. Run the
script in src/tools/win32tzlist.pl on a Windows machine running this new
release and apply any new timezones that it detects. Never remove any
mappings in case they are removed in Windows, since we still need to
match properly on the old version.


Time Zone code
==============

The code in this directory is currently synced with tzcode release 2017b.
There are many cosmetic (and not so cosmetic) differences from the
original tzcode library, but diffs in the upstream version should usually
be propagated to our version.  Here are some notes about that.

For the most part we want to use the upstream code as-is, but there are
several considerations preventing an exact match:

* For readability/maintainability we reformat the code to match our own
conventions; this includes pgindent'ing it and getting rid of upstream's
overuse of "register" declarations.  (It used to include conversion of
old-style function declarations to C89 style, but thank goodness they
fixed that.)

* We need the code to follow Postgres' portability conventions; this
includes relying on configure's results rather than hand-hacked #defines,
and not relying on <stdint.h> features that may not exist on old systems.
(In particular this means using Postgres' definitions of the int32 and
int64 typedefs, not int_fast32_t/int_fast64_t.)

* Since Postgres is typically built on a system that has its own copy
of the <time.h> functions, we must avoid conflicting with those.  This
mandates renaming typedef time_t to pg_time_t, and similarly for most
other exposed names.

* We have exposed the tzload() and tzparse() internal functions, and
slightly modified the API of the former, in part because it now relies
on our own pg_open_tzfile() rather than opening files for itself.

* tzparse() is adjusted to cache the result of loading the TZDEFRULES
zone, so that that's not repeated more than once per process.

* There's a fair amount of code we don't need and have removed,
including all the nonstandard optional APIs.  We have also added
a few functions of our own at the bottom of localtime.c.

* In zic.c, we have added support for a -P (print_abbrevs) switch, which
is used to create the "abbrevs.txt" summary of currently-in-use zone
abbreviations that was described above.


The most convenient way to compare a new tzcode release to our code is
to first run the tzcode source files through a sed filter like this:

    sed -r \
        -e 's/^([ \t]*)\*\*([ \t])/\1 *\2/' \
        -e 's/^([ \t]*)\*\*$/\1 */' \
        -e 's|^\*/| */|' \
        -e 's/\bregister[ \t]//g' \
        -e 's/int_fast32_t/int32/g' \
        -e 's/int_fast64_t/int64/g' \
        -e 's/struct[ \t]+tm\b/struct pg_tm/g' \
        -e 's/\btime_t\b/pg_time_t/g' \

and then run them through pgindent.  (The first three sed patterns deal
with conversion of their block comment style to something pgindent
won't make a hash of; the remainder address other points noted above.)
After that, the files can be diff'd directly against our corresponding
files.