It looks like pg_column_size gives you the actual size on disk, ie after compression.
What looks interesting for you would be byteaoctetlen or the function it wraps, toast_raw_datum_size. See src/backend/access/heap/tuptoaster.c. pg_column_size calls toast_datum_size, while byteaoctetlen/textoctetlen calls toast_raw_datum_size. On Sat, 11 Feb 2006, Bruce Momjian wrote: > > 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 > > > > -- "Contrary to popular belief, penguins are not the salvation of modern technology. Neither do they throw parties for the urban proletariat." ---------------------------(end of broadcast)--------------------------- TIP 5: don't forget to increase your free space map settings