On Sun, Oct 04, 2009 at 01:07:54PM -0400, Yadisnel Galvez Velazquez wrote:
> The problem is identical if I run this example:

Please attach files instead of posting them in-line :)  I've attached
your example as a file.

Please also to group-reply instead of just replying to the poster.

Cheers,
David
-- 
David Fetter <da...@fetter.org> http://fetter.org/
Phone: +1 415 235 3778  AIM: dfetter666  Yahoo!: dfetter
Skype: davidfetter      XMPP: david.fet...@gmail.com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
#include <postgresql/8.3/server/postgres.h>
#include <postgresql/8.3/server/executor/spi.h>
#include <postgresql/8.3/server/commands/trigger.h>

extern Datum trigf(PG_FUNCTION_ARGS);

PG_FUNCTION_INFO_V1(trigf);

Datum
trigf(PG_FUNCTION_ARGS)
{
        TriggerData *trigdata = (TriggerData *) fcinfo->context;
        TupleDesc   tupdesc;
        HeapTuple   rettuple;
        char        *when;
        bool            checknull = false;
        bool            isnull;
        int                     ret, i;

        /* make sure it's called as a trigger at all */
        if (!CALLED_AS_TRIGGER(fcinfo))
                elog(ERROR, "trigf: not called by trigger manager");

        /* tuple to return to executor */
        if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
                rettuple = trigdata->tg_newtuple;
        else
                rettuple = trigdata->tg_trigtuple;

        /* check for null values */
        if (!TRIGGER_FIRED_BY_DELETE(trigdata->tg_event)
                && TRIGGER_FIRED_BEFORE(trigdata->tg_event))
                checknull = true;

        if (TRIGGER_FIRED_BEFORE(trigdata->tg_event))
                when = "before";
        else
                when = "after ";

        tupdesc = trigdata->tg_relation->rd_att;

        /* connect to SPI manager */
        if ((ret = SPI_connect()) < 0)
                elog(INFO, "trigf (fired %s): SPI_connect returned %d", when, 
ret);

        /* get number of rows in table */
        ret = SPI_exec("SELECT count(*) FROM ttest", 0);

        if (ret < 0)
                elog(NOTICE, "trigf (fired %s): SPI_exec returned %d", when, 
ret);

        /* count(*) returns int8, so be careful to convert */
        i = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[0],
                                                                        
SPI_tuptable->tupdesc,
                                                                        1,
                                                                        
&isnull));

        elog (INFO, "trigf (fired %s): there are %d rows in ttest", when, i);

        SPI_finish();

        if (checknull)
        {
                SPI_getbinval(rettuple, tupdesc, 1, &isnull);
                if (isnull)
                        rettuple = NULL;
        }

        return PointerGetDatum(rettuple);
}
-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to