8000 Prevent to_char(interval) from dumping core on month-related formats · postgres/postgres@bdb2d69 · GitHub
[go: up one dir, main page]

Skip to content

Commit bdb2d69

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 parent 826f14f commit bdb2d69

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(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
19921992
{
19931993
char buff[DCH_CACHE_SIZE],
1994+
workbuff[32],
19941995
*p_inout;
19951996
int i,
19961997
len;
@@ -2113,21 +2114,27 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21132114
}
21142115
break;
21152116
case DCH_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
return strlen(p_inout) - 1;
21202123
else
21212124
return 8;
21222125

21232126
case DCH_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
return strlen(p_inout) - 1;
21272132
else
21282133
return 8;
21292134

21302135
case DCH_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((unsigned char) *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
return 8;
21372144

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

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

21472158
case DCH_mon:
2159+
if (!tm->tm_mon)
2160+
return -1;
21482161
strcpy(inout, months[tm->tm_mon - 1]);
21492162
*inout = tolower((unsigned char) *inout);
21502163
return 2;
@@ -2159,7 +2172,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21592172
return strlen(p_inout) - 1;
21602173
else
21612174
return 1;
2162-
21632175
}
21642176
else if (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
case DCH_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
return strlen(p_inout) - 1;
21832195
else
@@ -2319,7 +2331,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
23192331
return strlen(p_inout) - 1;
23202332
else
23212333
return 1;
2322-
23232334
}
23242335
else if (flag == FROM_CHAR)
23252336
{
@@ -2338,14 +2349,15 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
23382349
case DCH_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
return 2;
23462359
}
23472360
return 0;
2348-
23492361
}
23502362
else if (flag == FROM_CHAR)
23512363
{
@@ -2515,6 +2527,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
25152527
case DCH_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
case DCH_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)
0