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