Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

时间:2024-05-20 19:37:15

前言

之前的博客记录了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插件源码。

Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

1、下载PostgreSQL数据库  https://www.postgresql.org/download/windows/

2、下载安装Microsoft Visual C++ 2010(测试通过2010和2013,只装C++模块即可)

Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

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.controlplpsql_check--0.9.sql PostgreSQL\9.4\share\extension

pg 9.6 以上版本最新的SQL文件。Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

如果高版本的PG安装了低版本的SQL文件,会报错,如下图:

Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

 

安装完成后,输入测试用例。

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。

Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

首先确认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的源码,Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

确实有这个方法,最后排查,是def文件里没有这个方法,原来错误将pg10的dll解析分给了9.4下的lib。

3、源码编译的问题

Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

如果报了一大堆的方法找不到(并非语法错误),有可能是打包环境问题。首先,先确认下include是否都引入了;其次可能是版本,比如x64的lib用vs打32的,或者是反之。总之就是少包。

4、引入unicode外部包。

Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

fatal error C1083: Cannot open include file: 'unicode/ucol.h': No such file or directory

首先"<unicode>"不是pg自带的包,可能是系统包,也可能是其他第三方的包。

需要安装IBM下的ICU包。传送门:Icu4c-62_1

Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

下载ICU4C Binary Download,不要下载源码,因为源码的文件很散,需要引入的文件夹很多。

解压后引入

Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)