suggested warning about perl nested named subroutines - Mailing list pgsql-patches

From Andrew Dunstan
Subject suggested warning about perl nested named subroutines
Date
Msg-id 434C5B75.7030108@dunslane.net
Whole thread Raw
Responses Re: suggested warning about perl nested named subroutines  (David Fetter <david@fetter.org>)
Re: suggested warning about perl nested named subroutines  (Bruce Momjian <pgman@candle.pha.pa.us>)
List pgsql-patches
I propose to add the following to the plperl docs, following recent
problems.

comments?

cheers

andrew


Index: plperl.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/plperl.sgml,v
retrieving revision 2.45
diff -c -r2.45 plperl.sgml
*** plperl.sgml 24 Aug 2005 19:16:49 -0000      2.45
--- plperl.sgml 12 Oct 2005 00:36:33 -0000
***************
*** 53,64 ****
      # PL/Perl function body
  $$ LANGUAGE plperl;
  </programlisting>
!    The body of the function is ordinary Perl code. A PL/Perl function must
     always return a scalar value.  You can return more complex structures
     (arrays, records, and sets) by returning a reference, as discussed
below.
     Never return a list.
    </para>

     <para>
      The syntax of the <command>CREATE FUNCTION</command> command requires
      the function body to be written as a string constant.  It is usually
--- 53,76 ----
      # PL/Perl function body
  $$ LANGUAGE plperl;
  </programlisting>
!    The body of the function is ordinary Perl code. In fact, the PL/Perl
!    glue code wraps it inside a Perl subroutine. A PL/Perl function must
     always return a scalar value.  You can return more complex structures
     (arrays, records, and sets) by returning a reference, as discussed
below.
     Never return a list.
    </para>

+    <note>
+       <para>
+        The use of named nested subroutines is dangerous in Perl,
especially if
+        they refer to lexical variables in the enclosing scope. Because
a PL/Perl
+        function is wrapped in a subroutine, any named subroutine you
create will
+        be nested. In general, it is far safer to create anonymous
subroutines
+        which you call via a coderef. See the <literal>perldiag</literal>
+        man page for more details.
+       </para>
+    </note>
+
     <para>
      The syntax of the <command>CREATE FUNCTION</command> command requires
      the function body to be written as a string constant.  It is usually


pgsql-patches by date:

Previous
From: Martijn van Oosterhout
Date:
Subject: Re: [PATCH] Using pread instead of lseek (with analysis)
Next
From: David Fetter
Date:
Subject: Re: suggested warning about perl nested named subroutines