PL/Tcl is a loadable procedural language for the PostgreSQL database system that enables the Tcl language to be used to write functions and trigger procedures.
PL/Tcl offers most of the capabilities a function writer has in the C language, with a few restrictions, and with the addition of the powerful string processing libraries that are available for Tcl.
One compelling good restriction is that
everything is executed from within the safety of the context of
a Tcl interpreter. In addition to the limited command set of
safe Tcl, only a few commands are available to access the
database via SPI and to raise messages via
elog(). PL/Tcl provides no way to access
internals of the database server or to gain OS-level access
under the permissions of the PostgreSQL server process, as a C function
can do. Thus, unprivileged database users may be trusted to use
this language; it does not give them unlimited authority.
The other notable implementation restriction is that Tcl functions may not be used to create input/output functions for new data types.
Sometimes it is desirable to write Tcl functions that are not restricted to safe Tcl. For example, one might want a Tcl function that sends email. To handle these cases, there is a variant of PL/Tcl called PL/TclU (for untrusted Tcl). This is the exact same language except that a full Tcl interpreter is used. If PL/TclU is used, it must be installed as an untrusted procedural language so that only database superusers can create functions in it. The writer of a PL/TclU 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.
The shared object code for the PL/Tcl and PL/TclU call handlers is automatically built and installed in the PostgreSQL library directory if Tcl support is specified in the configuration step of the installation procedure. To install PL/Tcl and/or PL/TclU in a particular database, use the createlang program, for example createlang pltcl dbname or createlang pltclu dbname.