On 6/14/17 12:05, Tom Lane wrote:
> Peter Eisentraut <peter.eisentraut@2ndquadrant.com> writes:
>> So this seems to be a pretty basic bug. Some node fields of type char
>> may be zero, and so printing them as a zero byte just truncates the
>> whole output string. This could be fixed by printing chars like strings
>> with the full escaping mechanism. See attached patch.
>
> +1 for fixing this, but you have not handled the read side correctly.
> pg_strtok doesn't promise to return a null-terminated string, so without
> changes, readfuncs.c would not successfully decode a zero-byte char field.
> Also it would do the wrong thing for any character code that outToken had
> decided to prefix with a backslash. I think you could fix both problems
> like this:
>
> /* Read a char field (ie, one ascii character) */
> #define READ_CHAR_FIELD(fldname) \
> token = pg_strtok(&length); /* skip :fldname */ \
> token = pg_strtok(&length); /* get field value */ \
> - local_node->fldname = token[0]
> + local_node->fldname = debackslash(token, length)[0]
An empty token produces "<>", so just debackslashing wouldn't work. Maybe
local_node->fldname = length ? token[0] : '\0';
?
--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services