Skip to content

Commit 70d8a2c

Browse files
committed
Honor to_char() "FM" specification in YYY, YY, and Y; it was already
honored by YYYY. Also document Oracle "toggle" FM behavior. Per report from Guy Rouillier
1 parent 55ea144 commit 70d8a2c

File tree

4 files changed

+23
-16
lines changed

4 files changed

+23
-16
lines changed

doc/src/sgml/func.sgml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.502 2010/02/12 17:33:19 tgl Exp $ -->
1+
<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.503 2010/02/16 21:18:01 momjian Exp $ -->
22

33
<chapter id="functions">
44
<title>Functions and Operators</title>
@@ -5174,7 +5174,11 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
51745174
<para>
51755175
<literal>FM</literal> suppresses leading zeroes and trailing blanks
51765176
that would otherwise be added to make the output of a pattern be
5177-
fixed-width.
5177+
fixed-width. In <productname>PostgreSQL</productname>,
5178+
<literal>FM</literal> modifies only the next specification, while in
5179+
Oracle <literal>FM</literal> affects all subsequent
5180+
specifications, and repeated <literal>FM</literal> modifiers
5181+
toggle fill mode on and off.
51785182
</para>
51795183
</listitem>
51805184

src/backend/utils/adt/formatting.c

Lines changed: 9 additions & 6 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.162 2010/01/02 16:57:53 momjian Exp $
4+
* $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.163 2010/02/16 21:18:01 momjian Exp $
55
*
66
*
77
* Portions Copyright (c) 1999-2010, PostgreSQL Global Development Group
@@ -515,6 +515,7 @@ do { \
515515
#define S_th(_s) (((_s) & DCH_S_th) ? 1 : 0)
516516
#define S_TH_TYPE(_s) (((_s) & DCH_S_TH) ? TH_UPPER : TH_LOWER)
517517

518+
/* Oracle toggles FM behavior, we don't; see docs. */
518519
#define S_FM(_s) (((_s) & DCH_S_FM) ? 1 : 0)
519520
#define S_SP(_s) (((_s) & DCH_S_SP) ? 1 : 0)
520521
#define S_TM(_s) (((_s) & DCH_S_TM) ? 1 : 0)
@@ -2411,28 +2412,30 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
24112412
break;
24122413
case DCH_YYY:
24132414
case DCH_IYY:
2414-
snprintf(buff, sizeof(buff), "%03d",
2415+
snprintf(buff, sizeof(buff), "%0*d",
2416+
S_FM(n->suffix) ? 0 : 3,
24152417
n->key->id == DCH_YYY ?
24162418
ADJUST_YEAR(tm->tm_year, is_interval) :
24172419
ADJUST_YEAR(date2isoyear(tm->tm_year,
24182420
tm->tm_mon, tm->tm_mday),
24192421
is_interval));
24202422
i = strlen(buff);
2421-
strcpy(s, buff + (i - 3));
2423+
strcpy(s, buff + (i > 3 ? i - 3 : 0));
24222424
if (S_THth(n->suffix))
24232425
str_numth(s, s, S_TH_TYPE(n->suffix));
24242426
s += strlen(s);
24252427
break;
24262428
case DCH_YY:
24272429
case DCH_IY:
2428-
snprintf(buff, sizeof(buff), "%02d",
2430+
snprintf(buff, sizeof(buff), "%0*d",
2431+
S_FM(n->suffix) ? 0 : 2,
24292432
n->key->id == DCH_YY ?
24302433
ADJUST_YEAR(tm->tm_year, is_interval) :
24312434
ADJUST_YEAR(date2isoyear(tm->tm_year,
24322435
tm->tm_mon, tm->tm_mday),
24332436
is_interval));
24342437
i = strlen(buff);
2435-
strcpy(s, buff + (i - 2));
2438+
strcpy(s, buff + (i > 2 ? i - 2 : 0));
24362439
if (S_THth(n->suffix))
24372440
str_numth(s, s, S_TH_TYPE(n->suffix));
24382441
s += strlen(s);
@@ -2446,7 +2449,7 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out)
24462449
tm->tm_mon, tm->tm_mday),
24472450
is_interval));
24482451
i = strlen(buff);
2449-
strcpy(s, buff + (i - 1));
2452+
strcpy(s, buff + (i > 1 ? i - 1 : 0));
24502453
if (S_THth(n->suffix))
24512454
str_numth(s, s, S_TH_TYPE(n->suffix));
24522455
s += strlen(s);

src/test/regress/expected/timestamp.out

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,8 +1063,8 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
10631063
| 1,997 1997 997 97 7 20 1 2 7 45 14 6 2450494
10641064
| 1,997 1997 997 97 7 20 1 2 7 46 15 7 2450495
10651065
| 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496
1066-
| 0,097 97 097 97 7 1 1 2 7 47 16 3 1686042
1067-
| 0,097 97 097 97 7 1 1 2 7 47 16 7 1756536
1066+
| 0,097 97 97 97 7 1 1 2 7 47 16 3 1686042
1067+
| 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
10691069
| 1,097 1097 097 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
@@ -1561,8 +1561,8 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
15611561
| 1997 997 97 7 7 47 5
15621562
| 1997 997 97 7 7 48 6
15631563
| 1997 997 97 7 7 49 7
1564-
| 97 097 97 7 7 44 2
1565-
| 97 097 97 7 7 48 6
1564+
| 97 97 97 7 7 44 2
1565+
| 97 97 97 7 7 48 6
15661566
| 597 597 97 7 7 46 4
15671567
| 1097 097 97 7 7 44 2
15681568
| 1697 697 97 7 7 48 6

src/test/regress/expected/timestamptz.out

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,8 +1148,8 @@ SELECT '' AS to_char_4, to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM
11481148
| 1,997 1997 997 97 7 20 1 2 7 45 14 6 2450494
11491149
| 1,997 1997 997 97 7 20 1 2 7 46 15 7 2450495
11501150
| 1,997 1997 997 97 7 20 1 2 7 47 16 1 2450496
1151-
| 0,097 97 097 97 7 1 1 2 7 47 16 3 1686042
1152-
| 0,097 97 097 97 7 1 1 2 7 47 16 7 1756536
1151+
| 0,097 97 97 97 7 1 1 2 7 47 16 3 1686042
1152+
| 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
11541154
| 1,097 1097 097 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
@@ -1655,8 +1655,8 @@ SELECT '' AS to_char_11, to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
16551655
| 1997 997 97 7 7 47 5
16561656
| 1997 997 97 7 7 48 6
16571657
| 1997 997 97 7 7 49 7
1658-
| 97 097 97 7 7 44 2
1659-
| 97 097 97 7 7 48 6
1658+
| 97 97 97 7 7 44 2
1659+
| 97 97 97 7 7 48 6
16601660
| 597 597 97 7 7 46 4
16611661
| 1097 097 97 7 7 44 2
16621662
| 1697 697 97 7 7 48 6

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy