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);
}|




--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to