aboutsummaryrefslogtreecommitdiff
path: root/doc/src/sgml/plperl.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/plperl.sgml')
-rw-r--r--doc/src/sgml/plperl.sgml416
1 files changed, 193 insertions, 223 deletions
diff --git a/doc/src/sgml/plperl.sgml b/doc/src/sgml/plperl.sgml
index c04ff95d929..97981bf603e 100644
--- a/doc/src/sgml/plperl.sgml
+++ b/doc/src/sgml/plperl.sgml
@@ -1,5 +1,5 @@
<!--
-$Header: /cvsroot/pgsql/doc/src/sgml/plperl.sgml,v 2.16 2002/03/06 19:05:57 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/plperl.sgml,v 2.17 2002/09/18 20:09:32 petere Exp $
-->
<chapter id="plperl">
@@ -14,154 +14,75 @@ $Header: /cvsroot/pgsql/doc/src/sgml/plperl.sgml,v 2.16 2002/03/06 19:05:57 momj
</indexterm>
<para>
- PL/Perl is a loadable procedural language
- that enables the <ulink url="http://www.perl.com">Perl</ulink> programming
- language to be used to write
- <productname>PostgreSQL</productname> functions.
- </para>
-
- <!-- **** PL/Perl overview **** -->
-
- <sect1 id="plperl-overview">
- <title>Overview</title>
-
- <para>
- Normally, PL/Perl is installed as a <quote>trusted</> programming
- language named <literal>plperl</>. In this setup, certain Perl
- operations are disabled to preserve security. In general, the operations
- that are restricted are those that interact with the environment. This
- includes file handle operations, <literal>require</literal>, and
- <literal>use</literal> (for external modules).
- There is no way to access internals of the
- database backend or to gain OS-level access under the permissions of the
- <productname>PostgreSQL</productname> user ID, as a C function can do.
- Thus, any unprivileged database user may be
- permitted to use this language.
- </para>
- <para>
- Sometimes it is desirable to write Perl functions that are not restricted
- --- for example, one might want a Perl function that sends
- mail. To handle these cases, PL/Perl can also be installed as an
- <quote>untrusted</> language (usually named <literal>plperlu</>).
- In this case the full Perl language is available. The writer of a PL/PerlU
- function must take care that the function cannot be used to do anything
- unwanted, since it will be able to do anything that could be done by
- a user logged in as the database administrator. Note that the database
- system allows only database superusers to create functions in untrusted
- languages.
- </para>
- </sect1>
-
- <sect1 id="plperl-install">
- <title>Building and Installing PL/Perl</title>
-
- <para>
- If the <option>--with-perl</option> option was supplied to the
- <indexterm><primary><filename>configure</filename></primary></indexterm>
- <filename>configure</filename> script,
- the <productname>PostgreSQL</productname> build process will attempt to
- build the PL/Perl shared library and install it in the
- <productname>PostgreSQL</productname> library directory.
+ PL/Perl is a loadable procedural language that enables you to write
+ <productname>PostgreSQL</productname> functions in the <ulink
+ url="http://www.perl.com">Perl</ulink> programming language.
</para>
<para>
- On most platforms, since PL/Perl is a shared library, the
- <indexterm><primary>libperl</primary></indexterm>
- <filename>libperl</filename> library must be a shared library also.
- At the time of this writing, this is almost never the case in prebuilt
- Perl packages. If this difficulty arises in your situation, a
- message like this will appear during the build to point out this
- fact:
-<screen>
-<computeroutput>
-*** Cannot build PL/Perl because libperl is not a shared library.
-*** You might have to rebuild your Perl installation. Refer to
-*** the documentation for details.
-</computeroutput>
-</screen>
- If you see this, you will have to re-build and install
- <productname>Perl</productname> manually to be able to build
- PL/Perl. During the configuration process for
- <productname>Perl</productname>, request a shared library.
+ To install PL/Perl in a particular database, use
+ <literal>createlang plperl <replaceable>dbname</></literal>.
</para>
- <para>
- After having reinstalled Perl, change to the directory
- <filename>src/pl/plperl</filename> in the
- <productname>PostgreSQL</productname> source tree and issue the commands
-<programlisting>
-gmake clean
-gmake all
-gmake install
-</programlisting>
- to complete the build and installation of the PL/Perl shared library.
- </para>
-
- <para>
- To install
- PL/Perl and/or PL/PerlU in a particular database, use the
- <filename>createlang</filename> script, for example
- <literal>createlang plperl <replaceable>dbname</></literal> or
- <literal>createlang plperlu <replaceable>dbname</></literal>.
- </para>
-
<tip>
<para>
If a language is installed into <literal>template1</>, all subsequently
created databases will have the language installed automatically.
</para>
</tip>
- </sect1>
-
- <!-- **** PL/Perl description **** -->
- <sect1 id="plperl-description">
- <title>Description</title>
-
- <sect2>
- <title>PL/Perl Functions and Arguments</title>
+ <note>
+ <para>
+ Users of source packages must specially enable the build of
+ PL/Perl during the installation process (refer to the installation
+ instructions for more information). Users of binary packages
+ might find PL/Perl in a separate subpackage.
+ </para>
+ </note>
- <para>
- To create a function in the PL/Perl language, use the standard syntax
+ <sect1 id="plperl-funcs">
+ <title>PL/Perl Functions and Arguments</title>
- <programlisting>
+ <para>
+ To create a function in the PL/Perl language, use the standard syntax:
+<programlisting>
CREATE FUNCTION <replaceable>funcname</replaceable> (<replaceable>argument-types</replaceable>) RETURNS <replaceable>return-type</replaceable> AS '
# PL/Perl function body
' LANGUAGE plperl;
- </programlisting>
-
- PL/PerlU is the same, except that the language should be specified as
- <literal>plperlu</>.
- </para>
+</programlisting>
+ The body of the function is ordinary Perl code.
+ </para>
- <para>
- The body of the function is ordinary Perl code. Arguments and
- results are handled as in any other Perl subroutine: arguments
- are passed in <varname>@_</varname>, and a result value is returned
- with <literal>return</> or as the last expression evaluated in the
- function. For example, a function
- returning the greater of two integer values could be defined as:
+ <para>
+ Arguments and results are handled as in any other Perl subroutine:
+ Arguments are passed in <varname>@_</varname>, and a result value
+ is returned with <literal>return</> or as the last expression
+ evaluated in the function. For example, a function returning the
+ greater of two integer values could be defined as:
- <programlisting>
+<programlisting>
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS '
if ($_[0] > $_[1]) { return $_[0]; }
return $_[1];
' LANGUAGE plperl;
- </programlisting>
-
- If a NULL is passed to a function, the argument value will appear
- as <quote>undefined</> in Perl. The above function definition will
- not behave very nicely with NULL inputs (in fact, it will act as
- though they are zeroes). We could add <literal>WITH (isStrict)</>
- to the function definition to make <productname>PostgreSQL</productname>
- do something more reasonable: if a NULL is passed, the
- function will not be called at all, but will just return a NULL
- result automatically. Alternatively, we could check for undefined
- inputs in the function body. For example, suppose that we wanted perl_max
- with one null and one non-null argument to return the non-null
- argument, rather than NULL:
-
- <programlisting>
+</programlisting>
+ </para>
+
+ <para>
+ If an SQL null value is passed to a function, the argument value
+ will appear as <quote>undefined</> in Perl. The above function
+ definition will not behave very nicely with null inputs (in fact,
+ it will act as though they are zeroes). We could add
+ <literal>STRICT</> to the function definition to make
+ <productname>PostgreSQL</productname> do something more reasonable:
+ if a null value is passed, the function will not be called at all,
+ but will just return a null result automatically. Alternatively,
+ we could check for undefined inputs in the function body. For
+ example, suppose that we wanted <function>perl_max</function> with
+ one null and one non-null argument to return the non-null argument,
+ rather than a null value:
+
+<programlisting>
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS '
my ($a,$b) = @_;
if (! defined $a) {
@@ -172,21 +93,21 @@ CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS '
if ($a > $b) { return $a; }
return $b;
' LANGUAGE plperl;
- </programlisting>
- </para>
+</programlisting>
+ </para>
- <para>
- As shown above,
- to return a NULL from a PL/Perl function, return an undefined
- value. This can be done whether the function is strict or not.
- </para>
+ <para>
+ As shown above, to return an SQL null value from a PL/Perl
+ function, return an undefined value. This can be done whether the
+ function is strict or not.
+ </para>
- <para>
- Composite-type arguments are passed to the function as references to
- hashes. The keys of the hash are the attribute names of the composite
- type. Here is an example:
+ <para>
+ Composite-type arguments are passed to the function as references
+ to hashes. The keys of the hash are the attribute names of the
+ composite type. Here is an example:
- <programlisting>
+<programlisting>
CREATE TABLE employee (
name text,
basesalary integer,
@@ -199,25 +120,97 @@ CREATE FUNCTION empcomp(employee) RETURNS integer AS '
' LANGUAGE plperl;
SELECT name, empcomp(employee) FROM employee;
- </programlisting>
- </para>
+</programlisting>
+ </para>
- <para>
- There is not currently any support for returning a composite-type
- result value.
- </para>
+ <para>
+ There is currently no support for returning a composite-type result
+ value.
+ </para>
<tip>
<para>
Because the function body is passed as an SQL string literal to
<command>CREATE FUNCTION</command>, you have to escape single
- quotes and backslashes within your Perl source, typically by doubling them
- as shown in the above example. Another possible approach is to
- avoid writing single quotes by using Perl's extended quoting functions
- (<literal>q[]</literal>, <literal>qq[]</literal>,
- <literal>qw[]</literal>).
+ quotes and backslashes within your Perl source, typically by
+ doubling them as shown in the above example. Another possible
+ approach is to avoid writing single quotes by using Perl's
+ extended quoting operators (<literal>q[]</literal>,
+ <literal>qq[]</literal>, <literal>qw[]</literal>).
</para>
</tip>
+ </sect1>
+
+ <sect1 id="plperl-data">
+ <title>Data Values in PL/Perl</title>
+
+ <para>
+ The argument values supplied to a PL/Perl function's script are
+ simply the input arguments converted to text form (just as if they
+ had been displayed by a <literal>SELECT</literal> statement).
+ Conversely, the <literal>return</> command will accept any string
+ that is acceptable input format for the function's declared return
+ type. So, the PL/Perl programmer can manipulate data values as if
+ they were just text.
+ </para>
+ </sect1>
+
+ <sect1 id="plperl-database">
+ <title>Database Access from PL/Perl</title>
+
+ <para>
+ Access to the database itself from your Perl function can be done via
+ an experimental module <ulink
+ url="http://www.cpan.org/modules/by-module/DBD/APILOS/"><literal>DBD::PgSPI</literal></ulink>
+ (also available at <ulink url="http://www.cpan.org/SITES.html">CPAN
+ mirror sites</ulink>). This module makes available a
+ <acronym>DBI</>-compliant database-handle named
+ <varname>$pg_dbh</varname> that can be used to perform queries
+ with normal <acronym>DBI</> syntax.
+ </para>
+
+ <para>
+ PL/Perl itself presently provides only one additional Perl command:
+
+ <variablelist>
+ <varlistentry>
+ <indexterm>
+ <primary>elog</primary>
+ <secondary>PL/Perl</secondary>
+ </indexterm>
+
+ <term><function>elog</> <replaceable>level</replaceable>, <replaceable>msg</replaceable></term>
+ <listitem>
+ <para>
+ Emit a log or error message. Possible levels are
+ <literal>DEBUG</>, <literal>LOG</>, <literal>INFO</>,
+ <literal>NOTICE</>, <literal>WARNING</>, and <literal>ERROR</>.
+ <literal>ERROR</> raises an error condition: further execution
+ of the function is abandoned, and the current transaction is
+ aborted.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </sect1>
+
+ <sect1 id="plperl-trusted">
+ <title>Trusted and Untrusted PL/Perl</title>
+
+ <para>
+ Normally, PL/Perl is installed as a <quote>trusted</> programming
+ language named <literal>plperl</>. In this setup, certain Perl
+ operations are disabled to preserve security. In general, the
+ operations that are restricted are those that interact with the
+ environment. This includes file handle operations,
+ <literal>require</literal>, and <literal>use</literal> (for
+ external modules). There is no way to access internals of the
+ database backend process or to gain OS-level access with the
+ permissions of the <productname>PostgreSQL</productname> user ID,
+ as a C function can do. Thus, any unprivileged database user may
+ be permitted to use this language.
+ </para>
<para>
Here is an example of a function that will not work because file
@@ -231,89 +224,66 @@ CREATE FUNCTION badfunc() RETURNS integer AS '
</programlisting>
The creation of the function will succeed, but executing it will not.
</para>
+
<para>
- Note that if the same function was created by a superuser using language
- <literal>plperlu</>, execution would succeed.
+ Sometimes it is desirable to write Perl functions that are not
+ restricted --- for example, one might want a Perl function that
+ sends mail. To handle these cases, PL/Perl can also be installed
+ as an <quote>untrusted</> language (usually called
+ <quote>PL/PerlU</quote>). In this case the full Perl language is
+ available. If the <command>createlang</command> program is used to
+ install the language, the language name <literal>plperlu</literal>
+ will select the untrusted PL/Perl variant.
</para>
- </sect2>
-
- <sect2>
- <title>Data Values in PL/Perl</title>
-
- <para>
- The argument values supplied to a PL/Perl function's script are simply
- the input arguments converted to text form (just as if they had been
- displayed by a SELECT statement). Conversely, the <literal>return</>
- command will accept any string that is acceptable input format for
- the function's declared return type. So, the PL/Perl programmer can
- manipulate data values as if they were just text.
- </para>
+ <para>
+ The writer of a PL/PerlU function must take care that the function
+ cannot be used to do anything unwanted, since it will be able to do
+ anything that could be done by a user logged in as the database
+ administrator. Note that the database system allows only database
+ superusers to create functions in untrusted languages.
+ </para>
- </sect2>
+ <para>
+ If the above function was created by a superuser using the language
+ <literal>plperlu</>, execution would succeed.
+ </para>
+ </sect1>
- <sect2>
- <title>Database Access from PL/Perl</title>
+ <sect1 id="plperl-missing">
+ <title>Missing Features</title>
<para>
- Access to the database itself from your Perl function can be done via
- an experimental module <ulink
- url="http://www.cpan.org/modules/by-module/DBD/APILOS/"><literal>DBD::PgSPI</literal></ulink>
- (also available at <ulink url="http://www.cpan.org/SITES.html">CPAN
- mirror sites</ulink>). This module makes available a
- <acronym>DBI</>-compliant database-handle named
- <varname>$pg_dbh</varname> that can be used to perform queries
- with normal <acronym>DBI</> syntax.
+ The following features are currently missing from PL/Perl, but they
+ would make welcome contributions:
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ PL/Perl functions cannot call each other directly (because they
+ are anonymous subroutines inside Perl). There's presently no
+ way for them to share global variables, either.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ PL/Perl cannot be used to write trigger functions.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ <application>DBD::PgSPI</applicatioN> or similar capability
+ should be integrated into the standard
+ <productname>PostgreSQL</productname> distribution.
+ </para>
+ </listitem>
+ </itemizedlist>
</para>
+ </sect1>
- <para>
- PL/Perl itself presently provides only one additional Perl command:
- </para>
-
- <variablelist>
- <varlistentry>
- <indexterm>
- <primary>elog</primary>
- </indexterm>
- <term><function>elog</> <replaceable>level</replaceable>, <replaceable>msg</replaceable></term>
- <listitem>
- <para>
- Emit a log or error message. Possible levels are
- <literal>DEBUG</>, <literal>LOG</>, <literal>INFO</>,
- <literal>NOTICE</>, <literal>WARNING</>, and <literal>ERROR</>.
- <literal>ERROR</> raises an error condition: further execution
- of the function is abandoned, and the current transaction is
- aborted.
- </para>
- </listitem>
- </varlistentry>
-
- </variablelist>
-
- </sect2>
-
- <sect2>
- <title>Missing Features</title>
-
- <para>
- PL/Perl functions cannot call each other directly (because they
- are anonymous subroutines inside Perl). There's presently
- no way for them to share global variables, either.
- </para>
-
- <para>
- PL/Perl cannot currently be used to write trigger functions.
- </para>
-
- <para>
- DBD::PgSPI or similar capability should be integrated
- into the standard <productname>PostgreSQL</productname> distribution.
- </para>
-
- </sect2>
-
- </sect1>
- </chapter>
+</chapter>
<!-- Keep this comment at the end of the file
Local variables: