summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/lib/Makefile1
-rw-r--r--src/bin/pg_waldump/compat.c27
-rw-r--r--src/bin/pg_waldump/pg_waldump.c7
-rw-r--r--src/common/Makefile1
-rw-r--r--src/common/stringinfo.c (renamed from src/backend/lib/stringinfo.c)47
-rw-r--r--src/include/lib/stringinfo.h7
-rw-r--r--src/tools/msvc/Mkvcbuild.pm2
7 files changed, 49 insertions, 43 deletions
diff --git a/src/backend/lib/Makefile b/src/backend/lib/Makefile
index dbea67bc379..9dad31398ae 100644
--- a/src/backend/lib/Makefile
+++ b/src/backend/lib/Makefile
@@ -23,6 +23,5 @@ OBJS = \
knapsack.o \
pairingheap.o \
rbtree.o \
- stringinfo.o
include $(top_srcdir)/src/backend/common.mk
diff --git a/src/bin/pg_waldump/compat.c b/src/bin/pg_waldump/compat.c
index 7b389a20c96..5db83880fb7 100644
--- a/src/bin/pg_waldump/compat.c
+++ b/src/bin/pg_waldump/compat.c
@@ -20,7 +20,6 @@
#include <time.h>
-#include "lib/stringinfo.h"
#include "utils/datetime.h"
/* copied from timestamp.c */
@@ -63,29 +62,3 @@ timestamptz_to_str(TimestampTz dt)
return buf;
}
-
-/*
- * Provide a hacked up compat layer for StringInfos so xlog desc functions can
- * be linked/called.
- */
-void
-appendStringInfo(StringInfo str, const char *fmt,...)
-{
- va_list args;
-
- va_start(args, fmt);
- vprintf(fmt, args);
- va_end(args);
-}
-
-void
-appendStringInfoString(StringInfo str, const char *string)
-{
- appendStringInfo(str, "%s", string);
-}
-
-void
-appendStringInfoChar(StringInfo str, char ch)
-{
- appendStringInfo(str, "%c", ch);
-}
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
index 8e4bff6aa3c..1524e5eb1ef 100644
--- a/src/bin/pg_waldump/pg_waldump.c
+++ b/src/bin/pg_waldump/pg_waldump.c
@@ -514,6 +514,7 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record)
int block_id;
uint8 info = XLogRecGetInfo(record);
XLogRecPtr xl_prev = XLogRecGetPrev(record);
+ StringInfoData s;
XLogDumpRecordLen(record, &rec_len, &fpi_len);
@@ -530,8 +531,10 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record)
else
printf("desc: %s ", id);
- /* the desc routine will printf the description directly to stdout */
- desc->rm_desc(NULL, record);
+ initStringInfo(&s);
+ desc->rm_desc(&s, record);
+ printf("%s", s.data);
+ pfree(s.data);
if (!config->bkp_details)
{
diff --git a/src/common/Makefile b/src/common/Makefile
index 4fd487a4ec4..ffb0f6edffa 100644
--- a/src/common/Makefile
+++ b/src/common/Makefile
@@ -67,6 +67,7 @@ OBJS_COMMON = \
saslprep.o \
scram-common.o \
string.o \
+ stringinfo.o \
unicode_norm.o \
username.o \
wait_error.o
diff --git a/src/backend/lib/stringinfo.c b/src/common/stringinfo.c
index 99c83c1549c..a50e587da90 100644
--- a/src/backend/lib/stringinfo.c
+++ b/src/common/stringinfo.c
@@ -2,21 +2,34 @@
*
* stringinfo.c
*
- * StringInfo provides an indefinitely-extensible string data type.
- * It can be used to buffer either ordinary C strings (null-terminated text)
- * or arbitrary binary data. All storage is allocated with palloc().
+ * StringInfo provides an extensible string data type (currently limited to a
+ * length of 1GB). It can be used to buffer either ordinary C strings
+ * (null-terminated text) or arbitrary binary data. All storage is allocated
+ * with palloc() (falling back to malloc in frontend code).
*
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * src/backend/lib/stringinfo.c
+ * src/common/stringinfo.c
*
*-------------------------------------------------------------------------
*/
+
+#ifndef FRONTEND
+
#include "postgres.h"
+#include "utils/memutils.h"
+
+#else
+
+#include "postgres_fe.h"
+
+/* It's possible we could use a different value for this in frontend code */
+#define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */
+
+#endif
#include "lib/stringinfo.h"
-#include "utils/memutils.h"
/*
@@ -261,10 +274,10 @@ appendBinaryStringInfoNT(StringInfo str, const char *data, int datalen)
* can save some palloc overhead by enlarging the buffer before starting
* to store data in it.
*
- * NB: because we use repalloc() to enlarge the buffer, the string buffer
- * will remain allocated in the same memory context that was current when
- * initStringInfo was called, even if another context is now current.
- * This is the desired and indeed critical behavior!
+ * NB: In the backend, because we use repalloc() to enlarge the buffer, the
+ * string buffer will remain allocated in the same memory context that was
+ * current when initStringInfo was called, even if another context is now
+ * current. This is the desired and indeed critical behavior!
*/
void
enlargeStringInfo(StringInfo str, int needed)
@@ -276,13 +289,29 @@ enlargeStringInfo(StringInfo str, int needed)
* an overflow or infinite loop in the following.
*/
if (needed < 0) /* should not happen */
+ {
+#ifndef FRONTEND
elog(ERROR, "invalid string enlargement request size: %d", needed);
+#else
+ fprintf(stderr, "invalid string enlargement request size: %d\n", needed);
+ exit(EXIT_FAILURE);
+#endif
+ }
if (((Size) needed) >= (MaxAllocSize - (Size) str->len))
+ {
+#ifndef FRONTEND
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("out of memory"),
errdetail("Cannot enlarge string buffer containing %d bytes by %d more bytes.",
str->len, needed)));
+#else
+ fprintf(stderr,
+ _("out of memory\n\nCannot enlarge string buffer containing %d bytes by %d more bytes.\n"),
+ str->len, needed);
+ exit(EXIT_FAILURE);
+#endif
+ }
needed += str->len + 1; /* total space required now */
diff --git a/src/include/lib/stringinfo.h b/src/include/lib/stringinfo.h
index c4842778c51..e27942728e7 100644
--- a/src/include/lib/stringinfo.h
+++ b/src/include/lib/stringinfo.h
@@ -3,9 +3,10 @@
* stringinfo.h
* Declarations/definitions for "StringInfo" functions.
*
- * StringInfo provides an indefinitely-extensible string data type.
- * It can be used to buffer either ordinary C strings (null-terminated text)
- * or arbitrary binary data. All storage is allocated with palloc().
+ * StringInfo provides an extensible string data type (currently limited to a
+ * length of 1GB). It can be used to buffer either ordinary C strings
+ * (null-terminated text) or arbitrary binary data. All storage is allocated
+ * with palloc() (falling back to malloc in frontend code).
*
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 7a103e61406..9a0963a050d 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -123,7 +123,7 @@ sub mkvcbuild
base64.c config_info.c controldata_utils.c d2s.c exec.c f2s.c file_perm.c ip.c
keywords.c kwlookup.c link-canary.c md5.c
pg_lzcompress.c pgfnames.c psprintf.c relpath.c rmtree.c
- saslprep.c scram-common.c string.c unicode_norm.c username.c
+ saslprep.c scram-common.c string.c stringinfo.c unicode_norm.c username.c
wait_error.c);
if ($solution->{options}->{openssl})