OSDN Git Service

Fix declaration of $_TD in "strict" trigger functions
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 19 May 2011 03:56:18 +0000 (23:56 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Thu, 19 May 2011 03:56:18 +0000 (23:56 -0400)
commit6b449d9051651d3accfdce73e21cfd5e3d0e09a3
tree1bed394d1921154258d08a7a4ee263805893f416
parentea896da394cbb0fb32a4b41065ea04b81c4b03f6
Fix declaration of $_TD in "strict" trigger functions

This was broken in commit ef19dc6d39dd2490ff61489da55d95d6941140bf by
the Bunce/Hunsaker/Dunstan team, which moved the declaration from
plperl_create_sub to plperl_call_perl_trigger_func.  This doesn't
actually work because the validator code would not find the variable
declared; and even if you manage to get past the validator, it still
doesn't work because get_sv("_TD", GV_ADD) doesn't have the expected
effect.  The only reason this got beyond testing is that it only fails
in strict mode.

We need to declare it as a global just like %_SHARED; it is simpler than
trying to actually do what the patch initially intended, and is said to
have the same performance benefit.

As a more serious issue, fix $_TD not being properly local()ized,
meaning nested trigger functions would clobber $_TD.

Alex Hunsaker, per test report from Greg Mullane
src/pl/plperl/expected/plperl_trigger.out
src/pl/plperl/plc_perlboot.pl
src/pl/plperl/plperl.c
src/pl/plperl/sql/plperl_trigger.sql