Atached patch fix this bug

Serg


Andrew Dunstan wrote:


Can anyone suggest why I might be seeing this effect (each notice comes out once per row plus once per function call)


thanks

andrew

andrew=# create function tstset() returns setof tst language plperl as $$
andrew$# elog(NOTICE,"tstset called");
andrew$# return [{i=>1,v=>"one"},{i=>2,v=>"two"}];
andrew$# $$;
CREATE FUNCTION
andrew=# select * from tstset();
NOTICE:  tstset called
NOTICE:  tstset called
NOTICE:  tstset called
i |  v ---+-----
1 | one
2 | two
(2 rows)

_______________________________________________
Plperlng-devel mailing list
[EMAIL PROTECTED]
http://pgfoundry.org/mailman/listinfo/plperlng-devel


*** plperl.c    2004-07-01 23:50:22.000000000 +0300
--- newplperl.c 2004-07-06 11:57:56.000000000 +0300
***************
*** 99,104 ****
--- 99,105 ----
  static HV  *plperl_proc_hash = NULL;
  AV               *g_row_keys = NULL;
  AV               *g_column_keys = NULL;
+ SV               *srf_perlret=NULL; /*keep returned value*/
  int                   g_attr_num = 0;
  
  /**********************************************************************
***************
*** 839,847 ****
        /* Find or compile the function */
        prodesc = compile_plperl_function(fcinfo->flinfo->fn_oid, false);
        /************************************************************
!        * Call the Perl function
         ************************************************************/
!       perlret = plperl_call_perl_func(prodesc, fcinfo);
        if (prodesc->fn_retistuple && SRF_IS_FIRSTCALL())
        {
  
--- 840,855 ----
        /* Find or compile the function */
        prodesc = compile_plperl_function(fcinfo->flinfo->fn_oid, false);
        /************************************************************
!        * Call the Perl function if not returning set
         ************************************************************/
!        if (!prodesc->fn_retistuple)
!               perlret = plperl_call_perl_func(prodesc, fcinfo);
!        else {
!               if (SRF_IS_FIRSTCALL()) /*call function only once*/
!                       srf_perlret = plperl_call_perl_func(prodesc, fcinfo);
!               perlret = srf_perlret;
!       }
! 
        if (prodesc->fn_retistuple && SRF_IS_FIRSTCALL())
        {
  
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to