plpgsql_check
对 plpgsql 函数进行扩展检查
仓库
okbob/plpgsql_check
https://github.com/okbob/plpgsql_check
源码
plpgsql_check-2.9.1.tar.gz
plpgsql_check-2.9.1.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
plpgsql_check | 2.9.1 | LANG | MIT | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 3060 | plpgsql_check | 否 | 是 | 是 | 是 | 否 | 否 | - |
| 相关扩展 | plpgsql pldbgapi plprofiler pg_hint_plan pgtap auto_explain plv8 plperl plpython3u |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 2.9.1 | 1817161514 | plpgsql_check | plpgsql |
| RPM | PIGSTY | 2.9.1 | 1817161514 | plpgsql_check_$v | - |
| DEB | PGDG | 2.9.1 | 1817161514 | postgresql-$v-plpgsql-check | - |
构建
您可以使用 pig build 命令构建 plpgsql_check 扩展的 RPM 包:
pig build pkg plpgsql_check # 构建 RPM 包
安装
您可以直接安装 plpgsql_check 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
pig repo add pgsql -u # 添加仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install plpgsql_check; # 当前活跃 PG 版本安装
pig ext install -y plpgsql_check -v 18 # PG 18
pig ext install -y plpgsql_check -v 17 # PG 17
pig ext install -y plpgsql_check -v 16 # PG 16
pig ext install -y plpgsql_check -v 15 # PG 15
pig ext install -y plpgsql_check -v 14 # PG 14
dnf install -y plpgsql_check_18 # PG 18
dnf install -y plpgsql_check_17 # PG 17
dnf install -y plpgsql_check_16 # PG 16
dnf install -y plpgsql_check_15 # PG 15
dnf install -y plpgsql_check_14 # PG 14
apt install -y postgresql-18-plpgsql-check # PG 18
apt install -y postgresql-17-plpgsql-check # PG 17
apt install -y postgresql-16-plpgsql-check # PG 16
apt install -y postgresql-15-plpgsql-check # PG 15
apt install -y postgresql-14-plpgsql-check # PG 14
预加载配置:
shared_preload_libraries = 'plpgsql_check';
创建扩展:
CREATE EXTENSION plpgsql_check CASCADE; -- 依赖: plpgsql
用法
来源:official README、v2.9.1 release notes、local package metadata。
plpgsql_check 是面向 PL/pgSQL 的检查器、linter、性能分析器、跟踪器和覆盖率工具。它可以在开发阶段发现许多错误,而不是等到运行时才失败。
CREATE EXTENSION plpgsql_check;
检查函数
SELECT * FROM plpgsql_check_function('my_function()');
SELECT * FROM plpgsql_check_function('my_function(int, text)');
SELECT * FROM plpgsql_check_function('my_function()', fatal_errors := false);
返回表的变体适合生成结构化报告:
SELECT *
FROM plpgsql_check_function_tb('my_function()');
输出格式
SELECT * FROM plpgsql_check_function('fx()', format := 'text');
SELECT * FROM plpgsql_check_function('fx()', format := 'json');
SELECT * FROM plpgsql_check_function('fx()', format := 'xml');
检查触发器函数
SELECT * FROM plpgsql_check_function('my_trigger_func()', 'my_table');
SELECT * FROM plpgsql_check_function(
'my_trigger_func()',
'my_table',
newtable := 'newtab',
oldtable := 'oldtab'
);
警告类别
SELECT * FROM plpgsql_check_function(
'fx()',
extra_warnings := true,
performance_warnings := true,
security_warnings := true,
compatibility_warnings := true
);
extra_warnings覆盖缺少返回、死代码、未使用参数等问题。performance_warnings覆盖性能相关检查。security_warnings包括 SQL 注入风险等检查。compatibility_warnings报告过时或对版本敏感的 PL/pgSQL 模式。
批量检查所有函数
SELECT p.oid, p.proname, plpgsql_check_function(p.oid)
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p ON p.pronamespace = n.oid
JOIN pg_catalog.pg_language l ON p.prolang = l.oid
WHERE l.lanname = 'plpgsql'
AND p.prorettype <> 'pg_catalog.trigger'::pg_catalog.regtype;
被动模式
被动模式会在函数启动时检查函数。它适合开发或预生产环境,因为会带来额外开销。
LOAD 'plpgsql_check';
SET plpgsql_check.mode = 'every_start';
常用设置:
plpgsql_check.mode = [ disabled | by_function | fresh_start | every_start ]
plpgsql_check.fatal_errors = [ yes | no ]
plpgsql_check.show_nonperformance_warnings = false
plpgsql_check.show_performance_warnings = false
性能分析器
SELECT plpgsql_check_profiler(true);
SELECT my_function();
SELECT lineno, avg_time, source
FROM plpgsql_profiler_function_tb('my_function()');
SELECT stmtid, parent_stmtid, lineno, exec_stmts, stmtname
FROM plpgsql_profiler_function_statements_tb('my_function()');
SELECT * FROM plpgsql_profiler_functions_all();
SELECT plpgsql_profiler_reset_all();
若要使用共享性能分析统计,请在 plpgsql_check 之前预加载 plpgsql:
shared_preload_libraries = 'plpgsql,plpgsql_check'
没有共享预加载时,性能分析数据仅限于当前活动会话。
跟踪器
跟踪会为函数和语句的进入/退出发出 notice,并可能暴露变量值。它默认关闭,只应通过超级用户控制的设置启用。
SET plpgsql_check.enable_tracer = on;
SELECT plpgsql_check_tracer(true);
SET plpgsql_check.tracer_verbosity = terse;
依赖追踪
SELECT *
FROM plpgsql_show_dependency_tb('my_function(int)');
覆盖率指标
SELECT * FROM plpgsql_coverage_statements('my_function()');
SELECT * FROM plpgsql_coverage_branches('my_function()');
Pragma 指令
在函数内部使用 pragma 调用,告诉 plpgsql_check 动态 SQL、临时表、推断出的 record 类型,或局部检查设置:
CREATE OR REPLACE FUNCTION fx(anyelement) RETURNS text AS $$
BEGIN
PERFORM plpgsql_check_pragma('type: r (id int, processed bool)');
RETURN $1::text;
END;
$$ LANGUAGE plpgsql;
注意事项
- Pigsty 将
plpgsql_check2.9.1 作为 PostgreSQL 14-18 的 RPM 打包;DEB 包来自 PGDG。 - 该扩展要求
plpgsql。主动检查不强制要求预加载,但共享性能分析存储以及跟踪器/性能分析器的可靠早期初始化需要预加载。 - v2.9.1 修复了被跟踪 inline block 失败时可能发生的崩溃;这个补丁发布没有记录新的面向用户 SQL API。
- 跟踪器可能暴露函数参数或变量值。对 security-definer 函数或敏感数据使用时要格外谨慎。