Has anyone got plperl to work with Postgres 9.1 on Windows?

I was unable to get plperl to work with Postgres 9.1 on Windows.

The same problem is described here, but there is no solution yet: http://postgresql.1045698.n5.nabble.com/BUG-6204-Using-plperl-functions-generate-crash-td4802111.html

REPRO

Install Perl 5.14 32-bit for Windows from here: http://downloads.activestate.com/ActivePerl/releases/5.14.2.1402/ActivePerl-5.14.2.1402-MSWin32-x86-295342.msi

Add Perl to the System Path Variable Install Postgres 9.1.2 32-bit for Windows from Enterprise DB www.enterprisedb.com/products/pgdownload.do#windows

Now create a test database, add perl to it and try to create a function:

postgres=# create database plperl_test; CREATE DATABASE postgres=# \c plperl_test WARNING: Console code page (437) differs from Windows code page (1252) 8-bit characters might not work correctly. See psql reference page "Notes for Windows users" for details. You are now connected to database "plperl_test" as user "postgres". plperl_test=# create language plperl; CREATE LANGUAGE plperl_test=# create function perl_test() returns void as plperl_test-# $$ plperl_test$# $$ plperl_test-# language plperl; server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Failed. 

Note that this caused the Postgres server process to terminate. Hop!

When I look in the Postgres log file, I find this ...

 2011-12-29 15:51:08 PST STATEMENT: create function perl_test() returns void as $$ $$ language plperl; 2011-12-29 15:51:26 PST LOG: server process (PID 10364) was terminated by exception 0xC0000005 2011-12-29 15:51:26 PST HINT: See C include file "ntstatus.h" for a description of the hexadecimal value. 2011-12-29 15:51:26 PST LOG: terminating any other active server processes 2011-12-29 15:51:26 PST WARNING: terminating connection because of crash of another server process 2011-12-29 15:51:26 PST DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 2011-12-29 15:51:26 PST HINT: In a moment you should be able to reconnect to the database and repeat your command. 2011-12-29 15:51:26 PST LOG: all server processes terminated; reinitializing 2011-12-29 15:51:36 PST FATAL: pre-existing shared memory block is still in use 2011-12-29 15:51:36 PST HINT: Check if there are any old server processes still running, and terminate them. 
+4
source share
3 answers

I was surprised when I did not find good answers from Google. Activstate seems to work for some, but not for others. There were suspicions of conflicts with different versions of the Windows system libraries, but nothing final. However, I was finally able to create a plperl.dll file that works using strawberry perl.

Here are step-by-step instructions to get plperl to work with strawberry perl. The trick is to recompile postgresql and plperl, but install plperl on top of your existing postgresql installation.

first you need the following:

The mingw site is messy. There is no single package to download. You need to download the installer, which downloads everything else. Here is a quick link to it.

http://sourceforge.net/projects/mingw/files/Installer/

In your installer, select C and C ++ and the MSYS environment to install. Mingw will not pollute the environment, so install it in any old location.

As for perl, I don’t think that files (shared libraries) are needed to activate this process, and I found CPAN support for strawberries better (vs activestate proprietary ppm sites) and activate the transfer of douchebag old versions behind a paid line (and forcing other sites to delete their posted copies). F.Yu. ActiveState

Postgresql 9.1 was originally built against perl 5.14, so it is probably best to stick with this version.

Unzip and install it all. Mingw will provide you with a shell (find the shortcut in the start menu) to compile. Launch the shell and do not close it.

follow these steps to install / uninstall packages:

 mingw-get install libminizip mingw-get remove mingw-perl 

you need to remove mingw perl so that perl is used during the build process instead. Instead, you can screw in with a path variable, but this method is simpler

Now you need to go to the directory where you unpacked the unpacked postgresql sources. In the mingw shell, use the / c root path to access the C: drive.

Now just configure and do

 ./configure --with-perl make 

Note that postgres docs say use gmake, but in mingw it does.

The assembly will probably fail when creating the actual plperl.dll file. This is because the build environment does not create the correct command to build the dll. If you get an error message:

 dllwrap -o plperl.dll --dllname plperl.dll --def libplperldll.def plperl.o SPI.o Util.o -L../../../src/port -Wl,--allow-multiple-definition -Wl,--as-needed -LC:/strawberry/perl/lib/CORE -l -L../../../src/backend -lpostgres c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/ld.exe: cannot find -lL../../../src/backend c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/ld.exe: cannot find -lpostgres 

cd in src / pl / plperl and run the following command:

 dllwrap -o plperl.dll --dllname plperl.dll --def libplperldll.def plperl.o SPI.o Util.o -L../../../src/port -Wl,--allow-multiple-definition -Wl,--as-needed -L/c/strawberry/perl/lib/CORE -L../../../src/backend -lpostgres -lperl514 

(note that I have perl installed in c: \ strawberry and mingw installed in c: \ mingw)

This is where we are done. you have the plperl.dll file in this directory, which can replace the one that comes with postgresql.

+2
source

After playing with the new PostgreSQL 9.1.11 (x64) installation, I found ActivePerl 5.14.1 (x64) . The key is to ensure that PostgreSQL can find the required DLL for Perl in its PATH environment.

Run Dependency Walker in plperl.dll inside the postgres lib directory. In the case of PostgreSQL 9.1.11, it has a dependency on perl514.dll - so change your PATH environment to the directory in which it is located (i.e. C: \ perl \ bin). Recheck that the DLL was detected properly by running Dependency Walker again, and then completely stop / start the PostgreSQL service, in which you should be useful.

If you find that plperl.dll has a dependency on another Perl DLL, then you need to use the version of ActivePerl that matches (that is, perl58.dll will match ActivePerl 5.8, perl510.dll will match ActivePerl 5.10 - ensuring that the binary format of Perl and PostgreSQL always matches (32/64 bit)).

0
source

It says here that (ActiveState) requires Perl 5.14 to make it work, I'm not sure about the brand, because I had to use the outdated version of strawberry perl for postgres 9.0, which worked fine. It is important to use the correct version of Perl 5.14 for Postgres 9.1. Try using a binary format (32 vs 64 bit) that matches one of your postgres installations.

-1
source

Source: https://habr.com/ru/post/1388535/


All Articles