]> granicus.if.org Git - postgresql/commitdiff
Fix bogus logic for zic -P option.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Oct 2014 18:48:11 +0000 (14:48 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Oct 2014 18:48:24 +0000 (14:48 -0400)
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.

src/timezone/zic.c

index 2e38990323031d35328a847612db9c7181b0a8cd..13baf73d3c1c93fed205c7ac22d6aa74fe002586 100644 (file)
@@ -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,