Fix to_char YYY, YY, Y format codes so that FM zero-suppression really works,

rather than only sort-of working as the previous attempt had left it.
Clean up some unnecessary differences between the way these were coded and
the way the YYYY case was coded.  Update the regression test cases that
proved that it wasn't working.
This commit is contained in:
Tom Lane 2010-04-07 21:41:53 +00:00
parent 0f11ed5886
commit 2c0870ff7a
3 changed files with 68 additions and 81 deletions

View File

@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------
* formatting.c
*
* $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.169 2010/03/03 22:28:42 momjian Exp $
* $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.170 2010/04/07 21:41:53 tgl Exp $
*
*
* Portions Copyright (c) 1999-2010, PostgreSQL Global Development Group
@ -2044,7 +2044,6 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
FormatNode *n;
char *s;
struct pg_tm *tm = &in->tm;
char buff[DCH_CACHE_SIZE];
int i;
/* cache localized days and months */
@ -2394,67 +2393,55 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
break;
case DCH_YYYY:
case DCH_IYYY:
if (tm->tm_year <= 9999 && tm->tm_year >= -9998)
sprintf(s, "%0*d",
S_FM(n->suffix) ? 0 : 4,
n->key->id == DCH_YYYY ?
ADJUST_YEAR(tm->tm_year, is_interval) :
ADJUST_YEAR(date2isoyear(
tm->tm_year,
tm->tm_mon,
tm->tm_mday), is_interval));
else
sprintf(s, "%d",
n->key->id == DCH_YYYY ?
ADJUST_YEAR(tm->tm_year, is_interval) :
ADJUST_YEAR(date2isoyear(
tm->tm_year,
tm->tm_mon,
tm->tm_mday), is_interval));
sprintf(s, "%0*d",
S_FM(n->suffix) ? 0 : 4,
(n->key->id == DCH_YYYY ?
ADJUST_YEAR(tm->tm_year, is_interval) :
ADJUST_YEAR(date2isoyear(tm->tm_year,
tm->tm_mon,
tm->tm_mday),
is_interval)));
if (S_THth(n->suffix))
str_numth(s, s, S_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_YYY:
case DCH_IYY:
snprintf(buff, sizeof(buff), "%0*d",
S_FM(n->suffix) ? 0 : 3,
n->key->id == DCH_YYY ?
sprintf(s, "%0*d",
S_FM(n->suffix) ? 0 : 3,
(n->key->id == DCH_YYY ?
ADJUST_YEAR(tm->tm_year, is_interval) :
ADJUST_YEAR(date2isoyear(tm->tm_year,
tm->tm_mon, tm->tm_mday),
is_interval));
i = strlen(buff);
strcpy(s, buff + (i > 3 ? i - 3 : 0));
tm->tm_mon,
tm->tm_mday),
is_interval)) % 1000);
if (S_THth(n->suffix))
str_numth(s, s, S_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_YY:
case DCH_IY:
snprintf(buff, sizeof(buff), "%0*d",
S_FM(n->suffix) ? 0 : 2,
n->key->id == DCH_YY ?
sprintf(s, "%0*d",
S_FM(n->suffix) ? 0 : 2,
(n->key->id == DCH_YY ?
ADJUST_YEAR(tm->tm_year, is_interval) :
ADJUST_YEAR(date2isoyear(tm->tm_year,
tm->tm_mon, tm->tm_mday),
is_interval));
i = strlen(buff);
strcpy(s, buff + (i > 2 ? i - 2 : 0));
tm->tm_mon,
tm->tm_mday),
is_interval)) % 100);
if (S_THth(n->suffix))
str_numth(s, s, S_TH_TYPE(n->suffix));
s += strlen(s);
break;
case DCH_Y:
case DCH_I:
snprintf(buff, sizeof(buff), "%1d",
n->key->id == DCH_Y ?
sprintf(s, "%1d",
(n->key->id == DCH_Y ?
ADJUST_YEAR(tm->tm_year, is_interval) :
ADJUST_YEAR(date2isoyear(tm->tm_year,
tm->tm_mon, tm->tm_mday),
is_interval));
i = strlen(buff);
strcpy(s, buff + (i > 1 ? i - 1 : 0));
tm->tm_mon,
tm->tm_mday),
is_interval)) % 10);
if (S_THth(n->suffix))
str_numth(s, s, S_TH_TYPE(n->suffix));
s += strlen(s);

View File

@ -1037,12 +1037,12 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
| 1,997 1997 997 97 7 20 2 6 23 161 10 3 2450610
| 2,001 2001 001 01 1 21 3 9 38 265 22 7 2452175
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,001 2001 1 1 1 21 3 9 38 265 22 7 2452175
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
@ -1066,12 +1066,12 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
| 0,097 97 97 97 7 1 1 2 7 47 16 3 1686042
| 0,097 97 97 97 7 1 1 2 7 47 16 7 1756536
| 0,597 597 597 97 7 6 1 2 7 47 16 5 1939157
| 1,097 1097 097 97 7 11 1 2 7 47 16 3 2121778
| 1,097 1097 97 97 7 11 1 2 7 47 16 3 2121778
| 1,697 1697 697 97 7 17 1 2 7 47 16 7 2340924
| 1,797 1797 797 97 7 18 1 2 7 47 16 5 2377448
| 1,897 1897 897 97 7 19 1 2 7 47 16 3 2413972
| 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496
| 2,097 2097 097 97 7 21 1 2 7 47 16 7 2487021
| 2,097 2097 97 97 7 21 1 2 7 47 16 7 2487021
| 1,996 1996 996 96 6 20 1 2 9 59 28 4 2450142
| 1,996 1996 996 96 6 20 1 2 9 60 29 5 2450143
| 1,996 1996 996 96 6 20 1 3 9 61 1 6 2450144
@ -1083,9 +1083,9 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
| 1,997 1997 997 97 7 20 4 12 52 364 30 3 2450813
| 1,997 1997 997 97 7 20 4 12 53 365 31 4 2450814
| 1,999 1999 999 99 9 20 4 12 53 365 31 6 2451544
| 2,000 2000 000 00 0 20 1 1 1 1 1 7 2451545
| 2,000 2000 000 00 0 20 4 12 53 366 31 1 2451910
| 2,001 2001 001 01 1 21 1 1 1 1 1 2 2451911
| 2,000 2000 0 0 0 20 1 1 1 1 1 7 2451545
| 2,000 2000 0 0 0 20 4 12 53 366 31 1 2451910
| 2,001 2001 1 1 1 21 1 1 1 1 1 2 2451911
(65 rows)
SELECT '' AS to_char_5, to_char(d1, 'HH HH12 HH24 MI SS SSSS')
@ -1535,12 +1535,12 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
| 1997 997 97 7 7 43 1
| 1997 997 97 7 7 43 1
| 1997 997 97 7 24 163 2
| 2001 001 01 1 38 265 6
| 2000 000 00 0 11 73 3
| 2000 000 00 0 11 73 3
| 2000 000 00 0 11 73 3
| 2000 000 00 0 11 73 3
| 2000 000 00 0 11 73 3
| 2001 1 1 1 38 265 6
| 2000 0 0 0 11 73 3
| 2000 0 0 0 11 73 3
| 2000 0 0 0 11 73 3
| 2000 0 0 0 11 73 3
| 2000 0 0 0 11 73 3
| 1997 997 97 7 7 43 1
| 1997 997 97 7 7 43 1
| 1997 997 97 7 7 43 1
@ -1564,12 +1564,12 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
| 97 97 97 7 7 44 2
| 97 97 97 7 7 48 6
| 597 597 97 7 7 46 4
| 1097 097 97 7 7 44 2
| 1097 97 97 7 7 44 2
| 1697 697 97 7 7 48 6
| 1797 797 97 7 7 46 4
| 1897 897 97 7 7 44 2
| 1997 997 97 7 7 49 7
| 2097 097 97 7 7 48 6
| 2097 97 97 7 7 48 6
| 1996 996 96 6 9 59 3
| 1996 996 96 6 9 60 4
| 1996 996 96 6 9 61 5
@ -1582,7 +1582,7 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
| 1998 998 98 8 1 3 3
| 1999 999 99 9 52 362 5
| 1999 999 99 9 52 363 6
| 2000 000 00 0 52 364 7
| 2001 001 01 1 1 1 1
| 2000 0 0 0 52 364 7
| 2001 1 1 1 1 1 1
(65 rows)

View File

@ -1121,12 +1121,12 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
| 1,997 1997 997 97 7 20 2 6 23 161 10 3 2450610
| 2,001 2001 001 01 1 21 3 9 38 265 22 7 2452175
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
| 2,001 2001 1 1 1 21 3 9 38 265 22 7 2452175
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
@ -1151,12 +1151,12 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
| 0,097 97 97 97 7 1 1 2 7 47 16 3 1686042
| 0,097 97 97 97 7 1 1 2 7 47 16 7 1756536
| 0,597 597 597 97 7 6 1 2 7 47 16 5 1939157
| 1,097 1097 097 97 7 11 1 2 7 47 16 3 2121778
| 1,097 1097 97 97 7 11 1 2 7 47 16 3 2121778
| 1,697 1697 697 97 7 17 1 2 7 47 16 7 2340924
| 1,797 1797 797 97 7 18 1 2 7 47 16 5 2377448
| 1,897 1897 897 97 7 19 1 2 7 47 16 3 2413972
| 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496
| 2,097 2097 097 97 7 21 1 2 7 47 16 7 2487021
| 2,097 2097 97 97 7 21 1 2 7 47 16 7 2487021
| 1,996 1996 996 96 6 20 1 2 9 59 28 4 2450142
| 1,996 1996 996 96 6 20 1 2 9 60 29 5 2450143
| 1,996 1996 996 96 6 20 1 3 9 61 1 6 2450144
@ -1168,9 +1168,9 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
| 1,997 1997 997 97 7 20 4 12 52 364 30 3 2450813
| 1,997 1997 997 97 7 20 4 12 53 365 31 4 2450814
| 1,999 1999 999 99 9 20 4 12 53 365 31 6 2451544
| 2,000 2000 000 00 0 20 1 1 1 1 1 7 2451545
| 2,000 2000 000 00 0 20 4 12 53 366 31 1 2451910
| 2,001 2001 001 01 1 21 1 1 1 1 1 2 2451911
| 2,000 2000 0 0 0 20 1 1 1 1 1 7 2451545
| 2,000 2000 0 0 0 20 4 12 53 366 31 1 2451910
| 2,001 2001 1 1 1 21 1 1 1 1 1 2 2451911
(66 rows)
@ -1628,12 +1628,12 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
| 1997 997 97 7 7 43 1
| 1997 997 97 7 7 43 1
| 1997 997 97 7 24 163 2
| 2001 001 01 1 38 265 6
| 2000 000 00 0 11 73 3
| 2000 000 00 0 11 73 3
| 2000 000 00 0 11 73 3
| 2000 000 00 0 11 73 3
| 2000 000 00 0 11 73 3
| 2001 1 1 1 38 265 6
| 2000 0 0 0 11 73 3
| 2000 0 0 0 11 73 3
| 2000 0 0 0 11 73 3
| 2000 0 0 0 11 73 3
| 2000 0 0 0 11 73 3
| 1997 997 97 7 7 43 1
| 1997 997 97 7 7 43 1
| 1997 997 97 7 7 43 1
@ -1658,12 +1658,12 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
| 97 97 97 7 7 44 2
| 97 97 97 7 7 48 6
| 597 597 97 7 7 46 4
| 1097 097 97 7 7 44 2
| 1097 97 97 7 7 44 2
| 1697 697 97 7 7 48 6
| 1797 797 97 7 7 46 4
| 1897 897 97 7 7 44 2
| 1997 997 97 7 7 49 7
| 2097 097 97 7 7 48 6
| 2097 97 97 7 7 48 6
| 1996 996 96 6 9 59 3
| 1996 996 96 6 9 60 4
| 1996 996 96 6 9 61 5
@ -1676,7 +1676,7 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
| 1998 998 98 8 1 3 3
| 1999 999 99 9 52 362 5
| 1999 999 99 9 52 363 6
| 2000 000 00 0 52 364 7
| 2001 001 01 1 1 1 1
| 2000 0 0 0 52 364 7
| 2001 1 1 1 1 1 1
(66 rows)