Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7dd8b3c

Browse files
committed
Sync our copy of the timezone library with IANA release tzcode2018g.
This patch absorbs an upstream fix to "zic" for a recently-introducedbug that made it output data that some 32-bit clients couldn't read.Given the current source data, the bug only manifests in zones withleap seconds, which we don't generate, so that there's no actualchange in our installed timezone data files from this. Still, incase somebody uses our copy of "zic" to do something else, it seemsbest to apply the fix promptly.Also, update the README's notes about converting upstream code toour conventions.
1 parent3bf4eda commit7dd8b3c

File tree

2 files changed

+49
-37
lines changed

2 files changed

+49
-37
lines changed

‎src/timezone/README

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ match properly on the old version.
5555
Time Zone code
5656
==============
5757

58-
The code in this directory is currently synced with tzcode release2018f.
58+
The code in this directory is currently synced with tzcode release2018g.
5959
There are many cosmetic (and not so cosmetic) differences from the
6060
original tzcode library, but diffs in the upstream version should usually
6161
be propagated to our version. Here are some notes about that.
@@ -73,13 +73,18 @@ fixed that.)
7373
includes relying on configure's results rather than hand-hacked #defines,
7474
and not relying on <stdint.h> features that may not exist on old systems.
7575
(In particular this means using Postgres' definitions of the int32 and
76-
int64 typedefs, not int_fast32_t/int_fast64_t.)
76+
int64 typedefs, not int_fast32_t/int_fast64_t. Likewise we use
77+
PG_INT32_MIN/MAX not INT32_MIN/MAX.)
7778

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

84+
* zic.c's typedef "lineno" is renamed to "lineno_t", because having
85+
"lineno" in our typedefs list would cause unfortunate pgindent behavior
86+
in some other files where we have variables named that.
87+
8388
* We have exposed the tzload() and tzparse() internal functions, and
8489
slightly modified the API of the former, in part because it now relies
8590
on our own pg_open_tzfile() rather than opening files for itself.
@@ -108,8 +113,11 @@ to first run the tzcode source files through a sed filter like this:
108113
-e 's/\bregister[ \t]//g' \
109114
-e 's/int_fast32_t/int32/g' \
110115
-e 's/int_fast64_t/int64/g' \
116+
-e 's/INT32_MIN/PG_INT32_MIN/g' \
117+
-e 's/INT32_MAX/PG_INT32_MAX/g' \
111118
-e 's/struct[ \t]+tm\b/struct pg_tm/g' \
112119
-e 's/\btime_t\b/pg_time_t/g' \
120+
-e 's/lineno/lineno_t/g' \
113121

114122
and then run them through pgindent. (The first three sed patterns deal
115123
with conversion of their block comment style to something pgindent

‎src/timezone/zic.c

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,11 @@ PERCENT_Z_LEN_BOUND = sizeof "+995959" - 1};
179179
QTBUG-53071 <https://bugreports.qt.io/browse/QTBUG-53071>. This
180180
workaround will no longer be needed when Qt 5.6.1 and earlier are
181181
obsolete, say in the year 2021. */
182+
#ifndefWORK_AROUND_QTBUG_53071
182183
enum
183184
{
184185
WORK_AROUND_QTBUG_53071= true};
186+
#endif
185187

186188
staticintcharcnt;
187189
staticboolerrors;
@@ -1924,12 +1926,6 @@ atcomp(const void *avp, const void *bvp)
19241926
return (a<b) ?-1 : (a>b);
19251927
}
19261928

1927-
staticbool
1928-
is32(constzic_tx)
1929-
{
1930-
returnx== ((zic_t) ((int32)x));
1931-
}
1932-
19331929
staticvoid
19341930
swaptypes(inti,intj)
19351931
{
@@ -1983,7 +1979,12 @@ writezone(const char *const name, const char *const string, char version,
19831979
zic_tone=1;
19841980
zic_ty2038_boundary=one <<31;
19851981
ptrdiff_tnats=timecnt+WORK_AROUND_QTBUG_53071;
1986-
zic_t*ats=emalloc(size_product(nats,sizeof*ats+1));
1982+
1983+
/*
1984+
* Allocate the ATS and TYPES arrays via a single malloc, as this is a bit
1985+
* faster.
1986+
*/
1987+
zic_t*ats=emalloc(MAXALIGN(size_product(nats,sizeof*ats+1)));
19871988
void*typesptr=ats+nats;
19881989
unsignedchar*types=typesptr;
19891990

@@ -2041,20 +2042,6 @@ writezone(const char *const name, const char *const string, char version,
20412042
types[i]=attypes[i].type;
20422043
}
20432044

2044-
/*
2045-
* Work around QTBUG-53071 for timestamps less than y2038_boundary - 1, by
2046-
* inserting a no-op transition at time y2038_boundary - 1. This works
2047-
* only for timestamps before the boundary, which should be good enough in
2048-
* practice as QTBUG-53071 should be long-dead by 2038.
2049-
*/
2050-
if (WORK_AROUND_QTBUG_53071&&timecnt!=0
2051-
&&ats[timecnt-1]<y2038_boundary-1&&strchr(string,'<'))
2052-
{
2053-
ats[timecnt]=y2038_boundary-1;
2054-
types[timecnt]=types[timecnt-1];
2055-
timecnt++;
2056-
}
2057-
20582045
/*
20592046
* Correct for leap seconds.
20602047
*/
@@ -2069,32 +2056,48 @@ writezone(const char *const name, const char *const string, char version,
20692056
}
20702057
}
20712058

2059+
/*
2060+
* Work around QTBUG-53071 for timestamps less than y2038_boundary - 1, by
2061+
* inserting a no-op transition at time y2038_boundary - 1. This works
2062+
* only for timestamps before the boundary, which should be good enough in
2063+
* practice as QTBUG-53071 should be long-dead by 2038. Do this after
2064+
* correcting for leap seconds, as the idea is to insert a transition just
2065+
* before 32-bit pg_time_t rolls around, and this occurs at a slightly
2066+
* different moment if transitions are leap-second corrected.
2067+
*/
2068+
if (WORK_AROUND_QTBUG_53071&&timecnt!=0
2069+
&&ats[timecnt-1]<y2038_boundary-1&&strchr(string,'<'))
2070+
{
2071+
ats[timecnt]=y2038_boundary-1;
2072+
types[timecnt]=types[timecnt-1];
2073+
timecnt++;
2074+
}
2075+
20722076
/*
20732077
* Figure out 32-bit-limited starts and counts.
20742078
*/
20752079
timecnt32=timecnt;
20762080
timei32=0;
20772081
leapcnt32=leapcnt;
20782082
leapi32=0;
2079-
while (timecnt32>0&&!is32(ats[timecnt32-1]))
2083+
while (0<timecnt32&&PG_INT32_MAX<ats[timecnt32-1])
20802084
--timecnt32;
2081-
while (timecnt32>0&& !is32(ats[timei32]))
2085+
while (1<timecnt32&&ats[timei32]<PG_INT32_MIN
2086+
&&ats[timei32+1] <=PG_INT32_MIN)
20822087
{
2088+
/*
2089+
* Discard too-low transitions, except keep any last too-low
2090+
* transition if no transition is exactly at PG_INT32_MIN. The kept
2091+
* transition will be output as an PG_INT32_MIN "transition"
2092+
* appropriate for buggy 32-bit clients that do not use time type 0
2093+
* for timestamps before the first transition; see below.
2094+
*/
20832095
--timecnt32;
20842096
++timei32;
20852097
}
2086-
2087-
/*
2088-
* Output an INT32_MIN "transition" if appropriate; see below.
2089-
*/
2090-
if (timei32>0&&ats[timei32]>PG_INT32_MIN)
2091-
{
2092-
--timei32;
2093-
++timecnt32;
2094-
}
2095-
while (leapcnt32>0&& !is32(trans[leapcnt32-1]))
2098+
while (0<leapcnt32&&PG_INT32_MAX<trans[leapcnt32-1])
20962099
--leapcnt32;
2097-
while (leapcnt32>0&&!is32(trans[leapi32]))
2100+
while (0<leapcnt32&&trans[leapi32]<PG_INT32_MIN)
20982101
{
20992102
--leapcnt32;
21002103
++leapi32;
@@ -2327,7 +2330,8 @@ writezone(const char *const name, const char *const string, char version,
23272330
if (pass==1)
23282331

23292332
/*
2330-
* Output an INT32_MIN "transition" if appropriate; see above.
2333+
* Output an PG_INT32_MIN "transition" if appropriate; see
2334+
* above.
23312335
*/
23322336
puttzcode(((ats[i]<PG_INT32_MIN) ?
23332337
PG_INT32_MIN :ats[i]),fp);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp