plsh
plsh
plsh : PL/sh procedural language
Overview
| ID | Extension | Package | Version | Category | License | Language |
|---|---|---|---|---|---|---|
| 3080 | plsh | plsh | 1.20220917 | LANG | MIT | C |
| Attribute | Has Binary | Has Library | Need Load | Has DDL | Relocatable | Trusted |
|---|---|---|---|---|---|---|
--s-d-r | No | Yes | No | Yes | yes | no |
| Relationships | |
|---|---|
| See Also | plpgsql pg_cron pg_task pg_tle plperl plperlu plpython3u plv8 |
Packages
| Type | Repo | Version | PG Major Compatibility | Package Pattern | Dependencies |
|---|---|---|---|---|---|
| EXT | PGDG | 1.20220917 | 18 17 16 15 14 | plsh | - |
| RPM | PGDG | 1.20220917 | 18 17 16 15 14 | plsh_$v | - |
| DEB | PGDG | 1.20220917 | 18 17 16 15 14 | postgresql-$v-plsh | - |
| Linux / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
el8.x86_64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
el8.aarch64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
el9.x86_64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
el9.aarch64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
el10.x86_64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
el10.aarch64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
d12.x86_64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
d12.aarch64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
d13.x86_64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
d13.aarch64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
u22.x86_64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
u22.aarch64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
u24.x86_64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
u24.aarch64 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 | PGDG 1.20220917 |
Source
Install
Make sure PGDG repo available:
pig repo add pgdg -u # add pgdg repo and update cacheInstall this extension with pig:
pig install plsh; # install via package name, for the active PG version
pig install plsh -v 18; # install for PG 18
pig install plsh -v 17; # install for PG 17
pig install plsh -v 16; # install for PG 16
pig install plsh -v 15; # install for PG 15
pig install plsh -v 14; # install for PG 14Create this extension with:
CREATE EXTENSION plsh;Usage
plsh allows writing PostgreSQL functions as shell scripts. The function body must start with a shebang line specifying the interpreter.
CREATE EXTENSION plsh;Create Shell Functions
CREATE FUNCTION concat(text, text) RETURNS text AS '
#!/bin/sh
echo "$1$2"
' LANGUAGE plsh;
SELECT concat('hello ', 'world'); -- 'hello world'Argument Passing
Function arguments are passed as positional shell variables ($1, $2, etc.):
CREATE FUNCTION file_line_count(filename text) RETURNS int AS '
#!/bin/sh
wc -l < "$1"
' LANGUAGE plsh;Return Values
- Standard output becomes the return value (trailing newlines stripped)
- Empty output returns NULL
- Standard error output causes the function to abort with that error message
- Non-zero exit status triggers an error
CREATE FUNCTION system_uptime() RETURNS text AS '
#!/bin/sh
uptime
' LANGUAGE plsh;Database Access
Direct SPI access is not available, but psql can be used since libpq environment variables are preconfigured:
CREATE FUNCTION query_db(x int) RETURNS text AS $$
#!/bin/sh
psql -At -c "SELECT name FROM users WHERE id = $1"
$$ LANGUAGE plsh;Trigger Functions
Trigger context is available via environment variables:
| Variable | Description |
|---|---|
PLSH_TG_NAME | Trigger name |
PLSH_TG_WHEN | BEFORE, INSTEAD OF, or AFTER |
PLSH_TG_LEVEL | ROW or STATEMENT |
PLSH_TG_OP | DELETE, INSERT, UPDATE, or TRUNCATE |
PLSH_TG_TABLE_NAME | Target table name |
PLSH_TG_TABLE_SCHEMA | Target table schema |
Event trigger variables: PLSH_TG_EVENT, PLSH_TG_TAG.
Inline Execution
DO E'#!/bin/sh\necho "running shell command"' LANGUAGE plsh;Security
plsh should not be declared as TRUSTED since shell scripts have full OS-level access under the PostgreSQL user. Only superusers should create plsh functions.
Last updated on