From 61c0226abbef26c8df6daa3f56c848a1a1d7e1e7 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 13 Jun 2017 23:44:54 -0400 Subject: [PATCH] Fix output of char node fields WRITE_CHAR_FIELD() didn't do any escaping, so that for example a zero byte would cause the whole output string to be truncated. To fix, pass the char through outToken(), so it is escaped like a string. The reading side already handled this. --- src/backend/nodes/outfuncs.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index c348bdcde3..46b61f9dbf 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -32,6 +32,8 @@ #include "utils/datum.h" #include "utils/rel.h" +static void outChar(StringInfo str, char c); + /* * Macros to simplify output of different kinds of fields. Use these @@ -62,7 +64,8 @@ /* Write a char field (ie, one ascii character) */ #define WRITE_CHAR_FIELD(fldname) \ - appendStringInfo(str, " :" CppAsString(fldname) " %c", node->fldname) + (appendStringInfo(str, " :" CppAsString(fldname) " "), \ + outChar(str, node->fldname)) /* Write an enumerated-type field as an integer code */ #define WRITE_ENUM_FIELD(fldname, enumtype) \ @@ -140,6 +143,21 @@ outToken(StringInfo str, const char *s) } } +/* + * Convert one char. Goes through outToken() so that special characters are + * escaped. + */ +static void +outChar(StringInfo str, char c) +{ + char in[2]; + + in[0] = c; + in[1] = '\0'; + + outToken(str, in); +} + static void _outList(StringInfo str, const List *node) { -- 2.13.1