Re: minimal update - Mailing list pgsql-hackers
From | Andrew Dunstan |
---|---|
Subject | Re: minimal update |
Date | |
Msg-id | 48225906.2050201@dunslane.net Whole thread Raw |
In response to | Re: minimal update (Bruce Momjian <bruce@momjian.us>) |
Responses |
Re: minimal update
|
List | pgsql-hackers |
Bruce Momjian wrote: > Andrew Dunstan wrote: > >> Right. In fact, I already had that part in fact - see >> http://people.planetpostgresql.org/andrew/index.php?/archives/22-Minimal-Update-Trigger.html >> >> What I was waiting for was the part where it gets put in the catalog, >> documented, etc. >> > > I can probably do that part. Send over what you have and I will work on > it. Thanks. > > It's very similar to what Gurjeet posted (but designed to work with earlier postgres versions) cheers andrew --- |#include "postgres.h" #include "commands/trigger.h" #include "access/htup.h" #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; #endif /* for pre 8.3 */ #ifndef HeapTupleHeaderGetNatts #define HeapTupleHeaderGetNatts(th) ( (th)->t_natts ) #endif extern Datum min_update_trigger(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(min_update_trigger); Datum min_update_trigger(PG_FUNCTION_ARGS) { TriggerData *trigdata = (TriggerData *) fcinfo->context; HeapTuple newtuple, oldtuple, rettuple; /* make sure it's called as a trigger at all */ if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "min_update_trigger:not called by trigger manager"); /* and that it's called on update */ if (! TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) elog(ERROR, "min_update_trigger:not called on update"); /* and that it's called before update */ if (! TRIGGER_FIRED_BEFORE(trigdata->tg_event)) elog(ERROR, "min_update_trigger:not called before update"); /* and that it's called for each row */ if (! TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) elog(ERROR, "min_update_trigger:not called for each row"); /* get tuple dat, set default return */ rettuple = newtuple = trigdata->tg_newtuple; oldtuple = trigdata->tg_trigtuple; if (newtuple->t_len == oldtuple->t_len && newtuple->t_data->t_hoff == oldtuple->t_data->t_hoff && HeapTupleHeaderGetNatts(newtuple->t_data) == HeapTupleHeaderGetNatts(oldtuple->t_data) && (newtuple->t_data->t_infomask& ~HEAP_XACT_MASK) == (oldtuple->t_data->t_infomask & ~HEAP_XACT_MASK) && memcmp(((char *)newtuple->t_data) + offsetof(HeapTupleHeaderData, t_bits), ((char *)oldtuple->t_data)+ offsetof(HeapTupleHeaderData, t_bits), newtuple->t_len - offsetof(HeapTupleHeaderData,t_bits)) == 0) rettuple = NULL; return PointerGetDatum(rettuple); }|
pgsql-hackers by date: