plx

将多种过程语言方言转译为 PL/pgSQL

概览

扩展包名版本分类许可证语言
plx1.3.1LANGMITC
ID扩展名BinLibLoadCreateTrustReloc模式
3140plx-
相关扩展plpgsql plv8 pllua pljava plperl plpython3u plprql plsh

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

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.3.11817161514plx-
RPMPIGSTY1.3.11817161514plx_$v-
DEBPIGSTY1.3.11817161514postgresql-$v-plx-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 plx 扩展的 RPM / DEB 包:

pig build pkg plx         # 构建 RPM / DEB 包

安装

您可以直接安装 plx 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install plx;          # 当前活跃 PG 版本安装
pig ext install -y plx -v 18  # PG 18
pig ext install -y plx -v 17  # PG 17
pig ext install -y plx -v 16  # PG 16
pig ext install -y plx -v 15  # PG 15
pig ext install -y plx -v 14  # PG 14
dnf install -y plx_18       # PG 18
dnf install -y plx_17       # PG 17
dnf install -y plx_16       # PG 16
dnf install -y plx_15       # PG 15
dnf install -y plx_14       # PG 14
apt install -y postgresql-18-plx   # PG 18
apt install -y postgresql-17-plx   # PG 17
apt install -y postgresql-16-plx   # PG 16
apt install -y postgresql-15-plx   # PG 15
apt install -y postgresql-14-plx   # PG 14

创建扩展

CREATE EXTENSION plx;

用法

来源:

plx 提供了熟悉的程序语言方言,当 CREATE FUNCTION 执行时会编译为普通的 PL/pgSQL。PostgreSQL 存储并执行生成的 PL/pgSQL,使用其内置的信任处理程序;无需加载 Ruby、PHP、JavaScript、Python、Go、COBOL、Oracle 或 SQL Server 运行时到后端。

CREATE EXTENSION plx;

可用方言

语言表面语法
plxrubyRuby
plxphpPHP
plxjsJavaScript
plxtsTypeScript 注解在 JavaScript 方言之上
plxpython3Python 3
plxgoGo
plxcobolISO COBOL
plxplsqlOracle PL/SQL
plxtsqlTransact-SQL

所有方言都针对相同的 PL/pgSQL 语句表面,包括赋值、条件判断、循环、查询迭代、动态 SQL、游标、异常处理、触发器和集合返回函数。

创建一个函数

LANGUAGE 子句中选择一种方言,并保持函数签名使用 PostgreSQL 类型:

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);

翻译只会在创建函数时发生一次。存储在 pg_proc.prosrc 中的可执行体是普通的 PL/pgSQL,因此可以导出、审查和运行而无需单独的解释器。

检查和调试生成代码

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

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

运行时错误行号指向生成的 PL/pgSQL。使用 plx_source() 获取原始嵌入方言体;在与源码相关联时,将其与 pg_get_functiondef() 一起使用。

SQL 和字符串构建

表达式保留 PostgreSQL 的 SQL 语义,而不是模拟完整的源语言运行时环境。对于 SQL 使用每个方言的查询/执行形式,并且非字面量表达式使用显式的 PostgreSQL 类型。plx_strbuild 扩展对象辅助函数在 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;
$$;

该构建器在 PostgreSQL 13-17 中仍然正确,但其就地优化需要 PostgreSQL 18。

边界和注意事项

  • plx 实现的是语法表面,而不是源语言的运行时环境:没有 gems、Python 模块、JavaScript 导入、Go 协程、PHP 类或 SQL Server 事务命令。
  • 函数在 PL/pgSQL 的信任沙箱中运行,没有任何直接文件系统访问、网络访问、任意本地代码访问或事务控制权限。
  • 参数和返回类型必须是 PostgreSQL 类型。局部变量的类型推断有限;对于调用和复合表达式需要显式声明类型。
  • SQL 使用三值逻辑和 PostgreSQL 的数值/字符串语义。源语言中的真假性和使用 + 进行字符串连接没有被复制。
  • 局部变量被提升到一个 PL/pgSQL 的 DECLARE 块中,因此块局部作用域和具有不同类型的重新声明不可用。
  • 版本 1.3.1 是一个仅包含代码的安全发布:它增加了词法分析/字符串构建容量保护、堆栈深度检查、有限缩进处理以及对原始字符串、PHP 插值和非十进制整数字面量解析的修复。安装二进制文件后,请运行 ALTER EXTENSION plx UPDATE TO '1.3.1'