Re: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE
От | Bruce Momjian |
---|---|
Тема | Re: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE |
Дата | |
Msg-id | 200602110525.k1B5PiW11196@candle.pha.pa.us обсуждение исходный текст |
Ответ на | Getting the length of varlength data using PG_DETOAST_DATUM_SLICE or similar? (Mark Dilger <pgsql@markdilger.com>) |
Ответы |
Re: Getting the length of varlength data using
Re: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE |
Список | pgsql-hackers |
Have you looked at the 8.1.X buildin function pg_column_size()? --------------------------------------------------------------------------- Mark Dilger wrote: > Hello, could anyone tell me, for a user contributed variable length data type, > how can you access the length of the data without pulling the entire thing from > disk? Is there a function or macro for this? > > As a first cut, I tried using the PG_DETOAST_DATUM_SLICE macro, but to no avail. > grep'ing through the release source for version 8.1.2, I find very little > usage of the PG_GETARG_*_SLICE and PG_DETOAST_DATUM_SLICE macros (and hence > little clue how they are intended to be used.) The only files where I find them > referenced are: > > doc/src/sgml/xfunc.sgml > src/backend/utils/adt/varlena.c > src/include/fmgr.h > > > I am writing a variable length data type and trying to optimize the disk usage > in certain functions. There are cases where the return value of the function > can be determined from the length of the data and a prefix of the data without > fetching the whole data from disk. (The prefix alone is insufficient -- I need > to also know the length for the optimization to work.) > > The first field of the data type is the length, as follows: > > typedef struct datatype_foo { > int32 length; > char data[]; > } datatype_foo; > > But when I fetch the function arguments using > > datatype_foo * a = (datatype_foo *) > PG_DETOAST_DATUM_SLICE(PG_GETARG_DATUM(0),0,BLCKSZ); > > the length field is set to the length of the fetched slice, not the length of > the data as it exists on disk. Is there some other function that gets the length > without pulling more than the first block? > > Thanks for any insight, > > --Mark > > ---------------------------(end of broadcast)--------------------------- > TIP 1: if posting/reading through Usenet, please send an appropriate > subscribe-nomail command to majordomo@postgresql.org so that your > message can get through to the mailing list cleanly > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001+ If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania19073
В списке pgsql-hackers по дате отправления: