Postgresql – Problems while building plpgsql_check on Windows

installationpostgresqlvisual studio 2010windows

I try to build plpgsql_check extension by @PavelStehule (Erwin Brandstetter recommended it to me in this answer) on Windows XP 32bit with Visual Studio 2010 (I used this article as a manual). However, I got following errors:

error LNK2001: unresolved external symbol _exec_get_datum_type
error LNK2001: unresolved external symbol _plpgsql_compile
error LNK2001: unresolved external symbol _plpgsql_build_datatype
error LNK2001: unresolved external symbol _plpgsql_stmt_typename
error LNK2001: unresolved external symbol _plpgsql_parser_setup

In addition, there are two IntelliSense errors: expected a ')' in plpgsql.h (lines 923 and 953 – both in datum-related functions) – I expect these to be false alerts (if they are important, how to solve them?).

After some googling I found that someone had a similar problem on OS X. The problem was that plpgsql.so either wasn't linked or didn't work. I have no plpgsql.so on my computer, but I have plpgsql.dll which should correspond to it. So I linked it and the error changed:

error LNK1107: invalid or corrupt file: cannot read at 0x2A8

This dynamic library is part of the PostgreSQL distribution, so it shouldn't be corrupt. However, I'm afraid that what Pavel wrote in the linked discussion applies here:

It needs link against plpgsql.so. I didn't test it against clang – I
remember a talk with Tom Lane, he was surprised so this code works and
probably on some platforms can be unavailable.

Nobody expected so plpgsql will be used from other extensions – and
environment is not prepared for it 🙁

The worst case would be that plpgsql checker extension is simply not available under Windows, because it is too low-mana area for such a mighty magic. 🙂 If I just need a different approach, please point me to it.

Best Answer

You can find Adam Bartoszewicz's instructions here on Google Groups (also published on Pavel Stehule's blog):

  1. Download and install PostgreSQL 9.3.4 for Win32 from http://www.enterprisedb.com
  2. Download and install Microsoft Visual C++ 2010 Express
  3. Lern tutorial http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows
  4. 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.
  5. Create a plpgsql.lib from plpgsql.dll as described in http://adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll
  6. Change plpgsql_check.c file, add PGDLLEXPORT line before evry extension function, as described in http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows
    ...
    PGDLLEXPORT Datum plpgsql_check_function_tb(PG_FUNCTION_ARGS); PGDLLEXPORT Datum plpgsql_check_function(PG_FUNCTION_ARGS);
    ...
    PGDLLEXPORT Datum plpgsql_check_function(PG_FUNCTION_ARGS) { Oid funcoid = PG_GETARG_OID(0);
    ...
    PGDLLEXPORT Datum plpgsql_check_function_tb(PG_FUNCTION_ARGS) { Oid funcoid = PG_GETARG_OID(0);
    ...
  7. Build plpgsql_check.dll
  8. Install plugin
    • copy plpgsql_check.dll to PostgreSQL\9.3\lib
    • copy plpgsql_check.control and plpgsql_check--0.8.sql to PostgreSQL\9.3\share\extension