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.sgml131
1 files changed, 131 insertions, 0 deletions
diff --git a/doc/src/sgml/plperl.sgml b/doc/src/sgml/plperl.sgml
new file mode 100644
index 00000000000..d5353593867
--- /dev/null
+++ b/doc/src/sgml/plperl.sgml
@@ -0,0 +1,131 @@
+ <chapter id="pl-perl">
+ <title>Perl Procedural Language</title>
+
+ <para>
+ This chapter describes how to compile, install and
+ use PL/Perl.
+ </para>
+ <sect1>
+ <title>Overview</title>
+ <para>
+ PL/Perl allows you to write functions in the Perl scripting
+ language which may be used in SQL queries as if they were
+ built into <productname>Postgres</productname>.
+ </para>
+ <para>
+ The PL/Perl intepreter is a full Perl interpreter. However,
+ certain operations have been disabled in order to increase
+ the security level of the system.
+ </para>
+ <para>
+ In general, the operations that are restricted are those that
+ interact with the environment. This includes filehandle operations,
+ <literal>require</literal>, and <literal>use</literal> (for external
+ modules).
+ </para>
+ <para>
+ It should be noted that this security is not absolute. Indeed, several
+ Denial-of-Service attacks are still possible - memory exhaustion and
+ endless loops are two.
+ </para>
+ </sect1>
+
+ <sect1>
+ <title>Building and Installing</title>
+ <para>
+ Assuming that the <productname>Postgres</productname>
+ source tree is rooted at $PGSRC, then the Pl/perl source
+ code is located in $PGSRC/src/pl/plperl.
+ </para>
+ <para>
+ To build, simply do the following:
+ <programlisting>
+cd $PGSRC/src/pl/plperl
+perl Makefile.PL
+make
+ </programlisting>
+ </para>
+
+ <para>
+ This will create a shared library file. On a Linux system, it will be
+ named plperl.so. The extension may differ on other systems.
+ </para>
+ <para>
+ The shared library should then be copied into the lib subdirectory of the
+ postgres installation.
+ </para>
+ <para>
+ The createlang command is used to install the language into a database.
+ If it is installed into template1, all future databases will have the
+ language installed automatically.
+ </para>
+ </sect1>
+
+ <sect1>
+ <title>Using PL/Perl</title>
+ <para>
+ Assume you have the following table:
+ <programlisting>
+CREATE TABLE EMPLOYEE (
+ name text,
+ basesalary int4,
+ bonus int4 );
+ </programlisting>
+
+ In order to get the total compensation (base + bonus) we could
+ define a function as follows:
+ <programlisting>
+CREATE FUNCTION totalcomp(int4, int4) RETURNS int4
+ AS 'return $_[0] + $_[1]'
+ LANGUAGE 'plperl';
+ </programlisting>
+
+ Note that the arguments are passed to the function in
+ <literal>@_</literal> as might be expected. Also, because
+ of the quoting rules for the SQL creating the function, you
+ may find yourself using the extended quoting functions (qq[],
+ q[], qw[]) more often that you are used to.
+ </para>
+ <para>
+ We may now use our function like so:
+ <programlisting>
+SELECT name, totalcomp(basesalary, bonus) from employee
+ </programlisting>
+ </para>
+ <para>
+ But, we can also pass entire tuples to our function:
+ <programlisting>
+CREATE FUNCTION empcomp(employee) returns int4
+ AS 'my $emp = shift;
+ return $emp->{'basesalary'} + $emp->{'bonus'};'
+ LANGUAGE 'plperl';
+ </programlisting>
+ A tuple is passed as a reference to hash. The keys are the names of
+ fields in the tuples. The values are values of the corresponding
+ field in the tuple.
+ </para>
+ <para>
+ The new function <literal>empcomp</literal> can used like:
+ <programlisting>
+SELECT name, empcomp(employee) from employee;
+ </programlisting>
+ </para>
+ </sect1>
+ </chapter>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode:sgml
+sgml-omittag:nil
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:1
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:"./reference.ced"
+sgml-exposed-tags:nil
+sgml-local-catalogs:("/usr/lib/sgml/CATALOG")
+sgml-local-ecat-files:nil
+End:
+-->