Perl Procedural Language This chapter describes how to compile, install and use PL/Perl. Overview 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 Postgres. 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. In general, the operations that are restricted are those that interact with the environment. This includes filehandle operations, require, and use (for external modules). 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. Building and Installing Assuming that the Postgres source tree is rooted at $PGSRC, then the Pl/perl source code is located in $PGSRC/src/pl/plperl. To build, simply do the following: cd $PGSRC/src/pl/plperl perl Makefile.PL make This will create a shared library file. On a Linux system, it will be named plperl.so. The extension may differ on other systems. The shared library should then be copied into the lib subdirectory of the postgres installation. 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. Using PL/Perl Assume you have the following table: CREATE TABLE EMPLOYEE ( name text, basesalary int4, bonus int4 ); In order to get the total compensation (base + bonus) we could define a function as follows: CREATE FUNCTION totalcomp(int4, int4) RETURNS int4 AS 'return $_[0] + $_[1]' LANGUAGE 'plperl'; Note that the arguments are passed to the function in @_ 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. We may now use our function like so: SELECT name, totalcomp(basesalary, bonus) from employee But, we can also pass entire tuples to our function: CREATE FUNCTION empcomp(employee) returns int4 AS 'my $emp = shift; return $emp->{'basesalary'} + $emp->{'bonus'};' LANGUAGE 'plperl'; 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. The new function empcomp can used like: SELECT name, empcomp(employee) from employee;