PL/Perl - Perl Procedural Language PL/Perl allows you to write functions in the Perl programming language that 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 maintain the security 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 examples. Building and Installing In order to build and install PL/Perl if you are installing Postgres from source then the must be supplied to the configure script. PL/Perl requires that, when Perl was installed, the libperl library was build as a shared object. At the time of this writing, this is almost never the case in the Perl packages that are distributed with the operating systems. A message like this will appear during the build to point out this fact: ***** * Cannot build PL/Perl because libperl is not a shared library. * Skipped. ***** Therefore it is likely that you will have to re-build and install Perl manually to be able to build PL/Perl. When you want to retry to build PL/Perl after having reinstalled Perl, then change to the directory src/pl/plperl in the Postgres source tree and issue the commands gmake clean gmake all gmake install The createlang command is used to install the language into a database. $ createlang plperl template1 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 integer, bonus integer ); In order to get the total compensation (base + bonus) we could define a function as follows: CREATE FUNCTION totalcomp(integer, integer) RETURNS integer AS 'return $_[0] + $_[1]' LANGUAGE 'plperl'; Notice that the arguments to the function are passed in @_ as might be expected. We can now use our function like so: SELECT name, totalcomp(basesalary, bonus) FROM employee; But, we can also pass entire tuples to our functions: CREATE FUNCTION empcomp(employee) RETURNS integer AS ' my $emp = shift; return $emp->{''basesalary''} + $emp->{''bonus''}; ' LANGUAGE 'plperl'; A tuple is passed as a reference to a hash. The keys are the names of the fields in the tuples. The hash values are values of the corresponding fields in the tuple. Because the function body is passed as an SQL string literal to CREATE FUNCTION you have to escape single quotes within your Perl source, either by doubling them as shown above, or by using the extended quoting functions (q[], qq[], qw[]). Backslashes must be escaped by doubling them. The new function empcomp can used like: SELECT name, empcomp(employee) FROM employee; Here is an example of a function that will not work because file system operations are not allowed for security reasons: CREATE FUNCTION badfunc() RETURNS integer AS ' open(TEMP, ">/tmp/badfile"); print TEMP "Gotcha!\n"; return 1; ' LANGUAGE 'plperl'; The creation of the function will succeed, but executing it will not.