Re: BUG #1391: Perl trusted language triggers can't properly access $_SHARED
| От | Tom Lane |
|---|---|
| Тема | Re: BUG #1391: Perl trusted language triggers can't properly access $_SHARED |
| Дата | |
| Msg-id | 24097.1105720048@sss.pgh.pa.us обсуждение исходный текст |
| Ответ на | BUG #1391: Perl trusted language triggers can't properly access $_SHARED ("Sokolov Yura" <falcon@intercable.ru>) |
| Список | pgsql-bugs |
"Sokolov Yura" <falcon@intercable.ru> writes:
> I created triggers In Perl trusted (ActivePerl 5.8.4 build 810) and it
> crashes when triggers FOR EACH STATEMENT tried to access $_SHARED when
> triggers FOR EACH ROW not accessed it before
Actually _SHARED had nothing to do with it: the trigger handler was
trying to fetch new/old tuples even though FOR EACH STATEMENT.
I've applied the attached patch. Thanks for the report!
regards, tom lane
*** src/pl/plperl/plperl.c.orig Tue Jan 11 10:35:22 2005
--- src/pl/plperl/plperl.c Fri Jan 14 11:19:23 2005
***************
*** 338,372 ****
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
{
event = "INSERT";
! hv_store(hv, "new", 3,
! plperl_hash_from_tuple(tdata->tg_trigtuple, tupdesc),
! 0);
}
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
{
event = "DELETE";
! hv_store(hv, "old", 3,
! plperl_hash_from_tuple(tdata->tg_trigtuple, tupdesc),
! 0);
}
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
{
event = "UPDATE";
! hv_store(hv, "old", 3,
! plperl_hash_from_tuple(tdata->tg_trigtuple, tupdesc),
! 0);
! hv_store(hv, "new", 3,
! plperl_hash_from_tuple(tdata->tg_newtuple, tupdesc),
! 0);
}
! else {
event = "UNKNOWN";
- }
hv_store(hv, "event", 5, newSVpv(event, 0), 0);
hv_store(hv, "argc", 4, newSViv(tdata->tg_trigger->tgnargs), 0);
! if (tdata->tg_trigger->tgnargs != 0)
{
AV *av = newAV();
for (i=0; i < tdata->tg_trigger->tgnargs; i++)
--- 338,376 ----
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
{
event = "INSERT";
! if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
! hv_store(hv, "new", 3,
! plperl_hash_from_tuple(tdata->tg_trigtuple, tupdesc),
! 0);
}
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
{
event = "DELETE";
! if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
! hv_store(hv, "old", 3,
! plperl_hash_from_tuple(tdata->tg_trigtuple, tupdesc),
! 0);
}
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
{
event = "UPDATE";
! if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
! {
! hv_store(hv, "old", 3,
! plperl_hash_from_tuple(tdata->tg_trigtuple, tupdesc),
! 0);
! hv_store(hv, "new", 3,
! plperl_hash_from_tuple(tdata->tg_newtuple, tupdesc),
! 0);
! }
}
! else
event = "UNKNOWN";
hv_store(hv, "event", 5, newSVpv(event, 0), 0);
hv_store(hv, "argc", 4, newSViv(tdata->tg_trigger->tgnargs), 0);
! if (tdata->tg_trigger->tgnargs > 0)
{
AV *av = newAV();
for (i=0; i < tdata->tg_trigger->tgnargs; i++)
В списке pgsql-bugs по дате отправления: