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 [EMAIL PROTECTED] 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, Pennsylvania 19073

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to