From: Bruce Momjian <bruce@momjian.us> Date: Wed, 12 Oct 2005 14:28:33 +0000 (+0000) Subject: Add warning about plperl nested named subroutines X-Git-Tag: REL8_1_0BETA4~89 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6b97e437ca20cbfcff059c668516c59914f5ba4d;p=postgresql Add warning about plperl nested named subroutines Andrew Dunstan --- diff --git a/doc/src/sgml/plperl.sgml b/doc/src/sgml/plperl.sgml index f1a99a1f99..9ae95feb1b 100644 --- a/doc/src/sgml/plperl.sgml +++ b/doc/src/sgml/plperl.sgml @@ -1,5 +1,5 @@ <!-- -$PostgreSQL: pgsql/doc/src/sgml/plperl.sgml,v 2.45 2005/08/24 19:16:49 tgl Exp $ +$PostgreSQL: pgsql/doc/src/sgml/plperl.sgml,v 2.46 2005/10/12 14:28:33 momjian Exp $ --> <chapter id="plperl"> @@ -53,22 +53,34 @@ CREATE FUNCTION <replaceable>funcname</replaceable> (<replaceable>argument-types # PL/Perl function body $$ LANGUAGE plperl; </programlisting> - The body of the function is ordinary Perl code. A PL/Perl function must + 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 syntax of the <command>CREATE FUNCTION</command> command requires - the function body to be written as a string constant. It is usually - most convenient to use dollar quoting (see <xref - linkend="sql-syntax-dollar-quoting">) for the string constant. - If you choose to use regular single-quoted string constant syntax, - you must escape single quote marks (<literal>'</>) and backslashes - (<literal>\</>) used in the body of the function, typically by - doubling them (see <xref linkend="sql-syntax-strings">). + 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 + most convenient to use dollar quoting (see <xref + linkend="sql-syntax-dollar-quoting">) for the string constant. + If you choose to use regular single-quoted string constant syntax, + you must escape single quote marks (<literal>'</>) and backslashes + (<literal>\</>) used in the body of the function, typically by + doubling them (see <xref linkend="sql-syntax-strings">). + </para> <para> Arguments and results are handled as in any other Perl subroutine: