Skip to content

Commit 2c0870f

Browse files
committed
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.
1 parent 0f11ed5 commit 2c0870f

File tree

3 files changed

+68
-81
lines changed

3 files changed

+68
-81
lines changed

src/backend/utils/adt/formatting.c

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* -----------------------------------------------------------------------
22
* formatting.c
33
*
4-
* $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.169 2010/03/03 22:28:42 momjian Exp $
4+
* $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.170 2010/04/07 21:41:53 tgl Exp $
55
*
66
*
77
* 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)
20442044
FormatNode *n;
20452045
char *s;
20462046
struct pg_tm *tm = &in->tm;
2047-
char buff[DCH_CACHE_SIZE];
20482047
int i;
20492048

20502049
/* cache localized days and months */
@@ -2394,67 +2393,55 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
23942393
break;
23952394
case DCH_YYYY:
23962395
case DCH_IYYY:
2397-
if (tm->tm_year <= 9999 && tm->tm_year >= -9998)
2398-
sprintf(s, "%0*d",
2399-
S_FM(n->suffix) ? 0 : 4,
2400-
n->key->id == DCH_YYYY ?
2401-
ADJUST_YEAR(tm->tm_year, is_interval) :
2402-
ADJUST_YEAR(date2isoyear(
2403-
tm->tm_year,
2404-
tm->tm_mon,
2405-
tm->tm_mday), is_interval));
2406-
else
2407-
sprintf(s, "%d",
2408-
n->key->id == DCH_YYYY ?
2409-
ADJUST_YEAR(tm->tm_year, is_interval) :
2410-
ADJUST_YEAR(date2isoyear(
2411-
tm->tm_year,
2412-
tm->tm_mon,
2413-
tm->tm_mday), is_interval));
2396+
sprintf(s, "%0*d",
2397+
S_FM(n->suffix) ? 0 : 4,
2398+
(n->key->id == DCH_YYYY ?
2399+
ADJUST_YEAR(tm->tm_year, is_interval) :
2400+
ADJUST_YEAR(date2isoyear(tm->tm_year,
2401+
tm->tm_mon,
2402+
tm->tm_mday),
2403+
is_interval)));
24142404
if (S_THth(n->suffix))
24152405
str_numth(s, s, S_TH_TYPE(n->suffix));
24162406
s += strlen(s);
24172407
break;
24182408
case DCH_YYY:
24192409
case DCH_IYY:
2420-
snprintf(buff, sizeof(buff), "%0*d",
2421-
S_FM(n->suffix) ? 0 : 3,
2422-
n->key->id == DCH_YYY ?
2410+
sprintf(s, "%0*d",
2411+
S_FM(n->suffix) ? 0 : 3,
2412+
(n->key->id == DCH_YYY ?
24232413
ADJUST_YEAR(tm->tm_year, is_interval) :
24242414
ADJUST_YEAR(date2isoyear(tm->tm_year,
2425-
tm->tm_mon, tm->tm_mday),
2426-
is_interval));
2427-
i = strlen(buff);
2428-
strcpy(s, buff + (i > 3 ? i - 3 : 0));
2415+
tm->tm_mon,
2416+
tm->tm_mday),
2417+
is_interval)) % 1000);
24292418
if (S_THth(n->suffix))
24302419
str_numth(s, s, S_TH_TYPE(n->suffix));
24312420
s += strlen(s);
24322421
break;
24332422
case DCH_YY:
24342423
case DCH_IY:
2435-
snprintf(buff, sizeof(buff), "%0*d",
2436-
S_FM(n->suffix) ? 0 : 2,
2437-
n->key->id == DCH_YY ?
2424+
sprintf(s, "%0*d",
2425+
S_FM(n->suffix) ? 0 : 2,
2426+
(n->key->id == DCH_YY ?
24382427
ADJUST_YEAR(tm->tm_year, is_interval) :
24392428
ADJUST_YEAR(date2isoyear(tm->tm_year,
2440-
tm->tm_mon, tm->tm_mday),
2441-
is_interval));
2442-
i = strlen(buff);
2443-
strcpy(s, buff + (i > 2 ? i - 2 : 0));
2429+
tm->tm_mon,
2430+
tm->tm_mday),
2431+
is_interval)) % 100);
24442432
if (S_THth(n->suffix))
24452433
str_numth(s, s, S_TH_TYPE(n->suffix));
24462434
s += strlen(s);
24472435
break;
24482436
case DCH_Y:
24492437
case DCH_I:
2450-
snprintf(buff, sizeof(buff), "%1d",
2451-
n->key->id == DCH_Y ?
2438+
sprintf(s, "%1d",
2439+
(n->key->id == DCH_Y ?
24522440
ADJUST_YEAR(tm->tm_year, is_interval) :
24532441
ADJUST_YEAR(date2isoyear(tm->tm_year,
2454-
tm->tm_mon, tm->tm_mday),
2455-
is_interval));
2456-
i = strlen(buff);
2457-
strcpy(s, buff + (i > 1 ? i - 1 : 0));
2442+
tm->tm_mon,
2443+
tm->tm_mday),
2444+
is_interval)) % 10);
24582445
if (S_THth(n->suffix))
24592446
str_numth(s, s, S_TH_TYPE(n->suffix));
24602447
s += strlen(s);

src/test/regress/expected/timestamp.out

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,12 +1037,12 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
10371037
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
10381038
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
10391039
| 1,997 1997 997 97 7 20 2 6 23 161 10 3 2450610
1040-
| 2,001 2001 001 01 1 21 3 9 38 265 22 7 2452175
1041-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1042-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1043-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1044-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1045-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1040+
| 2,001 2001 1 1 1 21 3 9 38 265 22 7 2452175
1041+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
1042+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
1043+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
1044+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
1045+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
10461046
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
10471047
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
10481048
| 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
10661066
| 0,097 97 97 97 7 1 1 2 7 47 16 3 1686042
10671067
| 0,097 97 97 97 7 1 1 2 7 47 16 7 1756536
10681068
| 0,597 597 597 97 7 6 1 2 7 47 16 5 1939157
1069-
| 1,097 1097 097 97 7 11 1 2 7 47 16 3 2121778
1069+
| 1,097 1097 97 97 7 11 1 2 7 47 16 3 2121778
10701070
| 1,697 1697 697 97 7 17 1 2 7 47 16 7 2340924
10711071
| 1,797 1797 797 97 7 18 1 2 7 47 16 5 2377448
10721072
| 1,897 1897 897 97 7 19 1 2 7 47 16 3 2413972
10731073
| 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496
1074-
| 2,097 2097 097 97 7 21 1 2 7 47 16 7 2487021
1074+
| 2,097 2097 97 97 7 21 1 2 7 47 16 7 2487021
10751075
| 1,996 1996 996 96 6 20 1 2 9 59 28 4 2450142
10761076
| 1,996 1996 996 96 6 20 1 2 9 60 29 5 2450143
10771077
| 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
10831083
| 1,997 1997 997 97 7 20 4 12 52 364 30 3 2450813
10841084
| 1,997 1997 997 97 7 20 4 12 53 365 31 4 2450814
10851085
| 1,999 1999 999 99 9 20 4 12 53 365 31 6 2451544
1086-
| 2,000 2000 000 00 0 20 1 1 1 1 1 7 2451545
1087-
| 2,000 2000 000 00 0 20 4 12 53 366 31 1 2451910
1088-
| 2,001 2001 001 01 1 21 1 1 1 1 1 2 2451911
1086+
| 2,000 2000 0 0 0 20 1 1 1 1 1 7 2451545
1087+
| 2,000 2000 0 0 0 20 4 12 53 366 31 1 2451910
1088+
| 2,001 2001 1 1 1 21 1 1 1 1 1 2 2451911
10891089
(65 rows)
10901090

10911091
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')
15351535
| 1997 997 97 7 7 43 1
15361536
| 1997 997 97 7 7 43 1
15371537
| 1997 997 97 7 24 163 2
1538-
| 2001 001 01 1 38 265 6
1539-
| 2000 000 00 0 11 73 3
1540-
| 2000 000 00 0 11 73 3
1541-
| 2000 000 00 0 11 73 3
1542-
| 2000 000 00 0 11 73 3
1543-
| 2000 000 00 0 11 73 3
1538+
| 2001 1 1 1 38 265 6
1539+
| 2000 0 0 0 11 73 3
1540+
| 2000 0 0 0 11 73 3
1541+
| 2000 0 0 0 11 73 3
1542+
| 2000 0 0 0 11 73 3
1543+
| 2000 0 0 0 11 73 3
15441544
| 1997 997 97 7 7 43 1
15451545
| 1997 997 97 7 7 43 1
15461546
| 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')
15641564
| 97 97 97 7 7 44 2
15651565
| 97 97 97 7 7 48 6
15661566
| 597 597 97 7 7 46 4
1567-
| 1097 097 97 7 7 44 2
1567+
| 1097 97 97 7 7 44 2
15681568
| 1697 697 97 7 7 48 6
15691569
| 1797 797 97 7 7 46 4
15701570
| 1897 897 97 7 7 44 2
15711571
| 1997 997 97 7 7 49 7
1572-
| 2097 097 97 7 7 48 6
1572+
| 2097 97 97 7 7 48 6
15731573
| 1996 996 96 6 9 59 3
15741574
| 1996 996 96 6 9 60 4
15751575
| 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')
15821582
| 1998 998 98 8 1 3 3
15831583
| 1999 999 99 9 52 362 5
15841584
| 1999 999 99 9 52 363 6
1585-
| 2000 000 00 0 52 364 7
1586-
| 2001 001 01 1 1 1 1
1585+
| 2000 0 0 0 52 364 7
1586+
| 2001 1 1 1 1 1 1
15871587
(65 rows)
15881588

src/test/regress/expected/timestamptz.out

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,12 +1121,12 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
11211121
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
11221122
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
11231123
| 1,997 1997 997 97 7 20 2 6 23 161 10 3 2450610
1124-
| 2,001 2001 001 01 1 21 3 9 38 265 22 7 2452175
1125-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1126-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1127-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1128-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1129-
| 2,000 2000 000 00 0 20 1 3 11 75 15 4 2451619
1124+
| 2,001 2001 1 1 1 21 3 9 38 265 22 7 2452175
1125+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
1126+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
1127+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
1128+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
1129+
| 2,000 2000 0 0 0 20 1 3 11 75 15 4 2451619
11301130
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
11311131
| 1,997 1997 997 97 7 20 1 2 6 41 10 2 2450490
11321132
| 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
11511151
| 0,097 97 97 97 7 1 1 2 7 47 16 3 1686042
11521152
| 0,097 97 97 97 7 1 1 2 7 47 16 7 1756536
11531153
| 0,597 597 597 97 7 6 1 2 7 47 16 5 1939157
1154-
| 1,097 1097 097 97 7 11 1 2 7 47 16 3 2121778
1154+
| 1,097 1097 97 97 7 11 1 2 7 47 16 3 2121778
11551155
| 1,697 1697 697 97 7 17 1 2 7 47 16 7 2340924
11561156
| 1,797 1797 797 97 7 18 1 2 7 47 16 5 2377448
11571157
| 1,897 1897 897 97 7 19 1 2 7 47 16 3 2413972
11581158
| 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496
1159-
| 2,097 2097 097 97 7 21 1 2 7 47 16 7 2487021
1159+
| 2,097 2097 97 97 7 21 1 2 7 47 16 7 2487021
11601160
| 1,996 1996 996 96 6 20 1 2 9 59 28 4 2450142
11611161
| 1,996 1996 996 96 6 20 1 2 9 60 29 5 2450143
11621162
| 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
11681168
| 1,997 1997 997 97 7 20 4 12 52 364 30 3 2450813
11691169
| 1,997 1997 997 97 7 20 4 12 53 365 31 4 2450814
11701170
| 1,999 1999 999 99 9 20 4 12 53 365 31 6 2451544
1171-
| 2,000 2000 000 00 0 20 1 1 1 1 1 7 2451545
1172-
| 2,000 2000 000 00 0 20 4 12 53 366 31 1 2451910
1173-
| 2,001 2001 001 01 1 21 1 1 1 1 1 2 2451911
1171+
| 2,000 2000 0 0 0 20 1 1 1 1 1 7 2451545
1172+
| 2,000 2000 0 0 0 20 4 12 53 366 31 1 2451910
1173+
| 2,001 2001 1 1 1 21 1 1 1 1 1 2 2451911
11741174
(66 rows)
11751175

11761176

@@ -1628,12 +1628,12 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
16281628
| 1997 997 97 7 7 43 1
16291629
| 1997 997 97 7 7 43 1
16301630
| 1997 997 97 7 24 163 2
1631-
| 2001 001 01 1 38 265 6
1632-
| 2000 000 00 0 11 73 3
1633-
| 2000 000 00 0 11 73 3
1634-
| 2000 000 00 0 11 73 3
1635-
| 2000 000 00 0 11 73 3
1636-
| 2000 000 00 0 11 73 3
1631+
| 2001 1 1 1 38 265 6
1632+
| 2000 0 0 0 11 73 3
1633+
| 2000 0 0 0 11 73 3
1634+
| 2000 0 0 0 11 73 3
1635+
| 2000 0 0 0 11 73 3
1636+
| 2000 0 0 0 11 73 3
16371637
| 1997 997 97 7 7 43 1
16381638
| 1997 997 97 7 7 43 1
16391639
| 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')
16581658
| 97 97 97 7 7 44 2
16591659
| 97 97 97 7 7 48 6
16601660
| 597 597 97 7 7 46 4
1661-
| 1097 097 97 7 7 44 2
1661+
| 1097 97 97 7 7 44 2
16621662
| 1697 697 97 7 7 48 6
16631663
| 1797 797 97 7 7 46 4
16641664
| 1897 897 97 7 7 44 2
16651665
| 1997 997 97 7 7 49 7
1666-
| 2097 097 97 7 7 48 6
1666+
| 2097 97 97 7 7 48 6
16671667
| 1996 996 96 6 9 59 3
16681668
| 1996 996 96 6 9 60 4
16691669
| 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')
16761676
| 1998 998 98 8 1 3 3
16771677
| 1999 999 99 9 52 362 5
16781678
| 1999 999 99 9 52 363 6
1679-
| 2000 000 00 0 52 364 7
1680-
| 2001 001 01 1 1 1 1
1679+
| 2000 0 0 0 52 364 7
1680+
| 2001 1 1 1 1 1 1
16811681
(66 rows)
16821682

0 commit comments

Comments
 (0)