From 2c0870ff7ab9bda44f39dd332836d0928afb2297 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 7 Apr 2010 21:41:53 +0000 Subject: [PATCH] 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. --- src/backend/utils/adt/formatting.c | 65 +++++++++-------------- src/test/regress/expected/timestamp.out | 42 +++++++-------- src/test/regress/expected/timestamptz.out | 42 +++++++-------- 3 files changed, 68 insertions(+), 81 deletions(-) diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index cc4f8137db..e83a1d9014 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -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); diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index 0062f8f380..6def970d80 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -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) diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index 1096f28e6b..47e3394792 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -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)