mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Fix assorted breakage in to_char()'s OF format option.
In HEAD, fix incorrect field width for hours part of OF when tm_gmtoff is negative. This was introduced by commit2d87eedc1d
as a result of falsely applying a pattern that's correct when + signs are omitted, which is not the case for OF. In 9.4, fix missing abs() call that allowed a sign to be attached to the minutes part of OF. This was fixed in 9.5 by9b43d73b3f
, but for inscrutable reasons not back-patched. In all three versions, ensure that the sign of tm_gmtoff is correctly reported even when the GMT offset is less than 1 hour. Add regression tests, which evidently we desperately need here. Thomas Munro and Tom Lane, per report from David Fetter
This commit is contained in:
@ -2506,12 +2506,15 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col
|
||||
break;
|
||||
case DCH_OF:
|
||||
INVALID_FOR_INTERVAL;
|
||||
sprintf(s, "%+0*d", S_FM(n->suffix) ? 0 : (tm->tm_gmtoff >= 0) ? 3 : 4,
|
||||
(int) tm->tm_gmtoff / SECS_PER_HOUR);
|
||||
sprintf(s, "%c%0*d",
|
||||
(tm->tm_gmtoff >= 0) ? '+' : '-',
|
||||
S_FM(n->suffix) ? 0 : 2,
|
||||
abs((int) tm->tm_gmtoff) / SECS_PER_HOUR);
|
||||
s += strlen(s);
|
||||
if ((int) tm->tm_gmtoff % SECS_PER_HOUR != 0)
|
||||
if (abs((int) tm->tm_gmtoff) % SECS_PER_HOUR != 0)
|
||||
{
|
||||
sprintf(s, ":%02d", abs((int) tm->tm_gmtoff % SECS_PER_HOUR) / SECS_PER_MINUTE);
|
||||
sprintf(s, ":%02d",
|
||||
(abs((int) tm->tm_gmtoff) % SECS_PER_HOUR) / SECS_PER_MINUTE);
|
||||
s += strlen(s);
|
||||
}
|
||||
break;
|
||||
|
Reference in New Issue
Block a user