33
33
* ENHANCEMENTS, OR MODIFICATIONS.
34
34
*
35
35
* 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 $
37
37
*
38
38
**********************************************************************/
39
39
@@ -90,9 +90,6 @@ typedef struct plperl_proc_desc
90
90
FmgrInfo arg_out_func [FUNC_MAX_ARGS ];
91
91
bool arg_is_rowtype [FUNC_MAX_ARGS ];
92
92
SV * reference ;
93
- FunctionCallInfo caller_info ;
94
- Tuplestorestate * tuple_store ;
95
- TupleDesc tuple_desc ;
96
93
} plperl_proc_desc ;
97
94
98
95
@@ -106,8 +103,11 @@ static HV *plperl_proc_hash = NULL;
106
103
107
104
static bool plperl_use_strict = false;
108
105
109
- /* this is saved and restored by plperl_call_handler */
106
+ /* these are saved and restored by plperl_call_handler */
110
107
static 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 ;
111
111
112
112
/**********************************************************************
113
113
* Forward declarations
@@ -577,10 +577,16 @@ plperl_call_handler(PG_FUNCTION_ARGS)
577
577
{
578
578
Datum retval ;
579
579
plperl_proc_desc * save_prodesc ;
580
+ FunctionCallInfo save_caller_info ;
581
+ Tuplestorestate * save_tuple_store ;
582
+ TupleDesc save_tuple_desc ;
580
583
581
584
plperl_init_all ();
582
585
583
586
save_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 ;
584
590
585
591
PG_TRY ();
586
592
{
@@ -592,11 +598,17 @@ plperl_call_handler(PG_FUNCTION_ARGS)
592
598
PG_CATCH ();
593
599
{
594
600
plperl_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 ;
595
604
PG_RE_THROW ();
596
605
}
597
606
PG_END_TRY ();
598
607
599
608
plperl_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 ;
600
612
601
613
return retval ;
602
614
}
@@ -897,16 +909,17 @@ plperl_func_handler(PG_FUNCTION_ARGS)
897
909
SV * perlret ;
898
910
Datum retval ;
899
911
ReturnSetInfo * rsi ;
912
+ SV * array_ret = NULL ;
900
913
901
914
if (SPI_connect () != SPI_OK_CONNECT )
902
915
elog (ERROR , "could not connect to SPI manager" );
903
916
904
917
prodesc = compile_plperl_function (fcinfo -> flinfo -> fn_oid , false);
905
918
906
919
plperl_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 ;
910
923
911
924
perlret = plperl_call_perl_func (prodesc , fcinfo );
912
925
@@ -958,10 +971,10 @@ plperl_func_handler(PG_FUNCTION_ARGS)
958
971
}
959
972
960
973
rsi -> returnMode = SFRM_Materialize ;
961
- if (prodesc -> tuple_store )
974
+ if (plperl_current_tuple_store )
962
975
{
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 ;
965
978
}
966
979
retval = (Datum )0 ;
967
980
}
@@ -1006,7 +1019,6 @@ plperl_func_handler(PG_FUNCTION_ARGS)
1006
1019
{
1007
1020
/* Return a perl string converted to a Datum */
1008
1021
char * val ;
1009
- SV * array_ret ;
1010
1022
1011
1023
1012
1024
if (prodesc -> fn_retisarray && SvTYPE (SvRV (perlret )) == SVt_PVAV )
@@ -1024,7 +1036,9 @@ plperl_func_handler(PG_FUNCTION_ARGS)
1024
1036
Int32GetDatum (-1 ));
1025
1037
}
1026
1038
1027
- SvREFCNT_dec (perlret );
1039
+ if (array_ret == NULL )
1040
+ SvREFCNT_dec (perlret );
1041
+
1028
1042
return retval ;
1029
1043
}
1030
1044
@@ -1526,7 +1540,7 @@ void
1526
1540
plperl_return_next (SV * sv )
1527
1541
{
1528
1542
plperl_proc_desc * prodesc = plperl_current_prodesc ;
1529
- FunctionCallInfo fcinfo = prodesc -> caller_info ;
1543
+ FunctionCallInfo fcinfo = plperl_current_caller_info ;
1530
1544
ReturnSetInfo * rsi = (ReturnSetInfo * )fcinfo -> resultinfo ;
1531
1545
MemoryContext cxt ;
1532
1546
HeapTuple tuple ;
@@ -1553,8 +1567,9 @@ plperl_return_next(SV *sv)
1553
1567
1554
1568
cxt = MemoryContextSwitchTo (rsi -> econtext -> ecxt_per_query_memory );
1555
1569
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 );
1558
1573
1559
1574
if (prodesc -> fn_retistuple )
1560
1575
{
@@ -1590,10 +1605,10 @@ plperl_return_next(SV *sv)
1590
1605
tuple = heap_form_tuple (tupdesc , & ret , & isNull );
1591
1606
}
1592
1607
1593
- if (!prodesc -> tuple_desc )
1594
- prodesc -> tuple_desc = tupdesc ;
1608
+ if (!plperl_current_tuple_desc )
1609
+ plperl_current_tuple_desc = tupdesc ;
1595
1610
1596
- tuplestore_puttuple (prodesc -> tuple_store , tuple );
1611
+ tuplestore_puttuple (plperl_current_tuple_store , tuple );
1597
1612
heap_freetuple (tuple );
1598
1613
MemoryContextSwitchTo (cxt );
1599
1614
}
0 commit comments