跳转到主要内容

plx

Transpile multiple procedural dialects to PL/pgSQL

plx : Transpile multiple procedural dialects to PL/pgSQL

Overview

ID Extension Package Version Category License Language
3140 plx plx 2.0.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 plisql plpgsql_wrap orafce db2fce
Package 2.0.1; SQL version 2.0.0.

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT PIGSTY 2.0.1 18 17 16 15 14 plx -
RPM PIGSTY 2.0.1 18 17 16 15 14 plx_$v -
DEB PIGSTY 2.0.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
Package Version OS ORG SIZE File URL
plx_17 1.3.1 el8.x86_64 pigsty 103.9 KiB plx_17-1.3.1-1PIGSTY.el8.x86_64.rpm
plx_17 1.3.1 el8.aarch64 pigsty 98.4 KiB plx_17-1.3.1-1PIGSTY.el8.aarch64.rpm
plx_17 1.3.1 el9.x86_64 pigsty 110.7 KiB plx_17-1.3.1-1PIGSTY.el9.x86_64.rpm
plx_17 1.3.1 el9.aarch64 pigsty 106.5 KiB plx_17-1.3.1-1PIGSTY.el9.aarch64.rpm
plx_17 1.3.1 el10.x86_64 pigsty 116.1 KiB plx_17-1.3.1-1PIGSTY.el10.x86_64.rpm
plx_17 1.3.1 el10.aarch64 pigsty 109.6 KiB plx_17-1.3.1-1PIGSTY.el10.aarch64.rpm
postgresql-17-plx 1.3.1 d12.x86_64 pigsty 307.7 KiB postgresql-17-plx_1.3.1-1PIGSTY~bookworm_amd64.deb
postgresql-17-plx 1.3.1 d12.aarch64 pigsty 296.2 KiB postgresql-17-plx_1.3.1-1PIGSTY~bookworm_arm64.deb
postgresql-17-plx 1.3.1 d13.x86_64 pigsty 309.7 KiB postgresql-17-plx_1.3.1-1PIGSTY~trixie_amd64.deb
postgresql-17-plx 1.3.1 d13.aarch64 pigsty 296.9 KiB postgresql-17-plx_1.3.1-1PIGSTY~trixie_arm64.deb
postgresql-17-plx 1.3.1 u22.x86_64 pigsty 340.7 KiB postgresql-17-plx_1.3.1-1PIGSTY~jammy_amd64.deb
postgresql-17-plx 1.3.1 u22.aarch64 pigsty 337.8 KiB postgresql-17-plx_1.3.1-1PIGSTY~jammy_arm64.deb
postgresql-17-plx 1.3.1 u24.x86_64 pigsty 321.1 KiB postgresql-17-plx_1.3.1-1PIGSTY~noble_amd64.deb
postgresql-17-plx 1.3.1 u24.aarch64 pigsty 315.0 KiB postgresql-17-plx_1.3.1-1PIGSTY~noble_arm64.deb
postgresql-17-plx 1.3.1 u26.x86_64 pigsty 317.8 KiB postgresql-17-plx_1.3.1-1PIGSTY~resolute_amd64.deb
postgresql-17-plx 1.3.1 u26.aarch64 pigsty 312.8 KiB postgresql-17-plx_1.3.1-1PIGSTY~resolute_arm64.deb
Package Version OS ORG SIZE File URL
plx_16 1.3.1 el8.x86_64 pigsty 103.9 KiB plx_16-1.3.1-1PIGSTY.el8.x86_64.rpm
plx_16 1.3.1 el8.aarch64 pigsty 98.4 KiB plx_16-1.3.1-1PIGSTY.el8.aarch64.rpm
plx_16 1.3.1 el9.x86_64 pigsty 110.7 KiB plx_16-1.3.1-1PIGSTY.el9.x86_64.rpm
plx_16 1.3.1 el9.aarch64 pigsty 106.6 KiB plx_16-1.3.1-1PIGSTY.el9.aarch64.rpm
plx_16 1.3.1 el10.x86_64 pigsty 116.1 KiB plx_16-1.3.1-1PIGSTY.el10.x86_64.rpm
plx_16 1.3.1 el10.aarch64 pigsty 109.6 KiB plx_16-1.3.1-1PIGSTY.el10.aarch64.rpm
postgresql-16-plx 1.3.1 d12.x86_64 pigsty 307.7 KiB postgresql-16-plx_1.3.1-1PIGSTY~bookworm_amd64.deb
postgresql-16-plx 1.3.1 d12.aarch64 pigsty 296.6 KiB postgresql-16-plx_1.3.1-1PIGSTY~bookworm_arm64.deb
postgresql-16-plx 1.3.1 d13.x86_64 pigsty 309.5 KiB postgresql-16-plx_1.3.1-1PIGSTY~trixie_amd64.deb
postgresql-16-plx 1.3.1 d13.aarch64 pigsty 296.9 KiB postgresql-16-plx_1.3.1-1PIGSTY~trixie_arm64.deb
postgresql-16-plx 1.3.1 u22.x86_64 pigsty 339.1 KiB postgresql-16-plx_1.3.1-1PIGSTY~jammy_amd64.deb
postgresql-16-plx 1.3.1 u22.aarch64 pigsty 336.2 KiB postgresql-16-plx_1.3.1-1PIGSTY~jammy_arm64.deb
postgresql-16-plx 1.3.1 u24.x86_64 pigsty 321.1 KiB postgresql-16-plx_1.3.1-1PIGSTY~noble_amd64.deb
postgresql-16-plx 1.3.1 u24.aarch64 pigsty 315.0 KiB postgresql-16-plx_1.3.1-1PIGSTY~noble_arm64.deb
postgresql-16-plx 1.3.1 u26.x86_64 pigsty 317.8 KiB postgresql-16-plx_1.3.1-1PIGSTY~resolute_amd64.deb
postgresql-16-plx 1.3.1 u26.aarch64 pigsty 312.9 KiB postgresql-16-plx_1.3.1-1PIGSTY~resolute_arm64.deb
Package Version OS ORG SIZE File URL
plx_15 1.3.1 el8.x86_64 pigsty 104.2 KiB plx_15-1.3.1-1PIGSTY.el8.x86_64.rpm
plx_15 1.3.1 el8.aarch64 pigsty 98.6 KiB plx_15-1.3.1-1PIGSTY.el8.aarch64.rpm
plx_15 1.3.1 el9.x86_64 pigsty 110.9 KiB plx_15-1.3.1-1PIGSTY.el9.x86_64.rpm
plx_15 1.3.1 el9.aarch64 pigsty 106.6 KiB plx_15-1.3.1-1PIGSTY.el9.aarch64.rpm
plx_15 1.3.1 el10.x86_64 pigsty 116.6 KiB plx_15-1.3.1-1PIGSTY.el10.x86_64.rpm
plx_15 1.3.1 el10.aarch64 pigsty 109.9 KiB plx_15-1.3.1-1PIGSTY.el10.aarch64.rpm
postgresql-15-plx 1.3.1 d12.x86_64 pigsty 308.1 KiB postgresql-15-plx_1.3.1-1PIGSTY~bookworm_amd64.deb
postgresql-15-plx 1.3.1 d12.aarch64 pigsty 296.1 KiB postgresql-15-plx_1.3.1-1PIGSTY~bookworm_arm64.deb
postgresql-15-plx 1.3.1 d13.x86_64 pigsty 309.8 KiB postgresql-15-plx_1.3.1-1PIGSTY~trixie_amd64.deb
postgresql-15-plx 1.3.1 d13.aarch64 pigsty 297.1 KiB postgresql-15-plx_1.3.1-1PIGSTY~trixie_arm64.deb
postgresql-15-plx 1.3.1 u22.x86_64 pigsty 339.4 KiB postgresql-15-plx_1.3.1-1PIGSTY~jammy_amd64.deb
postgresql-15-plx 1.3.1 u22.aarch64 pigsty 336.6 KiB postgresql-15-plx_1.3.1-1PIGSTY~jammy_arm64.deb
postgresql-15-plx 1.3.1 u24.x86_64 pigsty 321.5 KiB postgresql-15-plx_1.3.1-1PIGSTY~noble_amd64.deb
postgresql-15-plx 1.3.1 u24.aarch64 pigsty 315.5 KiB postgresql-15-plx_1.3.1-1PIGSTY~noble_arm64.deb
postgresql-15-plx 1.3.1 u26.x86_64 pigsty 318.4 KiB postgresql-15-plx_1.3.1-1PIGSTY~resolute_amd64.deb
postgresql-15-plx 1.3.1 u26.aarch64 pigsty 313.1 KiB postgresql-15-plx_1.3.1-1PIGSTY~resolute_arm64.deb
Package Version OS ORG SIZE File URL
plx_14 1.3.1 el8.x86_64 pigsty 104.2 KiB plx_14-1.3.1-1PIGSTY.el8.x86_64.rpm
plx_14 1.3.1 el8.aarch64 pigsty 98.6 KiB plx_14-1.3.1-1PIGSTY.el8.aarch64.rpm
plx_14 1.3.1 el9.x86_64 pigsty 110.9 KiB plx_14-1.3.1-1PIGSTY.el9.x86_64.rpm
plx_14 1.3.1 el9.aarch64 pigsty 106.8 KiB plx_14-1.3.1-1PIGSTY.el9.aarch64.rpm
plx_14 1.3.1 el10.x86_64 pigsty 116.5 KiB plx_14-1.3.1-1PIGSTY.el10.x86_64.rpm
plx_14 1.3.1 el10.aarch64 pigsty 109.9 KiB plx_14-1.3.1-1PIGSTY.el10.aarch64.rpm
postgresql-14-plx 1.3.1 d12.x86_64 pigsty 308.2 KiB postgresql-14-plx_1.3.1-1PIGSTY~bookworm_amd64.deb
postgresql-14-plx 1.3.1 d12.aarch64 pigsty 296.3 KiB postgresql-14-plx_1.3.1-1PIGSTY~bookworm_arm64.deb
postgresql-14-plx 1.3.1 d13.x86_64 pigsty 310.0 KiB postgresql-14-plx_1.3.1-1PIGSTY~trixie_amd64.deb
postgresql-14-plx 1.3.1 d13.aarch64 pigsty 297.6 KiB postgresql-14-plx_1.3.1-1PIGSTY~trixie_arm64.deb
postgresql-14-plx 1.3.1 u22.x86_64 pigsty 339.4 KiB postgresql-14-plx_1.3.1-1PIGSTY~jammy_amd64.deb
postgresql-14-plx 1.3.1 u22.aarch64 pigsty 336.5 KiB postgresql-14-plx_1.3.1-1PIGSTY~jammy_arm64.deb
postgresql-14-plx 1.3.1 u24.x86_64 pigsty 321.4 KiB postgresql-14-plx_1.3.1-1PIGSTY~noble_amd64.deb
postgresql-14-plx 1.3.1 u24.aarch64 pigsty 315.4 KiB postgresql-14-plx_1.3.1-1PIGSTY~noble_arm64.deb
postgresql-14-plx 1.3.1 u26.x86_64 pigsty 318.4 KiB postgresql-14-plx_1.3.1-1PIGSTY~resolute_amd64.deb
postgresql-14-plx 1.3.1 u26.aarch64 pigsty 313.1 KiB postgresql-14-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.
  • Distribution 2.0.1 installs extension version 2.0.0; 2.0.1 changes PGXN packaging only and has no SQL upgrade of its own. Version 2.0.0 changes interpolation in plxruby, plxphp, plxjs, plxts, plxpython3, and plxgo: a NULL operand now makes the whole interpolated string NULL instead of silently becoming an empty string. Run ALTER EXTENSION plx UPDATE TO '2.0.0', then redeploy affected functions because existing generated PL/pgSQL in pg_proc.prosrc is not rewritten by the extension update.