11/**********************************************************************
22 * plperl.c - perl as a procedural language for PostgreSQL
33 *
4- * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.152 2009/09/28 17:31:12 adunstan Exp $
4+ * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.153 2009/10/31 18:11:59 tgl Exp $
55 *
66 **********************************************************************/
77
@@ -150,8 +150,8 @@ void_PG_init(void);
150150static void plperl_init_interp (void );
151151
152152static Datum plperl_func_handler (PG_FUNCTION_ARGS );
153-
154153static Datum plperl_trigger_handler (PG_FUNCTION_ARGS );
154+
155155static plperl_proc_desc * compile_plperl_function (Oid fn_oid ,bool is_trigger );
156156
157157static SV * plperl_hash_from_tuple (HeapTuple tuple ,TupleDesc tupdesc );
@@ -380,11 +380,13 @@ check_interp(bool trusted)
380380}
381381}
382382
383-
383+ /*
384+ * Restore previous interpreter selection, if two are active
385+ */
384386static void
385387restore_context (bool old_context )
386388{
387- if (trusted_context != old_context )
389+ if (interp_state == INTERP_BOTH && trusted_context != old_context )
388390{
389391if (old_context )
390392PERL_SET_CONTEXT (plperl_trusted_interp );
@@ -870,9 +872,9 @@ Datum
870872plperl_call_handler (PG_FUNCTION_ARGS )
871873{
872874Datum retval ;
873- plperl_call_data * save_call_data ;
875+ plperl_call_data * save_call_data = current_call_data ;
876+ bool oldcontext = trusted_context ;
874877
875- save_call_data = current_call_data ;
876878PG_TRY ();
877879{
878880if (CALLED_AS_TRIGGER (fcinfo ))
@@ -883,11 +885,13 @@ plperl_call_handler(PG_FUNCTION_ARGS)
883885PG_CATCH ();
884886{
885887current_call_data = save_call_data ;
888+ restore_context (oldcontext );
886889PG_RE_THROW ();
887890}
888891PG_END_TRY ();
889892
890893current_call_data = save_call_data ;
894+ restore_context (oldcontext );
891895return retval ;
892896}
893897
@@ -1226,7 +1230,6 @@ plperl_func_handler(PG_FUNCTION_ARGS)
12261230Datum retval ;
12271231ReturnSetInfo * rsi ;
12281232SV * array_ret = NULL ;
1229- bool oldcontext = trusted_context ;
12301233ErrorContextCallback pl_error_context ;
12311234
12321235/*
@@ -1376,9 +1379,6 @@ plperl_func_handler(PG_FUNCTION_ARGS)
13761379if (array_ret == NULL )
13771380SvREFCNT_dec (perlret );
13781381
1379- current_call_data = NULL ;
1380- restore_context (oldcontext );
1381-
13821382return retval ;
13831383}
13841384
@@ -1391,7 +1391,6 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
13911391Datum retval ;
13921392SV * svTD ;
13931393HV * hvTD ;
1394- bool oldcontext = trusted_context ;
13951394ErrorContextCallback pl_error_context ;
13961395
13971396/*
@@ -1491,8 +1490,6 @@ plperl_trigger_handler(PG_FUNCTION_ARGS)
14911490if (perlret )
14921491SvREFCNT_dec (perlret );
14931492
1494- current_call_data = NULL ;
1495- restore_context (oldcontext );
14961493return retval ;
14971494}
14981495