aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/formatting.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-12-01 05:17:19 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-12-01 05:17:19 +0000
commiteb743d0f9895b150fd26884ee2088bd9d9dc0c68 (patch)
treec44e333d3e5b3b320300321da55dbe1c4ecb77e5 /src/backend/utils/adt/formatting.c
parentdd2b56d6233ead38659d963f6557ca1cb7ab7dcb (diff)
downloadpostgresql-eb743d0f9895b150fd26884ee2088bd9d9dc0c68.tar.gz
postgresql-eb743d0f9895b150fd26884ee2088bd9d9dc0c68.zip
It seems appropriate that the extended MEMORY_CONTEXT_CHECKING code
immediately uncovered three of Karel's own bugs, including a routine that scribbled on its input (naughty naughty!)
Diffstat (limited to 'src/backend/utils/adt/formatting.c')
-rw-r--r--src/backend/utils/adt/formatting.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
index 4e89790a4b9..7602848eb92 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------
* formatting.c
*
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.24 2000/11/25 05:00:29 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.25 2000/12/01 05:17:19 tgl Exp $
*
*
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -2521,7 +2521,7 @@ timestamp_to_char(PG_FUNCTION_ARGS)
tm->tm_yday = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - date2j(tm->tm_year, 1, 1) + 1;
/* ----------
- * Convert VARDATA() to string
+ * Convert fmt to C string
* ----------
*/
str = (char *) palloc(len + 1);
@@ -2623,15 +2623,17 @@ timestamp_to_char(PG_FUNCTION_ARGS)
Datum
to_timestamp(PG_FUNCTION_ARGS)
{
- text *date_str = PG_GETARG_TEXT_P(0);
+ text *date_txt = PG_GETARG_TEXT_P(0);
text *fmt = PG_GETARG_TEXT_P(1);
FormatNode *format;
int flag = 0;
Timestamp result;
char *str;
- int len = 0,
- fsec = 0,
- tz = 0;
+ char *date_str;
+ int len,
+ date_len,
+ fsec = 0,
+ tz = 0;
ZERO_tm(tm);
ZERO_tmfc(tmfc);
@@ -2642,7 +2644,7 @@ to_timestamp(PG_FUNCTION_ARGS)
{
/* ----------
- * Convert VARDATA() to string
+ * Convert fmt to C string
* ----------
*/
str = (char *) palloc(len + 1);
@@ -2704,11 +2706,20 @@ to_timestamp(PG_FUNCTION_ARGS)
#ifdef DEBUG_TO_FROM_CHAR
/* dump_node(format, len); */
#endif
- VARDATA(date_str)[VARSIZE(date_str) - VARHDRSZ] = '\0';
- DCH_processor(format, VARDATA(date_str), FROM_CHAR);
- pfree(str);
+ /* ----------
+ * Convert date to C string
+ * ----------
+ */
+ date_len = VARSIZE(date_txt) - VARHDRSZ;
+ date_str = (char *) palloc(date_len + 1);
+ memcpy(date_str, VARDATA(date_txt), date_len);
+ *(date_str + date_len) = '\0';
+ DCH_processor(format, date_str, FROM_CHAR);
+
+ pfree(date_str);
+ pfree(str);
if (flag)
pfree(format);
}
@@ -4325,13 +4336,13 @@ int4_to_char(PG_FUNCTION_ARGS)
{
int i;
- numstr = palloc(len + 1 + Num.post);
+ numstr = (char *) palloc(len + Num.post + 2);
strcpy(numstr, orgnum + (*orgnum == '-' ? 1 : 0));
*(numstr + len) = '.';
- for (i = len + 1; i <= Num.post + len + 1; i++)
+ for (i = len + 1; i <= len + Num.post; i++)
*(numstr + i) = '0';
- *(numstr + Num.post + len + 1) = '\0';
+ *(numstr + len + Num.post + 1) = '\0';
pfree(orgnum);
orgnum = numstr;
}
@@ -4413,13 +4424,13 @@ int8_to_char(PG_FUNCTION_ARGS)
{
int i;
- numstr = palloc(len + 1 + Num.post);
+ numstr = (char *) palloc(len + Num.post + 2);
strcpy(numstr, orgnum + (*orgnum == '-' ? 1 : 0));
*(numstr + len) = '.';
- for (i = len + 1; i <= Num.post + len + 1; i++)
+ for (i = len + 1; i <= len + Num.post; i++)
*(numstr + i) = '0';
- *(numstr + Num.post + len + 1) = '\0';
+ *(numstr + len + Num.post + 1) = '\0';
pfree(orgnum);
orgnum = numstr;
}