Cstring vs. Datum values ( BuildTupleFromCStrings vs. BlessTupleDesc)

From: Ivan Sergio Borgonovo <mail(at)webthatworks(dot)it>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Cstring vs. Datum values ( BuildTupleFromCStrings vs. BlessTupleDesc)
Date: 2010-01-23 12:56:30
Message-ID: 20100123135630.35a5016d@dawn.webthatworks.it
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

I'm trying to write a couple of C function that will:
- return a tsvector as a set of record.
- turn a tsvector into a tsquery

I'm looking at the example function to return set of records
http://www.postgresql.org/docs/8.4/static/xfunc-c.html#AEN44970

and to this:
"There are two ways you can build a composite data value (henceforth
a "tuple"): you can build it from an array of Datum values, or from
an array of C strings that can be passed to the input conversion
functions of the tuple's column data types. In either case, you
first need to obtain or construct a TupleDesc descriptor for the
tuple structure. When working with Datums, you pass the TupleDesc to
BlessTupleDesc, and then call heap_form_tuple for each row. When
working with C strings, you pass the TupleDesc to
TupleDescGetAttInMetadata, and then call BuildTupleFromCStrings for
each row. In the case of a function returning a set of tuples, the
setup steps can all be done once during the first call of the
function."

And I can't understand if I can avoid transforming everything into
its text representation:

snprintf(values[0], 16, "%d", 1 * PG_GETARG_INT32(1));
snprintf(values[1], 16, "%d", 2 * PG_GETARG_INT32(1));
snprintf(values[2], 16, "%d", 3 * PG_GETARG_INT32(1));

And if I can... how, why and when... because I didn't find any clear
example in the source tree that gives me a clue about when I'd use
one form or the other.

Up to my understanding the way to go to use Datum is:

/*
create a template tupledesc specifying numbers of columns (eg.2)
*/
tupdesc = CreateTemplateTupleDesc(3, false);

/*
???
bool hasoid
*/

/* configure the "fields" */
TupleDescInitEntry(tupdesc, (AttrNumber) 1, "word",
TEXTOID, -1, 0);
/*
??????
Oid oidtypeid, // where can I get a list of OID
int32 typmod,
int attdim)
*/

/* ??? */
funcctx->tuple_desc = BlessTupleDesc(tupdesc);
funcctx->attinmeta = TupleDescGetAttInMetadata(tupdesc);

--
Ivan Sergio Borgonovo
http://www.webthatworks.it

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Dimitri Fontaine 2010-01-23 13:05:24 Re: commit fests
Previous Message Greg Stark 2010-01-23 11:25:52 Re: 8.5 vs. 9.0, Postgres vs. PostgreSQL