Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit70d8a2c

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 parent55ea144 commit70d8a2c

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
#defineS_th(_s)(((_s) & DCH_S_th) ? 1 : 0)
516516
#defineS_TH_TYPE(_s)(((_s) & DCH_S_TH) ? TH_UPPER : TH_LOWER)
517517

518+
/* Oracle toggles FM behavior, we don't; see docs. */
518519
#defineS_FM(_s)(((_s) & DCH_S_FM) ? 1 : 0)
519520
#defineS_SP(_s)(((_s) & DCH_S_SP) ? 1 : 0)
520521
#defineS_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
caseDCH_YYY:
24132414
caseDCH_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
caseDCH_YY:
24272429
caseDCH_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 97097 97 7 1 1 2 7 47 16 3 1686042
1067-
| 0,097 97097 97 7 1 1 2 7 47 16 7 1756536
1066+
| 0,097 9797 97 7 1 1 2 7 47 16 3 1686042
1067+
| 0,097 9797 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-
| 97097 97 7 7 44 2
1565-
| 97097 97 7 7 48 6
1564+
| 9797 97 7 7 44 2
1565+
| 9797 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 97097 97 7 1 1 2 7 47 16 3 1686042
1152-
| 0,097 97097 97 7 1 1 2 7 47 16 7 1756536
1151+
| 0,097 9797 97 7 1 1 2 7 47 16 3 1686042
1152+
| 0,097 9797 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-
| 97097 97 7 7 44 2
1659-
| 97097 97 7 7 48 6
1658+
| 9797 97 7 7 44 2
1659+
| 9797 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)

[8]ページ先頭

©2009-2025 Movatter.jp