Re: Getting the length of varlength data using - Mailing list pgsql-hackers

From Jeremy Drake
Subject Re: Getting the length of varlength data using
Date
Msg-id Pine.LNX.4.63.0602102311290.8541@garibaldi.apptechsys.com
Whole thread Raw
In response to Re: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses Re: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE
List pgsql-hackers
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 majordomo@postgresql.org 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."


pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE
Next
From: Mark Dilger
Date:
Subject: Re: Getting the length of varlength data using PG_DETOAST_DATUM_SLICE