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)