1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-26 23:43:30 +03:00

Prevent to_char(interval) from dumping core on month-related formats

when a zero-month interval is given.  Per discussion with Karel.
This commit is contained in:
Tom Lane
2005-03-26 00:42:44 +00:00
parent ce49ae9041
commit 536b3af7e3

View File

@@ -1,7 +1,7 @@
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
* formatting.c * formatting.c
* *
* $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.56.2.2 2003/09/03 19:01:35 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.56.2.3 2005/03/26 00:42:44 tgl Exp $
* *
* *
* Portions Copyright (c) 1999-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1999-2002, PostgreSQL Global Development Group
@@ -2001,6 +2001,7 @@ static int
dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data) dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
{ {
char buff[DCH_CACHE_SIZE], char buff[DCH_CACHE_SIZE],
workbuff[32],
*p_inout; *p_inout;
int i, int i,
len; len;
@@ -2123,14 +2124,18 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
} }
break; break;
case DCH_MONTH: case DCH_MONTH:
strcpy(inout, months_full[tm->tm_mon - 1]); if (!tm->tm_mon)
sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, str_toupper(inout)); return -1;
strcpy(workbuff, months_full[tm->tm_mon - 1]);
sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, str_toupper(workbuff));
if (S_FM(suf)) if (S_FM(suf))
return strlen(p_inout) - 1; return strlen(p_inout) - 1;
else else
return 8; return 8;
case DCH_Month: case DCH_Month:
if (!tm->tm_mon)
return -1;
sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, months_full[tm->tm_mon - 1]); sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, months_full[tm->tm_mon - 1]);
if (S_FM(suf)) if (S_FM(suf))
return strlen(p_inout) - 1; return strlen(p_inout) - 1;
@@ -2138,6 +2143,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
return 8; return 8;
case DCH_month: case DCH_month:
if (!tm->tm_mon)
return -1;
sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, months_full[tm->tm_mon - 1]); sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, months_full[tm->tm_mon - 1]);
*inout = tolower((unsigned char) *inout); *inout = tolower((unsigned char) *inout);
if (S_FM(suf)) if (S_FM(suf))
@@ -2146,15 +2153,21 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
return 8; return 8;
case DCH_MON: case DCH_MON:
if (!tm->tm_mon)
return -1;
strcpy(inout, months[tm->tm_mon - 1]); strcpy(inout, months[tm->tm_mon - 1]);
inout = str_toupper(inout); inout = str_toupper(inout);
return 2; return 2;
case DCH_Mon: case DCH_Mon:
if (!tm->tm_mon)
return -1;
strcpy(inout, months[tm->tm_mon - 1]); strcpy(inout, months[tm->tm_mon - 1]);
return 2; return 2;
case DCH_mon: case DCH_mon:
if (!tm->tm_mon)
return -1;
strcpy(inout, months[tm->tm_mon - 1]); strcpy(inout, months[tm->tm_mon - 1]);
*inout = tolower((unsigned char) *inout); *inout = tolower((unsigned char) *inout);
return 2; return 2;
@@ -2169,7 +2182,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
return strlen(p_inout) - 1; return strlen(p_inout) - 1;
else else
return 1; return 1;
} }
else if (flag == FROM_CHAR) else if (flag == FROM_CHAR)
{ {
@@ -2186,8 +2198,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
} }
break; break;
case DCH_DAY: case DCH_DAY:
strcpy(inout, days[tm->tm_wday]); strcpy(workbuff, days[tm->tm_wday]);
sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, str_toupper(inout)); sprintf(inout, "%*s", S_FM(suf) ? 0 : -9, str_toupper(workbuff));
if (S_FM(suf)) if (S_FM(suf))
return strlen(p_inout) - 1; return strlen(p_inout) - 1;
else else
@@ -2329,7 +2341,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
return strlen(p_inout) - 1; return strlen(p_inout) - 1;
else else
return 1; return 1;
} }
else if (flag == FROM_CHAR) else if (flag == FROM_CHAR)
{ {
@@ -2348,6 +2359,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
case DCH_Q: case DCH_Q:
if (flag == TO_CHAR) if (flag == TO_CHAR)
{ {
if (!tm->tm_mon)
return -1;
sprintf(inout, "%d", (tm->tm_mon - 1) / 3 + 1); sprintf(inout, "%d", (tm->tm_mon - 1) / 3 + 1);
if (S_THth(suf)) if (S_THth(suf))
{ {
@@ -2355,7 +2368,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
return 2; return 2;
} }
return 0; return 0;
} }
else if (flag == FROM_CHAR) else if (flag == FROM_CHAR)
{ {
@@ -2523,6 +2535,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
case DCH_RM: case DCH_RM:
if (flag == TO_CHAR) if (flag == TO_CHAR)
{ {
if (!tm->tm_mon)
return -1;
sprintf(inout, "%*s", S_FM(suf) ? 0 : -4, sprintf(inout, "%*s", S_FM(suf) ? 0 : -4,
rm_months_upper[12 - tm->tm_mon]); rm_months_upper[12 - tm->tm_mon]);
if (S_FM(suf)) if (S_FM(suf))
@@ -2544,6 +2558,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
case DCH_rm: case DCH_rm:
if (flag == TO_CHAR) if (flag == TO_CHAR)
{ {
if (!tm->tm_mon)
return -1;
sprintf(inout, "%*s", S_FM(suf) ? 0 : -4, sprintf(inout, "%*s", S_FM(suf) ? 0 : -4,
rm_months_lower[12 - tm->tm_mon]); rm_months_lower[12 - tm->tm_mon]);
if (S_FM(suf)) if (S_FM(suf))