Fix to_char YYY, YY, Y format codes so that FM zero-suppression really works,
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 7 Apr 2010 21:41:53 +0000 (21:41 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 7 Apr 2010 21:41:53 +0000 (21:41 +0000)
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
src/test/regress/expected/timestamp.out
src/test/regress/expected/timestamptz.out

index cc4f8137db0f4bc8b35472a7c9134c7e718f14c2..e83a1d901415b34e48d7a22b90af1a78c84f6c93 100644 (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);
index 0062f8f3807d74034e2c3bcf7e7dd8e888d53bcb..6def970d8002b776cc7ccb70a27a2821e5a587c5 100644 (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 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 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 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
 (65 rows)
 
index 1096f28e6bbe03c5010f7101ffc1a922a36114c7..47e339479225bf1c13739c9a8ce1c4001627115b 100644 (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 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 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 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
 (66 rows)