Re: How to return a large String with C (solved)

Поиск
Список
Период
Сортировка
От Stefan Niantschur
Тема Re: How to return a large String with C (solved)
Дата
Msg-id 20080218195025.6cced4ed@trabant.niantschur.de
обсуждение исходный текст
Ответ на Re: How to return a large String with C  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
Am Sun, 17 Feb 2008 14:28:18 -0500
schrieb Tom Lane <tgl@sss.pgh.pa.us>:

> Stefan Niantschur <sniantschur@web.de> writes:
> > Am Sun, 17 Feb 2008 09:17:08 -0500
> > schrieb Tom Lane <tgl@sss.pgh.pa.us>:
> >> Hardly surprising when you're printing the string into a fixed-size
> >> 8K buffer. The buffer overflow is smashing the stack, in particular
> >> the function's return address.
>
> > Yes, I know, but the backend does not allow for a bigger buffer.
> > Trying to use a 80K (char[81920])buffer did not work and returns:
>
> So you've got some other bug in code you didn't show us.  It's highly
> unlikely that you wouldn't be able to allocate an 80K buffer.
> (Whether that's big enough for your data even yet is a separate
> question.)
>
> What I was wondering was why you even bothered with the char[] buffer,
> when it looked like the actually useful return value was being
> accumulated in an expansible StringInfo buffer.
>
>             regards, tom lane
>

Hi all,

now after some days of intensive brainwork I could solve the problem
with a slight change in the code. It turned out that palloc() did not
reliably work for my purpose.

So before calling SPI_finish() I am doing the following:

text       *out = (text *) SPI_palloc(strlen(cres) + VARHDRSZ);
memcpy(VARDATA(out), cres, strlen(cres));
VARATT_SIZEP(out) = strlen(cres) + VARHDRSZ;
SPI_finish();

which allocates the needed memory in the upper execution context. This
allows for passing the really long string back to the select statement
without crashing the database.

If there are any better proceedings, please let me know.

Best Regards,
Stefan

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

Предыдущее
От: Enrico Sirola
Дата:
Сообщение: Re: questions about very large table and partitioning
Следующее
От: Tom Lane
Дата:
Сообщение: Re: How to return a large String with C