Where are the detoast function called in select * from table_name case?

Started by Rui Hai Jiangover 10 years ago3 messages
#1Rui 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

#2Heikki Linnakangas
hlinnaka@iki.fi
In reply to: Rui Hai Jiang (#1)
Re: Where are the detoast function called in select * from table_name case?

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

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Pavel Stehule
pavel.stehule@gmail.com
In reply to: Rui Hai Jiang (#1)
Re: Where are the detoast function called in select * from table_name case?

Hi

Depends on usage, but often times the detoasting is called from
DatumGet***** macros

The values are detoasted only when it is required

#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))

Regards

Pavel Stehule

2015-05-06 15:00 GMT+02:00 Rui Hai Jiang <ruihaijiang@msn.com>:

Show quoted text

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