Sync tzload() and tzparse() APIs with IANA release tzcode2016c.

This brings us a bit closer to matching upstream, but since it affects
files outside src/timezone/, we might choose not to back-patch it.
Hence keep it separate from the main update patch.
This commit is contained in:
Tom Lane 2016-03-28 17:19:29 -04:00
parent f5f15ea6aa
commit 1f4e9da624
4 changed files with 26 additions and 29 deletions

View File

@ -99,15 +99,15 @@ pg_load_tz(const char *name)
*/ */
if (strcmp(name, "GMT") == 0) if (strcmp(name, "GMT") == 0)
{ {
if (tzparse(name, &tz.state, TRUE) != 0) if (!tzparse(name, &tz.state, true))
{ {
/* This really, really should not happen ... */ /* This really, really should not happen ... */
return NULL; return NULL;
} }
} }
else if (tzload(name, NULL, &tz.state, TRUE) != 0) else if (tzload(name, NULL, &tz.state, true) != 0)
{ {
if (name[0] == ':' || tzparse(name, &tz.state, FALSE) != 0) if (name[0] == ':' || !tzparse(name, &tz.state, false))
{ {
return NULL; /* unknown timezone */ return NULL; /* unknown timezone */
} }

View File

@ -409,7 +409,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
struct state *ts = &lsp->u.st; struct state *ts = &lsp->u.st;
up->buf[nread - 1] = '\0'; up->buf[nread - 1] = '\0';
if (tzparse(&up->buf[1], ts, false) == 0 if (tzparse(&up->buf[1], ts, false)
&& ts->typecnt == 2) && ts->typecnt == 2)
{ {
/* /*
@ -534,7 +534,7 @@ tzloadbody(char const * name, char *canonname, struct state * sp, bool doextend,
* given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!). * given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!).
*/ */
int int
tzload(const char *name, char *canonname, struct state * sp, int doextend) tzload(const char *name, char *canonname, struct state * sp, bool doextend)
{ {
union local_storage ls; union local_storage ls;
@ -864,13 +864,10 @@ transtime(int year, const struct rule * rulep,
/* /*
* Given a POSIX section 8-style TZ string, fill in the rule tables as * Given a POSIX section 8-style TZ string, fill in the rule tables as
* appropriate. * appropriate.
* * Returns true on success, false on failure.
* Returns 0 on success, -1 on failure. (Note: tzcode has converted this
* to a bool true-on-success convention, but we're holding the line in PG
* for the moment, to avoid external API changes.)
*/ */
int bool
tzparse(const char *name, struct state * sp, int lastditch) tzparse(const char *name, struct state * sp, bool lastditch)
{ {
const char *stdname; const char *stdname;
const char *dstname = NULL; const char *dstname = NULL;
@ -908,7 +905,7 @@ tzparse(const char *name, struct state * sp, int lastditch)
stdname = name; stdname = name;
name = getqzname(name, '>'); name = getqzname(name, '>');
if (*name != '>') if (*name != '>')
return -1; return false;
stdlen = name - stdname; stdlen = name - stdname;
name++; name++;
} }
@ -918,13 +915,13 @@ tzparse(const char *name, struct state * sp, int lastditch)
stdlen = name - stdname; stdlen = name - stdname;
} }
if (*name == '\0') /* we allow empty STD abbrev, unlike IANA */ if (*name == '\0') /* we allow empty STD abbrev, unlike IANA */
return -1; return false;
name = getoffset(name, &stdoffset); name = getoffset(name, &stdoffset);
if (name == NULL) if (name == NULL)
return -1; return false;
charcnt = stdlen + 1; charcnt = stdlen + 1;
if (sizeof sp->chars < charcnt) if (sizeof sp->chars < charcnt)
return -1; return false;
load_ok = tzload(TZDEFRULES, NULL, sp, false) == 0; load_ok = tzload(TZDEFRULES, NULL, sp, false) == 0;
} }
if (!load_ok) if (!load_ok)
@ -936,7 +933,7 @@ tzparse(const char *name, struct state * sp, int lastditch)
dstname = ++name; dstname = ++name;
name = getqzname(name, '>'); name = getqzname(name, '>');
if (*name != '>') if (*name != '>')
return -1; return false;
dstlen = name - dstname; dstlen = name - dstname;
name++; name++;
} }
@ -947,15 +944,15 @@ tzparse(const char *name, struct state * sp, int lastditch)
dstlen = name - dstname; /* length of DST zone name */ dstlen = name - dstname; /* length of DST zone name */
} }
if (!dstlen) if (!dstlen)
return -1; return false;
charcnt += dstlen + 1; charcnt += dstlen + 1;
if (sizeof sp->chars < charcnt) if (sizeof sp->chars < charcnt)
return -1; return false;
if (*name != '\0' && *name != ',' && *name != ';') if (*name != '\0' && *name != ',' && *name != ';')
{ {
name = getoffset(name, &dstoffset); name = getoffset(name, &dstoffset);
if (name == NULL) if (name == NULL)
return -1; return false;
} }
else else
dstoffset = stdoffset - SECSPERHOUR; dstoffset = stdoffset - SECSPERHOUR;
@ -972,13 +969,13 @@ tzparse(const char *name, struct state * sp, int lastditch)
++name; ++name;
if ((name = getrule(name, &start)) == NULL) if ((name = getrule(name, &start)) == NULL)
return -1; return false;
if (*name++ != ',') if (*name++ != ',')
return -1; return false;
if ((name = getrule(name, &end)) == NULL) if ((name = getrule(name, &end)) == NULL)
return -1; return false;
if (*name != '\0') if (*name != '\0')
return -1; return false;
sp->typecnt = 2; /* standard time and DST */ sp->typecnt = 2; /* standard time and DST */
/* /*
@ -1044,7 +1041,7 @@ tzparse(const char *name, struct state * sp, int lastditch)
int j; int j;
if (*name != '\0') if (*name != '\0')
return -1; return false;
/* /*
* Initial values of theirstdoffset and theirdstoffset. * Initial values of theirstdoffset and theirdstoffset.
@ -1148,7 +1145,7 @@ tzparse(const char *name, struct state * sp, int lastditch)
memcpy(cp, dstname, dstlen); memcpy(cp, dstname, dstlen);
*(cp + dstlen) = '\0'; *(cp + dstlen) = '\0';
} }
return 0; return true;
} }
static void static void

View File

@ -256,7 +256,7 @@ pg_tzset(const char *name)
*/ */
if (strcmp(uppername, "GMT") == 0) if (strcmp(uppername, "GMT") == 0)
{ {
if (tzparse(uppername, &tzstate, true) != 0) if (!tzparse(uppername, &tzstate, true))
{ {
/* This really, really should not happen ... */ /* This really, really should not happen ... */
elog(ERROR, "could not initialize GMT time zone"); elog(ERROR, "could not initialize GMT time zone");
@ -266,7 +266,7 @@ pg_tzset(const char *name)
} }
else if (tzload(uppername, canonname, &tzstate, true) != 0) else if (tzload(uppername, canonname, &tzstate, true) != 0)
{ {
if (uppername[0] == ':' || tzparse(uppername, &tzstate, false) != 0) if (uppername[0] == ':' || !tzparse(uppername, &tzstate, false))
{ {
/* Unknown timezone. Fail our call instead of loading GMT! */ /* Unknown timezone. Fail our call instead of loading GMT! */
return NULL; return NULL;

View File

@ -69,7 +69,7 @@ extern int pg_open_tzfile(const char *name, char *canonname);
/* in localtime.c */ /* in localtime.c */
extern int tzload(const char *name, char *canonname, struct state * sp, extern int tzload(const char *name, char *canonname, struct state * sp,
int doextend); bool doextend);
extern int tzparse(const char *name, struct state * sp, int lastditch); extern bool tzparse(const char *name, struct state * sp, bool lastditch);
#endif /* _PGTZ_H */ #endif /* _PGTZ_H */