plpgsql_check
对 plpgsql 函数进行扩展检查
仓库
okbob/plpgsql_check
https://github.com/okbob/plpgsql_check
源码
plpgsql_check-2.8.11.tar.gz
plpgsql_check-2.8.11.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
plpgsql_check | 2.8.11 | 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 | PGDG | 2.8.11 | 1817161514 | plpgsql_check | plpgsql |
| RPM | PGDG | 2.8.10 | 1817161514 | plpgsql_check_$v | - |
| DEB | PGDG | 2.8.11 | 1817161514 | postgresql-$v-plpgsql-check | - |
安装
您可以直接安装 plpgsql_check 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:
pig repo add pgdg -u # 添加 PGDG 仓库并更新缓存
使用 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
用法
plpgsql_check 是 PL/pgSQL 函数的代码检查和分析工具,能够在开发阶段而非运行时检测错误。
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('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, -- SQL 注入检查
compatibility_warnings := true -- 过时的模式
);
批量检查所有函数
SELECT p.oid, p.proname, plpgsql_check_function(p.oid)
FROM pg_catalog.pg_namespace n
JOIN pg_catalog.pg_proc p ON pronamespace = n.oid
JOIN pg_catalog.pg_language l ON p.prolang = l.oid
WHERE l.lanname = 'plpgsql' AND p.prorettype <> 2279;
被动模式(执行时检查)
LOAD 'plpgsql_check';
SET plpgsql_check.mode = 'every_start'; -- 每次执行前检查
或在 postgresql.conf 中配置:
shared_preload_libraries = 'plpgsql,plpgsql_check'
plpgsql_check.mode = 'every_start'
性能分析器
-- 启用性能分析
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();
依赖追踪
SELECT * FROM plpgsql_show_dependency_tb('my_function(int)');
覆盖率指标
SELECT * FROM plpgsql_coverage_statements('my_function()');
SELECT * FROM plpgsql_coverage_branches('my_function()');
Pragma 指令
在函数注释中嵌入检查选项:
CREATE OR REPLACE FUNCTION fx(anyelement) RETURNS text AS $$
BEGIN
/* @plpgsql_check_options: anyelementtype = text */
RETURN $1;
END;
$$ LANGUAGE plpgsql;