Re: [HACKERS] outfuncs.c utility statement support
От | Peter Eisentraut |
---|---|
Тема | Re: [HACKERS] outfuncs.c utility statement support |
Дата | |
Msg-id | 958fca07-838c-07cc-0ab6-1048e37c1372@2ndquadrant.com обсуждение исходный текст |
Ответ на | Re: [HACKERS] outfuncs.c utility statement support (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: [HACKERS] outfuncs.c utility statement support
|
Список | pgsql-hackers |
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
В списке pgsql-hackers по дате отправления: