3333 * ENHANCEMENTS, OR MODIFICATIONS.
3434 *
3535 * IDENTIFICATION
36- * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.84 2005/07/10 16:13:13 momjian Exp $
36+ * $PostgreSQL: pgsql/src/pl/plperl/plperl.c,v 1.85 2005/07/12 01: 16:21 tgl Exp $
3737 *
3838 **********************************************************************/
3939
@@ -90,9 +90,6 @@ typedef struct plperl_proc_desc
9090FmgrInfo arg_out_func [FUNC_MAX_ARGS ];
9191bool arg_is_rowtype [FUNC_MAX_ARGS ];
9292SV * reference ;
93- FunctionCallInfo caller_info ;
94- Tuplestorestate * tuple_store ;
95- TupleDesc tuple_desc ;
9693}plperl_proc_desc ;
9794
9895
@@ -106,8 +103,11 @@ static HV *plperl_proc_hash = NULL;
106103
107104static bool plperl_use_strict = false;
108105
109- /*this is saved and restored by plperl_call_handler */
106+ /*these are saved and restored by plperl_call_handler */
110107static plperl_proc_desc * plperl_current_prodesc = NULL ;
108+ static FunctionCallInfo plperl_current_caller_info ;
109+ static Tuplestorestate * plperl_current_tuple_store ;
110+ static TupleDesc plperl_current_tuple_desc ;
111111
112112/**********************************************************************
113113 * Forward declarations
@@ -577,10 +577,16 @@ plperl_call_handler(PG_FUNCTION_ARGS)
577577{
578578Datum retval ;
579579plperl_proc_desc * save_prodesc ;
580+ FunctionCallInfo save_caller_info ;
581+ Tuplestorestate * save_tuple_store ;
582+ TupleDesc save_tuple_desc ;
580583
581584plperl_init_all ();
582585
583586save_prodesc = plperl_current_prodesc ;
587+ save_caller_info = plperl_current_caller_info ;
588+ save_tuple_store = plperl_current_tuple_store ;
589+ save_tuple_desc = plperl_current_tuple_desc ;
584590
585591PG_TRY ();
586592{
@@ -592,11 +598,17 @@ plperl_call_handler(PG_FUNCTION_ARGS)
592598PG_CATCH ();
593599{
594600plperl_current_prodesc = save_prodesc ;
601+ plperl_current_caller_info = save_caller_info ;
602+ plperl_current_tuple_store = save_tuple_store ;
603+ plperl_current_tuple_desc = save_tuple_desc ;
595604PG_RE_THROW ();
596605}
597606PG_END_TRY ();
598607
599608plperl_current_prodesc = save_prodesc ;
609+ plperl_current_caller_info = save_caller_info ;
610+ plperl_current_tuple_store = save_tuple_store ;
611+ plperl_current_tuple_desc = save_tuple_desc ;
600612
601613return retval ;
602614}
@@ -897,16 +909,17 @@ plperl_func_handler(PG_FUNCTION_ARGS)
897909SV * perlret ;
898910Datum retval ;
899911ReturnSetInfo * rsi ;
912+ SV * array_ret = NULL ;
900913
901914if (SPI_connect ()!= SPI_OK_CONNECT )
902915elog (ERROR ,"could not connect to SPI manager" );
903916
904917prodesc = compile_plperl_function (fcinfo -> flinfo -> fn_oid , false);
905918
906919plperl_current_prodesc = prodesc ;
907- prodesc -> caller_info = fcinfo ;
908- prodesc -> tuple_store = 0 ;
909- prodesc -> tuple_desc = 0 ;
920+ plperl_current_caller_info = fcinfo ;
921+ plperl_current_tuple_store = 0 ;
922+ plperl_current_tuple_desc = 0 ;
910923
911924perlret = plperl_call_perl_func (prodesc ,fcinfo );
912925
@@ -958,10 +971,10 @@ plperl_func_handler(PG_FUNCTION_ARGS)
958971}
959972
960973rsi -> returnMode = SFRM_Materialize ;
961- if (prodesc -> tuple_store )
974+ if (plperl_current_tuple_store )
962975{
963- rsi -> setResult = prodesc -> tuple_store ;
964- rsi -> setDesc = prodesc -> tuple_desc ;
976+ rsi -> setResult = plperl_current_tuple_store ;
977+ rsi -> setDesc = plperl_current_tuple_desc ;
965978}
966979retval = (Datum )0 ;
967980}
@@ -1006,7 +1019,6 @@ plperl_func_handler(PG_FUNCTION_ARGS)
10061019{
10071020/* Return a perl string converted to a Datum */
10081021char * val ;
1009- SV * array_ret ;
10101022
10111023
10121024if (prodesc -> fn_retisarray && SvTYPE (SvRV (perlret ))== SVt_PVAV )
@@ -1024,7 +1036,9 @@ plperl_func_handler(PG_FUNCTION_ARGS)
10241036Int32GetDatum (-1 ));
10251037}
10261038
1027- SvREFCNT_dec (perlret );
1039+ if (array_ret == NULL )
1040+ SvREFCNT_dec (perlret );
1041+
10281042return retval ;
10291043}
10301044
@@ -1526,7 +1540,7 @@ void
15261540plperl_return_next (SV * sv )
15271541{
15281542plperl_proc_desc * prodesc = plperl_current_prodesc ;
1529- FunctionCallInfo fcinfo = prodesc -> caller_info ;
1543+ FunctionCallInfo fcinfo = plperl_current_caller_info ;
15301544ReturnSetInfo * rsi = (ReturnSetInfo * )fcinfo -> resultinfo ;
15311545MemoryContext cxt ;
15321546HeapTuple tuple ;
@@ -1553,8 +1567,9 @@ plperl_return_next(SV *sv)
15531567
15541568cxt = MemoryContextSwitchTo (rsi -> econtext -> ecxt_per_query_memory );
15551569
1556- if (!prodesc -> tuple_store )
1557- prodesc -> tuple_store = tuplestore_begin_heap (true, false,work_mem );
1570+ if (!plperl_current_tuple_store )
1571+ plperl_current_tuple_store =
1572+ tuplestore_begin_heap (true, false,work_mem );
15581573
15591574if (prodesc -> fn_retistuple )
15601575{
@@ -1590,10 +1605,10 @@ plperl_return_next(SV *sv)
15901605tuple = heap_form_tuple (tupdesc ,& ret ,& isNull );
15911606}
15921607
1593- if (!prodesc -> tuple_desc )
1594- prodesc -> tuple_desc = tupdesc ;
1608+ if (!plperl_current_tuple_desc )
1609+ plperl_current_tuple_desc = tupdesc ;
15951610
1596- tuplestore_puttuple (prodesc -> tuple_store ,tuple );
1611+ tuplestore_puttuple (plperl_current_tuple_store ,tuple );
15971612heap_freetuple (tuple );
15981613MemoryContextSwitchTo (cxt );
15991614}