Re: B-Tree support function number 3 (strxfrm() optimization)

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: B-Tree support function number 3 (strxfrm() optimization)
Дата
Msg-id 533984E9.8040808@vmware.com
обсуждение исходный текст
Ответ на Re: B-Tree support function number 3 (strxfrm() optimization)  (Peter Geoghegan <pg@heroku.com>)
Ответы Re: B-Tree support function number 3 (strxfrm() optimization)  (Peter Geoghegan <pg@heroku.com>)
Список pgsql-hackers
On 03/31/2014 08:51 AM, Peter Geoghegan wrote:
> + #ifdef HAVE_LOCALE_T
> +     if (tss->locale)
> +         strxfrm_l(pres, tss->buf1, Min(sizeof(Datum), len), tss->locale);
> +     else
> + #endif
> +         strxfrm(pres, tss->buf1, Min(sizeof(Datum), len));
> +
> +     pres[Min(sizeof(Datum) - 1, len)] = '\0';

I'm afraid that trick isn't 100% reliable. The man page for strxrfm says:

> RETURN VALUE
>        The strxfrm() function returns the number of bytes  required  to  store
>        the  transformed  string  in  dest  excluding the terminating null byte
>        ('\0').  If the value returned is n or more, the contents of  dest  are
>        indeterminate.

Note the last sentence. To avoid the undefined behavior, you have to 
pass a buffer that's large enough to hold the whole result, and then 
truncate the result.

- Heikki



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

Предыдущее
От: Robert Haas
Дата:
Сообщение: Re: Comment in src/backend/commands/vacuumlazy.c
Следующее
От: Andrew Dunstan
Дата:
Сообщение: Re: PQputCopyData dont signal error