diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2017-06-21 22:57:23 -0400 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2017-07-05 10:51:54 -0400 |
commit | d80e73f2293429cf8a0a13c243852379ec2e37e2 (patch) | |
tree | a54e87faf18d532fc23542084217496940d7ffe7 /src/backend/nodes/readfuncs.c | |
parent | 5191e357cf22e200a9baaf97bbe8a07ee2537537 (diff) | |
download | postgresql-d80e73f2293429cf8a0a13c243852379ec2e37e2.tar.gz postgresql-d80e73f2293429cf8a0a13c243852379ec2e37e2.zip |
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. Adjust the
reading side to handle this.
Diffstat (limited to 'src/backend/nodes/readfuncs.c')
-rw-r--r-- | src/backend/nodes/readfuncs.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 2988e8bd16d..1380703cbc6 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -86,7 +86,8 @@ #define READ_CHAR_FIELD(fldname) \ token = pg_strtok(&length); /* skip :fldname */ \ token = pg_strtok(&length); /* get field value */ \ - local_node->fldname = token[0] + /* avoid overhead of calling debackslash() for one char */ \ + local_node->fldname = (length == 0) ? '\0' : (token[0] == '\\' ? token[1] : token[0]) /* Read an enumerated-type field that was written as an integer code */ #define READ_ENUM_FIELD(fldname, enumtype) \ |