前言
之前的博客记录了Linux CentOS 7 PostgreSQL 10 安装plpgsql_check扩展(源码编译),本文记录 win10 64位 下安装 PostgreSQL 扩展插件plpgsql_check,支持PG9.2以上版本,目前测试通过9.4,9.6,10。
下载
打开网址:https://pgxn.org/dist/plpgsql_check/0.9.3/,点击图标下载plpgsql_check插件源码。
1、下载PostgreSQL数据库 https://www.postgresql.org/download/windows/
2、下载安装Microsoft Visual C++ 2010(测试通过2010和2013,只装C++模块即可)
3、将lib目录下的plpgsql.dll文件生成plpgsql.lib文件。传送门:如何由ddl文件生成lib文件
The plpgsql_check depends on plpgsql and we need to add plpgsql.lib
to the library list. Unfortunately PostgreSQL 9.4.3 does not contain this library.
4、源码编译plpgsql_check。(生成plpgsql_check.dll 文件) 传送门:待续...
5、拷贝 plpgsql_check.dll 到 PostgreSQL\9.4\lib。 (9.4替换成自己的版本)
6、源码文件夹下,拷贝plpgsql_check.control和plpsql_check--0.9.sql到
PostgreSQL\9.4\share\extension
pg 9.6 以上版本最新的SQL文件。
如果高版本的PG安装了低版本的SQL文件,会报错,如下图:
安装完成后,输入测试用例。
postgres=# load 'plpgsql';
LOAD
postgres=# CREATE EXTENSION plpgsql_check;
CREATE EXTENSION
postgres=# CREATE TABLE t1(a int, b int);
CREATE TABLE
postgres=# CREATE OR REPLACE FUNCTION public.f1()
postgres-# RETURNS void
postgres-# LANGUAGE plpgsql
postgres-# AS $function$
postgres$# DECLARE r record;
postgres$# BEGIN
postgres$# FOR r IN SELECT * FROM t1
postgres$# LOOP
postgres$# RAISE NOTICE '%', r.c; -- there is bug - table t1 missing "c" column
postgres$# END LOOP;
postgres$# END;
postgres$# $function$;
CREATE FUNCTION
postgres=# select f1(); -- execution doesn't find a bug due to empty table t1
f1
----
(1 行记录)
postgres=# \x
扩展显示已打开。
postgres=# select * from plpgsql_check_function_tb('f1()');
-[ RECORD 1 ]---------------------
functionid | f1
lineno | 6
statement | RAISE
sqlstate | 42703
message | 记录"r"没有字段"c"
detail |
hint |
level | error
position |
query |
context | SQL 语句 "SELECT r.c"
postgres=# \sf+ f1
CREATE OR REPLACE FUNCTION public.f1()
RETURNS void
LANGUAGE plpgsql
1 AS $function$
2 DECLARE r record;
3 BEGIN
4 FOR r IN SELECT * FROM t1
5 LOOP
6 RAISE NOTICE '%', r.c; -- there is bug - table t1 missing "c" column
7 END LOOP;
8 END;
9 $function$
postgres=#
OK,测试成功。
总结
1、psql中,创建plpgsql_check扩展时,无法加载plpgsql_check.dll。
首先确认lib下是否有该文件;如果有文件,还是无法加载,那就是生成的版本问题。
/machine参数后面可以设置x86、x64,亲测,版本不对,加载绝对有问题。
2、生成plpgsql.lib的问题。(不同的pg版本,plpgsql方法是不同)
我机器装了9.4和10,在dll生成lib时候,错误的将pg10的plpgsql.dll生成lib后,放入了9.4的lib下面。
然后源码编译plpgsql_check时,会报exec_get_datum_type找不到。打开9.4的源码,
确实有这个方法,最后排查,是def文件里没有这个方法,原来错误将pg10的dll解析分给了9.4下的lib。
3、源码编译的问题
如果报了一大堆的方法找不到(并非语法错误),有可能是打包环境问题。首先,先确认下include是否都引入了;其次可能是版本,比如x64的lib用vs打32的,或者是反之。总之就是少包。
4、引入unicode外部包。
fatal error C1083: Cannot open include file: 'unicode/ucol.h': No such file or directory
首先"<unicode>"不是pg自带的包,可能是系统包,也可能是其他第三方的包。
需要安装IBM下的ICU包。传送门:Icu4c-62_1
下载ICU4C Binary Download,不要下载源码,因为源码的文件很散,需要引入的文件夹很多。
解压后引入