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  (Jeremy Drake <pgsql@jdrake.com>)
Re: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE  (Mark Dilger <pgsql@markdilger.com>)
Список 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 по дате отправления:

Предыдущее
От: Mark Dilger
Дата:
Сообщение: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE or similar?
Следующее
От: Jeremy Drake
Дата:
Сообщение: Re: Getting the length of varlength data using