Обсуждение: Where are the detoast function called in select * from table_name case?
Hello, I've been reading the PostgreSQL code for weeks to figure out how TOAST works. I couldn't find where are the TOAST function called to detoast a tuple comes from a select query, for example, select * from table_name. Does anyone know this? Can you give me some help? And any help would save me a lot of time. Thanks, Rui Hai
Re: Where are the detoast function called in select * from table_name case?
От
Heikki Linnakangas
Дата:
On 05/06/2015 04:00 PM, Rui Hai Jiang wrote: > I've been reading the PostgreSQL code for weeks to figure out how TOAST > works. > I couldn't find where are the TOAST function called to detoast a tuple > comes from a select query, for example, select * from table_name. > Does anyone know this? Can you give me some help? And any help would > save me a lot of time. The tuple isn't detoasted immediately when it's read. Individual datums of the tuple are detoasted lazily, when needed, in whatever function it's passed to. If you just do "select * from table", the first function it's passed to is the datatype's output function, so that detoasts it. For example, if it's a text column, the toasted Datum is passed to textout(), which calls text_to_cstring(). text_to_cstring() calls pg_detoast_datum_packed(), which finally detoasts it. You can launch a debugger on the backend process, and put a breakpoint on e.g. heap_tuple_untoast_attr() to see it in action. - Heikki
Hi
Depends on usage, but often times the detoasting is called from DatumGet***** macros#define PG_GETARG_TEXT_PP(n) DatumGetTextPP(PG_GETARG_DATUM(n))
#define DatumGetTextPP(X) ((text *) PG_DETOAST_DATUM_PACKED(X))
#define PG_DETOAST_DATUM(datum) >pg_detoast_datum((struct varlena *) DatumGetPointer(datum))
2015-05-06 15:00 GMT+02:00 Rui Hai Jiang <ruihaijiang@msn.com>:
Hello,
I've been reading the PostgreSQL code for weeks to figure out how TOAST works.
I couldn't find where are the TOAST function called to detoast a tuple comes from a select query, for example, select * from table_name.
Does anyone know this? Can you give me some help? And any help would save me a lot of time.
Thanks,
Rui Hai
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers