Обсуждение: Triggers cause backend crash
/*
* Andras Belokosztolszki
*
* A trigger function invoked when a predicate is is modified
* it looks up in the registered templates for this predicate the
* parties to be notified
*
* create trigger t4predt_..._trigger
* AFTER INSERT on ...
* FOR EACH ROW
* EXECUTE PROCEDURE t4predt_trig1();
*
*/
#include "executor/spi.h" /* this is what you need to work with SPI */
#include "commands/trigger.h" /* -"- and triggers */
#include "catalog/pg_type.h" /* for OID constants */
#include "MPS_triggers.h"
extern Datum t5_pred_general_trig(PG_FUNCTION_ARGS) ;
Datum t5_pred_general_trig(PG_FUNCTION_ARGS) {
TriggerData *trigdata = (TriggerData *) fcinfo->context;
TupleDesc tupdesc1;
HeapTuple rettuple;
HeapTuple rettuple_old; /* in case of update the old tuple */
Relation rel;
Trigger *trigger; /* to get trigger name */
int nargs;
char **args; /* arguments */
elog(NOTICE, "PredicateGeneralTrigger: Called");
if (!CALLED_AS_TRIGGER(fcinfo))
elog(ERROR, "PredicateGeneralTrigger: not fired by trigger manager!");
/* tuple to return */
if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) {
rettuple = trigdata->tg_newtuple;
rettuple_old = trigdata->tg_trigtuple;
} else {
rettuple = trigdata->tg_trigtuple;
rettuple_old = trigdata->tg_trigtuple; // old tuple is the default !!!
}
if (!TRIGGER_FIRED_AFTER(trigdata->tg_event)) {
elog(ERROR,"PredicateGeneralTrigger: Trigger not fired after event");
}
rel = trigdata->tg_relation;
tupdesc1 = trigdata->tg_relation->rd_att;
// check trigger parameters !!
trigger = trigdata->tg_trigger;
nargs = trigger->tgnargs;
args = trigger->tgargs;
trigdata = NULL;
/* connect to the database */
SPI_connect();
SPI_finish();
elog(NOTICE,"General trigger finished");
return PointerGetDatum(rettuple);
}
"Andras Belokosztolszki" <beland1@hotmail.com> writes:
> <DIV>
> <P class=MsoPlainText><SPAN lang=EN-US style="mso-fareast-font-family: 'MS Mincho'">Hi, I have a problem (I wrote
aboutit before, but here is a complete example). When I have two triggers with parameters the backend crashes after a
certainsequence of invocations. Attached are two very simple triggers in C (they might contain some unnecessary lines,
theyare a stripped version of an application I'm working on), how to compile, how to bootstrap, ... how to crash the
backend<BR></SPAN></P>
> <P class=MsoPlainText><SPAN lang=EN-US style="mso-fareast-font-family: 'MS Mincho'">Postgresql info:</SPAN></P><SPAN
lang=EN-USstyle="mso-fareast-font-family: 'MS Mincho'"><FONT size=2>
> <P>PostgreSQL 7.1.3 on i686-pc-linux-gnu, compiled by GCC 2.95.3</P></FONT></SPAN>
> <P class=MsoPlainText><SPAN lang=EN-US style="mso-fareast-font-family: 'MS Mincho'">A sample makefile (extract from
mine)</SPAN></P>
> <P class=MsoPlainText><SPAN lang=EN-US style="mso-fareast-font-family: 'MS Mincho'"> </P>
> [etc]
Please don't use HTML for email.
I think your problem is that you've omitted the
PG_FUNCTION_INFO_V1() macro call that's needed to mark these functions
as version-1 calling convention.
regards, tom lane