Re: It's seems that the function "do_text_output_multiline" does not suit for format "line1\nline2\n...lineN".

Поиск
Список
Период
Сортировка
От David Rowley
Тема Re: It's seems that the function "do_text_output_multiline" does not suit for format "line1\nline2\n...lineN".
Дата
Msg-id CAKJS1f9v5vTC0fbynvutKO2HPpMJWQPhWAyDMHxJo1cTT=t=Tw@mail.gmail.com
обсуждение исходный текст
Ответ на It's seems that the function "do_text_output_multiline" does not suit for format "line1\nline2\n...lineN".  (Hao Lee <mixtrue@gmail.com>)
Ответы Re: It's seems that the function "do_text_output_multiline" does not suit for format "line1\nline2\n...lineN".  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
On 20 May 2016 at 19:13, Hao Lee <mixtrue@gmail.com> wrote:
>
> Hi all,
>
> Today, I am do some works on adding some customized featues to PostgreSQL 9.6 beta1. But, when i do some output to
psqlusing the fuction "do_text_output_multiline" with the string just like mentioned in mail tilte, such as "this is
a\ntestfor\nnew blank.". the PostgreSQL may lead to corruption in this function, and i debugged it that found this
functioncan not dealt with the boundaries properly. The original function code as : 
>
> do_text_output_multiline(TupOutputState *tstate, char *text)
> {
>     Datum        values[1];
>     bool        isnull[1] = {false};
>
>     while (*text)
>     {
>         char       *eol;
>         int            len;
>
>         eol = strchr(text, '\n');
>         if (eol)
>         {
>             len = eol - text;
>
>             eol++;
>         }
>         else
>         {
>             len = strlen(text);
>             eol += len;
>         }
>
>         values[0] = PointerGetDatum(cstring_to_text_with_len(text, len));
>         do_tup_output(tstate, values, isnull);
>         pfree(DatumGetPointer(values[0]));
>         text = eol;
>     }
> }
>

Thanks for reporting this. It does seem pretty broken. I guess we've
only gotten away with this due to EXPLAIN output lines always having a
\n at the end of them, but we should fix this.

Your proposed fix looks a little bit confused. You could have just
removed the eol += len; as testing if (eol) in the else will never be
true as that else is only being hit because eol is NULL.

I shuffled things around in there a bit and came up with the attached fix.

--
 David Rowley                   http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services

Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Amit Langote
Дата:
Сообщение: Re: Declarative partitioning
Следующее
От: Jesper Pedersen
Дата:
Сообщение: Re: Speedup twophase transactions