Re: minimal update

From: Andrew Dunstan <andrew(at)dunslane(dot)net>
To: Bruce Momjian <bruce(at)momjian(dot)us>
Cc: Gurjeet Singh <singh(dot)gurjeet(at)gmail(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Michael Glaesemann <grzm(at)seespotcode(dot)net>, David Fetter <david(at)fetter(dot)org>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: minimal update
Date: 2008-10-15 00:29:28
Message-ID: 48F53968.1010909@dunslane.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


Bruce,

did you ever look at completing this?

cheers

andrew

Andrew Dunstan wrote:
>
>
> 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);
> }|
>
>
>
>

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2008-10-15 00:38:47 Re: How is random_page_cost=4 ok?
Previous Message Scott Marlowe 2008-10-15 00:16:57 Re: Column level triggers