If you do:

# DO $do$ 1; $do$ LANGUAGE plperlu;
# DO $do$ 1; $do$ LANGUAGE plperl;

You get a segfault as we try to SvREFCNT_dec(...); for the wrong
interpreter.  To fix push down the restore_context() so that we do the
above on the correct perl interpreter.
--
 *** a/src/pl/plperl/plperl.c
--- b/src/pl/plperl/plperl.c
***************
*** 1154,1170 **** plperl_inline_handler(PG_FUNCTION_ARGS)
        PG_CATCH();
        {
                current_call_data = save_call_data;
-               restore_context(oldcontext);
                if (desc.reference)
                        SvREFCNT_dec(desc.reference);
                PG_RE_THROW();
        }
        PG_END_TRY();

        current_call_data = save_call_data;
-       restore_context(oldcontext);
        if (desc.reference)
                SvREFCNT_dec(desc.reference);

        error_context_stack = pl_error_context.previous;

--- 1154,1170 ----
        PG_CATCH();
        {
                current_call_data = save_call_data;
                if (desc.reference)
                        SvREFCNT_dec(desc.reference);
+               restore_context(oldcontext);
                PG_RE_THROW();
        }
        PG_END_TRY();

        current_call_data = save_call_data;
        if (desc.reference)
                SvREFCNT_dec(desc.reference);
+       restore_context(oldcontext);

        error_context_stack = pl_error_context.previous;
*** a/src/pl/plperl/plperl.c
--- b/src/pl/plperl/plperl.c
***************
*** 1154,1170 **** plperl_inline_handler(PG_FUNCTION_ARGS)
  	PG_CATCH();
  	{
  		current_call_data = save_call_data;
- 		restore_context(oldcontext);
  		if (desc.reference)
  			SvREFCNT_dec(desc.reference);
  		PG_RE_THROW();
  	}
  	PG_END_TRY();
  
  	current_call_data = save_call_data;
- 	restore_context(oldcontext);
  	if (desc.reference)
  		SvREFCNT_dec(desc.reference);
  
  	error_context_stack = pl_error_context.previous;
  
--- 1154,1170 ----
  	PG_CATCH();
  	{
  		current_call_data = save_call_data;
  		if (desc.reference)
  			SvREFCNT_dec(desc.reference);
+ 		restore_context(oldcontext);
  		PG_RE_THROW();
  	}
  	PG_END_TRY();
  
  	current_call_data = save_call_data;
  	if (desc.reference)
  		SvREFCNT_dec(desc.reference);
+ 	restore_context(oldcontext);
  
  	error_context_stack = pl_error_context.previous;
  
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to