Skip to content

plx

plx : Transpile multiple procedural dialects to PL/pgSQL

Overview

ID Extension Package Version Category License Language
3140
plx
plx
1.3.1
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
plv8
pllua
pljava
plperl
plpython3u
plprql
plsh

Uses PostgreSQL’s built-in PL/pgSQL call handler; no control-file dependency is declared.

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PIGSTY
1.3.1
18
17
16
15
14
plx -
RPM
PIGSTY
1.3.1
18
17
16
15
14
plx_$v -
DEB
PIGSTY
1.3.1
18
17
16
15
14
postgresql-$v-plx -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
el8.aarch64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
el9.x86_64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
el9.aarch64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
el10.x86_64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
el10.aarch64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
d12.x86_64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
d12.aarch64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
d13.x86_64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
d13.aarch64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
u22.x86_64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
u22.aarch64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
u24.x86_64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
u24.aarch64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
u26.x86_64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
u26.aarch64
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
PIGSTY 1.3.1
Package Version OS ORG SIZE File URL
plx_18 1.3.1 el8.x86_64 pigsty 103.9 KiB plx_18-1.3.1-1PIGSTY.el8.x86_64.rpm
plx_18 1.3.1 el8.aarch64 pigsty 98.5 KiB plx_18-1.3.1-1PIGSTY.el8.aarch64.rpm
plx_18 1.3.1 el9.x86_64 pigsty 110.8 KiB plx_18-1.3.1-1PIGSTY.el9.x86_64.rpm
plx_18 1.3.1 el9.aarch64 pigsty 106.6 KiB plx_18-1.3.1-1PIGSTY.el9.aarch64.rpm
plx_18 1.3.1 el10.x86_64 pigsty 116.2 KiB plx_18-1.3.1-1PIGSTY.el10.x86_64.rpm
plx_18 1.3.1 el10.aarch64 pigsty 109.6 KiB plx_18-1.3.1-1PIGSTY.el10.aarch64.rpm
postgresql-18-plx 1.3.1 d12.x86_64 pigsty 307.9 KiB postgresql-18-plx_1.3.1-1PIGSTY~bookworm_amd64.deb
postgresql-18-plx 1.3.1 d12.aarch64 pigsty 296.2 KiB postgresql-18-plx_1.3.1-1PIGSTY~bookworm_arm64.deb
postgresql-18-plx 1.3.1 d13.x86_64 pigsty 309.6 KiB postgresql-18-plx_1.3.1-1PIGSTY~trixie_amd64.deb
postgresql-18-plx 1.3.1 d13.aarch64 pigsty 296.8 KiB postgresql-18-plx_1.3.1-1PIGSTY~trixie_arm64.deb
postgresql-18-plx 1.3.1 u22.x86_64 pigsty 324.8 KiB postgresql-18-plx_1.3.1-1PIGSTY~jammy_amd64.deb
postgresql-18-plx 1.3.1 u22.aarch64 pigsty 320.9 KiB postgresql-18-plx_1.3.1-1PIGSTY~jammy_arm64.deb
postgresql-18-plx 1.3.1 u24.x86_64 pigsty 321.2 KiB postgresql-18-plx_1.3.1-1PIGSTY~noble_amd64.deb
postgresql-18-plx 1.3.1 u24.aarch64 pigsty 315.0 KiB postgresql-18-plx_1.3.1-1PIGSTY~noble_arm64.deb
postgresql-18-plx 1.3.1 u26.x86_64 pigsty 318.0 KiB postgresql-18-plx_1.3.1-1PIGSTY~resolute_amd64.deb
postgresql-18-plx 1.3.1 u26.aarch64 pigsty 312.9 KiB postgresql-18-plx_1.3.1-1PIGSTY~resolute_arm64.deb

Source

pig build pkg plx;		# build rpm/deb

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install this extension with pig:

pig install plx;		# install via package name, for the active PG version

pig install plx -v 18;   # install for PG 18
pig install plx -v 17;   # install for PG 17
pig install plx -v 16;   # install for PG 16
pig install plx -v 15;   # install for PG 15
pig install plx -v 14;   # install for PG 14

Create this extension with:

CREATE EXTENSION plx;

Usage

Sources:

plx provides familiar procedural-language dialects that transpile to ordinary PL/pgSQL when CREATE FUNCTION runs. PostgreSQL stores and executes the generated PL/pgSQL with its built-in trusted handler; no Ruby, PHP, JavaScript, Python, Go, COBOL, Oracle, or SQL Server runtime is loaded into the backend.

CREATE EXTENSION plx;

Available Dialects

Language Surface syntax
plxruby Ruby
plxphp PHP
plxjs JavaScript
plxts TypeScript annotations over the JavaScript dialect
plxpython3 Python 3
plxgo Go
plxcobol ISO COBOL
plxplsql Oracle PL/SQL
plxtsql Transact-SQL

All dialects target the same PL/pgSQL statement surface, including assignments, conditionals, loops, query iteration, dynamic SQL, cursors, exceptions, triggers, and set-returning functions.

Create a Function

Choose a dialect in the LANGUAGE clause while keeping the function signature in PostgreSQL types:

CREATE FUNCTION grade(score integer)
RETURNS text
LANGUAGE plxruby
AS $$
  grade #:: text
  if score >= 90
    grade = "A"
  elsif score >= 80
    grade = "B"
  else
    grade = "F"
  end
  return grade
$$;

SELECT grade(85);

Translation happens once, when the function is created. The executable body stored in pg_proc.prosrc is regular PL/pgSQL, so it can be dumped, reviewed, and run without a separate interpreter.

Inspect and Debug Generated Code

SELECT pg_get_functiondef('grade(integer)'::regprocedure);
SELECT prosrc
FROM pg_proc
WHERE oid = 'grade(integer)'::regprocedure;

SELECT plx_source('grade(integer)'::regprocedure);

Runtime error line numbers refer to generated PL/pgSQL. plx_source() recovers the original embedded dialect body; use it together with pg_get_functiondef() when correlating an error with the source.

SQL and String Building

Expressions retain PostgreSQL SQL semantics rather than emulating a complete source-language runtime. Use each dialect’s query/execute form for SQL and explicit PostgreSQL types for non-literal expressions. The plx_strbuild expanded-object helper accelerates repeated string appends on PostgreSQL 18:

CREATE FUNCTION labels(n integer)
RETURNS text
LANGUAGE plxjs
AS $$
  let out: text = "";
  for (let i = 1; i <= n; i++) {
    out += `item-${i},`;
  }
  return out;
$$;

The builder remains correct on PostgreSQL 13-17, but its in-place optimization requires PostgreSQL 18.

Boundaries and Caveats

  • plx implements syntax surfaces, not the source languages’ runtimes: there are no gems, Python modules, JavaScript imports, Go goroutines, PHP classes, Oracle packages, or SQL Server transaction commands.
  • Functions run in PL/pgSQL’s trusted sandbox, with no direct filesystem, network, arbitrary native-code, or transaction-control access.
  • Parameters and return types must be PostgreSQL types. Type inference for locals is limited; explicitly declare types for calls and compound expressions.
  • SQL uses three-valued logic and PostgreSQL numeric/string semantics. Source-language truthiness and string concatenation with + are not reproduced.
  • Locals are hoisted into one PL/pgSQL DECLARE block, so block-local scope and redeclaration with a different type are unavailable.
  • Version 1.3.1 is a code-only safety release: it adds lexer/string-builder capacity guards, stack-depth checks, bounded indentation handling, and fixes for raw-string, PHP interpolation, and non-decimal integer literal parsing. After installing the binary, run ALTER EXTENSION plx UPDATE TO '1.3.1'.
Last updated on