aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-10-03 14:48:11 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2014-10-03 14:48:11 -0400
commit596857043023738099d6d16f8edbe6b7353876c0 (patch)
treeaeaafea613d8dc0ca0d35e86d9736f0aafe8d030 /src
parent1021bd6a89bc756c2a72b29eeee1a7a5c25f64f5 (diff)
downloadpostgresql-596857043023738099d6d16f8edbe6b7353876c0.tar.gz
postgresql-596857043023738099d6d16f8edbe6b7353876c0.zip
Fix bogus logic for zic -P option.
The quick hack I added to zic to dump out currently-in-use timezone abbreviations turns out to have a nasty bug: within each zone, it was printing the last "struct ttinfo" to be *defined*, not necessarily the last one in use. This was mainly a problem in zones that had changed the meaning of their zone abbreviation (to another GMT offset value) and later changed it back. As a result of this error, we'd missed out updating the tznames/ files for some jurisdictions that have changed their zone abbreviations since the tznames/ files were originally created. I'll address the missing data updates in a separate commit.
Diffstat (limited to 'src')
-rw-r--r--src/timezone/zic.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/src/timezone/zic.c b/src/timezone/zic.c
index 2e389903230..13baf73d3c1 100644
--- a/src/timezone/zic.c
+++ b/src/timezone/zic.c
@@ -1766,7 +1766,25 @@ writezone(const char *name, const char *string)
if (pass == 1)
puttzcode((long) ats[i], fp);
else
+ {
puttzcode64(ats[i], fp);
+
+ /* Print current timezone abbreviations if requested */
+ if (print_abbrevs &&
+ (ats[i] >= print_cutoff || i == thistimelim - 1))
+ {
+ unsigned char tm = typemap[types[i]];
+ char *thisabbrev = &thischars[indmap[abbrinds[tm]]];
+
+ /* filter out assorted junk entries */
+ if (strcmp(thisabbrev, GRANDPARENTED) != 0 &&
+ strcmp(thisabbrev, "zzz") != 0)
+ fprintf(stdout, "%s\t%ld%s\n",
+ thisabbrev,
+ gmtoffs[tm],
+ isdsts[tm] ? "\tD" : "");
+ }
+ }
for (i = thistimei; i < thistimelim; ++i)
{
unsigned char uc;
@@ -1783,21 +1801,6 @@ writezone(const char *name, const char *string)
puttzcode(gmtoffs[i], fp);
(void) putc(isdsts[i], fp);
(void) putc((unsigned char) indmap[abbrinds[i]], fp);
-
- /* Print current timezone abbreviations if requested */
- if (print_abbrevs && pass == 2 &&
- (ats[i] >= print_cutoff || i == typecnt - 1))
- {
- char *thisabbrev = &thischars[indmap[abbrinds[i]]];
-
- /* filter out assorted junk entries */
- if (strcmp(thisabbrev, GRANDPARENTED) != 0 &&
- strcmp(thisabbrev, "zzz") != 0)
- fprintf(stdout, "%s\t%ld%s\n",
- thisabbrev,
- gmtoffs[i],
- isdsts[i] ? "\tD" : "");
- }
}
if (thischarcnt != 0)
(void) fwrite((void *) thischars,