aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-05-05 17:38:26 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-05-05 17:38:26 +0000
commitc0e9dc1229e2c783fa9191d6d6ac8698d115f1ea (patch)
tree6e65a96cbcd938d8838f84984fa2345061583637
parent846429e3d64fed9f82cae0429897e997fa5c0281 (diff)
downloadpostgresql-c0e9dc1229e2c783fa9191d6d6ac8698d115f1ea.tar.gz
postgresql-c0e9dc1229e2c783fa9191d6d6ac8698d115f1ea.zip
plpgsql_dstring_append was broken for long strings.
-rw-r--r--src/pl/plpgsql/src/pl_funcs.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/pl/plpgsql/src/pl_funcs.c b/src/pl/plpgsql/src/pl_funcs.c
index 6a503505c4c..f64604bd70f 100644
--- a/src/pl/plpgsql/src/pl_funcs.c
+++ b/src/pl/plpgsql/src/pl_funcs.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.17 2001/11/15 23:31:09 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.18 2002/05/05 17:38:26 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -64,6 +64,7 @@ plpgsql_dstring_init(PLpgSQL_dstring * ds)
{
ds->value = palloc(ds->alloc = 512);
ds->used = 0;
+ ds->value[0] = '\0';
}
@@ -86,10 +87,14 @@ void
plpgsql_dstring_append(PLpgSQL_dstring * ds, char *str)
{
int len = strlen(str);
+ int needed = ds->used + len + 1;
- if (ds->used + len + 1 > ds->alloc)
+ if (needed > ds->alloc)
{
- ds->alloc *= 2;
+ /* might have to double more than once, if len is large */
+ do {
+ ds->alloc *= 2;
+ } while (needed > ds->alloc);
ds->value = repalloc(ds->value, ds->alloc);
}