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

Commitbdb2d69

Browse files
committed
Prevent to_char(interval) from dumping core on month-related formats
when a zero-month interval is given. Per discussion with Karel.
1 parent826f14f commitbdb2d69

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

‎src/backend/utils/adt/formatting.c

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* -----------------------------------------------------------------------
22
* formatting.c
33
*
4-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.49 2002/01/04 15:49:42 thomas Exp $
4+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.49.2.1 2005/03/26 00:42:56 tgl Exp $
55
*
66
*
77
* Portions Copyright (c) 1999-2000, PostgreSQL Global Development Group
@@ -1991,6 +1991,7 @@ static int
19911991
dch_date(intarg,char*inout,intsuf,intflag,FormatNode*node,void*data)
19921992
{
19931993
charbuff[DCH_CACHE_SIZE],
1994+
workbuff[32],
19941995
*p_inout;
19951996
inti,
19961997
len;
@@ -2113,21 +2114,27 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21132114
}
21142115
break;
21152116
caseDCH_MONTH:
2116-
strcpy(inout,months_full[tm->tm_mon-1]);
2117-
sprintf(inout,"%*s",S_FM(suf) ?0 :-9,str_toupper(inout));
2117+
if (!tm->tm_mon)
2118+
return-1;
2119+
strcpy(workbuff,months_full[tm->tm_mon-1]);
2120+
sprintf(inout,"%*s",S_FM(suf) ?0 :-9,str_toupper(workbuff));
21182121
if (S_FM(suf))
21192122
returnstrlen(p_inout)-1;
21202123
else
21212124
return8;
21222125

21232126
caseDCH_Month:
2127+
if (!tm->tm_mon)
2128+
return-1;
21242129
sprintf(inout,"%*s",S_FM(suf) ?0 :-9,months_full[tm->tm_mon-1]);
21252130
if (S_FM(suf))
21262131
returnstrlen(p_inout)-1;
21272132
else
21282133
return8;
21292134

21302135
caseDCH_month:
2136+
if (!tm->tm_mon)
2137+
return-1;
21312138
sprintf(inout,"%*s",S_FM(suf) ?0 :-9,months_full[tm->tm_mon-1]);
21322139
*inout=tolower((unsignedchar)*inout);
21332140
if (S_FM(suf))
@@ -2136,15 +2143,21 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21362143
return8;
21372144

21382145
caseDCH_MON:
2146+
if (!tm->tm_mon)
2147+
return-1;
21392148
strcpy(inout,months[tm->tm_mon-1]);
21402149
inout=str_toupper(inout);
21412150
return2;
21422151

21432152
caseDCH_Mon:
2153+
if (!tm->tm_mon)
2154+
return-1;
21442155
strcpy(inout,months[tm->tm_mon-1]);
21452156
return2;
21462157

21472158
caseDCH_mon:
2159+
if (!tm->tm_mon)
2160+
return-1;
21482161
strcpy(inout,months[tm->tm_mon-1]);
21492162
*inout=tolower((unsignedchar)*inout);
21502163
return2;
@@ -2159,7 +2172,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21592172
returnstrlen(p_inout)-1;
21602173
else
21612174
return1;
2162-
21632175
}
21642176
elseif (flag==FROM_CHAR)
21652177
{
@@ -2176,8 +2188,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21762188
}
21772189
break;
21782190
caseDCH_DAY:
2179-
strcpy(inout,days[tm->tm_wday]);
2180-
sprintf(inout,"%*s",S_FM(suf) ?0 :-9,str_toupper(inout));
2191+
strcpy(workbuff,days[tm->tm_wday]);
2192+
sprintf(inout,"%*s",S_FM(suf) ?0 :-9,str_toupper(workbuff));
21812193
if (S_FM(suf))
21822194
returnstrlen(p_inout)-1;
21832195
else
@@ -2319,7 +2331,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
23192331
returnstrlen(p_inout)-1;
23202332
else
23212333
return1;
2322-
23232334
}
23242335
elseif (flag==FROM_CHAR)
23252336
{
@@ -2338,14 +2349,15 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
23382349
caseDCH_Q:
23392350
if (flag==TO_CHAR)
23402351
{
2352+
if (!tm->tm_mon)
2353+
return-1;
23412354
sprintf(inout,"%d", (tm->tm_mon-1) /3+1);
23422355
if (S_THth(suf))
23432356
{
23442357
str_numth(p_inout,inout,S_TH_TYPE(suf));
23452358
return2;
23462359
}
23472360
return0;
2348-
23492361
}
23502362
elseif (flag==FROM_CHAR)
23512363
{
@@ -2515,6 +2527,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
25152527
caseDCH_RM:
25162528
if (flag==TO_CHAR)
25172529
{
2530+
if (!tm->tm_mon)
2531+
return-1;
25182532
sprintf(inout,"%*s",S_FM(suf) ?0 :-4,
25192533
rm_months_upper[12-tm->tm_mon]);
25202534
if (S_FM(suf))
@@ -2536,6 +2550,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
25362550
caseDCH_rm:
25372551
if (flag==TO_CHAR)
25382552
{
2553+
if (!tm->tm_mon)
2554+
return-1;
25392555
sprintf(inout,"%*s",S_FM(suf) ?0 :-4,
25402556
rm_months_lower[12-tm->tm_mon]);
25412557
if (S_FM(suf))

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp