@@ -1705,27 +1705,32 @@ plperl_call_handler(PG_FUNCTION_ARGS)
17051705Datum retval ;
17061706plperl_call_data * save_call_data = current_call_data ;
17071707plperl_interp_desc * oldinterp = plperl_active_interp ;
1708+ plperl_call_data this_call_data ;
1709+
1710+ /* Initialize current-call status record */
1711+ MemSet (& this_call_data ,0 ,sizeof (this_call_data ));
1712+ this_call_data .fcinfo = fcinfo ;
17081713
17091714PG_TRY ();
17101715{
1711- current_call_data = NULL ;
1716+ current_call_data = & this_call_data ;
17121717if (CALLED_AS_TRIGGER (fcinfo ))
17131718retval = PointerGetDatum (plperl_trigger_handler (fcinfo ));
17141719else
17151720retval = plperl_func_handler (fcinfo );
17161721}
17171722PG_CATCH ();
17181723{
1719- if (current_call_data && current_call_data -> prodesc )
1720- decrement_prodesc_refcount (current_call_data -> prodesc );
1724+ if (this_call_data . prodesc )
1725+ decrement_prodesc_refcount (this_call_data . prodesc );
17211726current_call_data = save_call_data ;
17221727activate_interpreter (oldinterp );
17231728PG_RE_THROW ();
17241729}
17251730PG_END_TRY ();
17261731
1727- if (current_call_data && current_call_data -> prodesc )
1728- decrement_prodesc_refcount (current_call_data -> prodesc );
1732+ if (this_call_data . prodesc )
1733+ decrement_prodesc_refcount (this_call_data . prodesc );
17291734current_call_data = save_call_data ;
17301735activate_interpreter (oldinterp );
17311736return retval ;
@@ -1745,8 +1750,12 @@ plperl_inline_handler(PG_FUNCTION_ARGS)
17451750plperl_proc_desc desc ;
17461751plperl_call_data * save_call_data = current_call_data ;
17471752plperl_interp_desc * oldinterp = plperl_active_interp ;
1753+ plperl_call_data this_call_data ;
17481754ErrorContextCallback pl_error_context ;
17491755
1756+ /* Initialize current-call status record */
1757+ MemSet (& this_call_data ,0 ,sizeof (this_call_data ));
1758+
17501759/* Set up a callback for error reporting */
17511760pl_error_context .callback = plperl_inline_callback ;
17521761pl_error_context .previous = error_context_stack ;
@@ -1777,14 +1786,15 @@ plperl_inline_handler(PG_FUNCTION_ARGS)
17771786desc .nargs = 0 ;
17781787desc .reference = NULL ;
17791788
1789+ this_call_data .fcinfo = & fake_fcinfo ;
1790+ this_call_data .prodesc = & desc ;
1791+ /* we do not bother with refcounting the fake prodesc */
1792+
17801793PG_TRY ();
17811794{
17821795SV * perlret ;
17831796
1784- current_call_data = (plperl_call_data * )palloc0 (sizeof (plperl_call_data ));
1785- current_call_data -> fcinfo = & fake_fcinfo ;
1786- current_call_data -> prodesc = & desc ;
1787- /* we do not bother with refcounting the fake prodesc */
1797+ current_call_data = & this_call_data ;
17881798
17891799if (SPI_connect ()!= SPI_OK_CONNECT )
17901800elog (ERROR ,"could not connect to SPI manager" );
@@ -2167,13 +2177,6 @@ plperl_func_handler(PG_FUNCTION_ARGS)
21672177ReturnSetInfo * rsi ;
21682178ErrorContextCallback pl_error_context ;
21692179
2170- /*
2171- * Create the call_data before connecting to SPI, so that it is not
2172- * allocated in the SPI memory context
2173- */
2174- current_call_data = (plperl_call_data * )palloc0 (sizeof (plperl_call_data ));
2175- current_call_data -> fcinfo = fcinfo ;
2176-
21772180if (SPI_connect ()!= SPI_OK_CONNECT )
21782181elog (ERROR ,"could not connect to SPI manager" );
21792182
@@ -2286,13 +2289,6 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
22862289HV * hvTD ;
22872290ErrorContextCallback pl_error_context ;
22882291
2289- /*
2290- * Create the call_data before connecting to SPI, so that it is not
2291- * allocated in the SPI memory context
2292- */
2293- current_call_data = (plperl_call_data * )palloc0 (sizeof (plperl_call_data ));
2294- current_call_data -> fcinfo = fcinfo ;
2295-
22962292/* Connect to SPI manager */
22972293if (SPI_connect ()!= SPI_OK_CONNECT )
22982294elog (ERROR ,"could not connect to SPI manager" );