Thread
-
C trigger problem
Patrick Welche <prlw1@newn.cam.ac.uk> — 2005-09-17T13:41:45Z
I am trying to write a C trigger. Essentially TriggerData *in = (TriggerData *) fcinfo->context; HeapTupleHeader tuple=in->tg_trigtuple->t_data; Datum datum; datum = GetAttributeByName(tuple, "unit_id", &isnull); and that last line fails with ERROR: cache lookup failed for type 4664 I haven't seen anything similar in the documentation.. What is wrong / the correct way of extracting values from the old/new rows in a C trigger fn? Cheers, Patrick -
Re: C trigger problem
Tom Lane <tgl@sss.pgh.pa.us> — 2005-09-17T14:08:40Z
Patrick Welche <prlw1@newn.cam.ac.uk> writes: > I am trying to write a C trigger. Essentially > TriggerData *in = (TriggerData *) fcinfo->context; > HeapTupleHeader tuple=in->tg_trigtuple->t_data; > Datum datum; > datum = GetAttributeByName(tuple, "unit_id", &isnull); > and that last line fails with > ERROR: cache lookup failed for type 4664 GetAttributeByName doesn't work on raw tuples-on-disk, because they don't contain any type ID info. Use heap_getattr or one of the related functions instead (perhaps in combination with SPI_fnumber if you don't want a hardwired column number). It strikes me that the current API for GetAttributeByName and GetAttributeByNum is kinda broken, in that they cannot support this sort of usage. The pre-8.0 API was little better, because back then they wanted a TupleTableSlot which you don't have readily available either in a trigger function. Thoughts anyone? Should we just deprecate these functions and be done with it? regards, tom lane