Re: [GENERAL] pl/perl and recent perl versions - failing to load internal modules
On Mon, Jun 30, 2014 at 7:47 PM, Toby Corkindale toby.corkind...@strategicdata.com.au wrote: Hi, I've been trying out PostgreSQL 9.3 with pl/perl built against Ubuntu 14.04 LTS' Perl 5.18 (Sourced from apt.postgresql.org) Maybe I'm doing something wrong, but it appears that plperl has become completely useless, as it can't load any new modules, but modern Perl versions have refactored the language into lots of small modules that are automatically loaded as required. Except they can't be loaded as required. For instance, a fairly simple regex will try to load the modules: utf8, utf8_heavy re Since it is forbidden from loading anything, it will fail. pl/perl should be preloading those modules via my $a=chr(0x100); return $a =~ /\\xa9/i. Do you have some example pl/perl code that is broke? It seems to work for me (I only have 5.20 installed, on this machine, but I've used 5.18 on 9.2 and 9.3): $ perl -v This is perl 5, version 20, subversion 0 (v5.20.0) built for x86_64-linux-thread-multi ... $ psql ... baroque= select version(); version ─ PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.9.0 20140604 (prerelease), 64-bit (1 row) Time: 1.033 ms baroque= do $$my $a=chr(0x100); return $a =~ /\\xa9/i$$ language plperl; DO Time: 1.161 ms -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general
Re: [GENERAL] pl/perl and recent perl versions - failing to load internal modules
Hi Alex, = do $$ \N{U+263A} =~ /[[:punct:]]/ $$ language plperl; ERROR: Unable to load utf8.pm into plperl at line 1. BEGIN failed--compilation aborted. CONTEXT: PL/Perl anonymous code block - Original Message - From: Alex Hunsaker bada...@gmail.com To: Toby Corkindale toby.corkind...@strategicdata.com.au Cc: pgsql-general pgsql-general@postgresql.org Sent: Wednesday, 2 July, 2014 9:28:52 AM Subject: Re: [GENERAL] pl/perl and recent perl versions - failing to load internal modules On Mon, Jun 30, 2014 at 7:47 PM, Toby Corkindale toby.corkind...@strategicdata.com.au wrote: Hi, I've been trying out PostgreSQL 9.3 with pl/perl built against Ubuntu 14.04 LTS' Perl 5.18 (Sourced from apt.postgresql.org) Maybe I'm doing something wrong, but it appears that plperl has become completely useless, as it can't load any new modules, but modern Perl versions have refactored the language into lots of small modules that are automatically loaded as required. Except they can't be loaded as required. For instance, a fairly simple regex will try to load the modules: utf8, utf8_heavy re Since it is forbidden from loading anything, it will fail. pl/perl should be preloading those modules via my $a=chr(0x100); return $a =~ /\\xa9/i. Do you have some example pl/perl code that is broke? It seems to work for me (I only have 5.20 installed, on this machine, but I've used 5.18 on 9.2 and 9.3): $ perl -v This is perl 5, version 20, subversion 0 (v5.20.0) built for x86_64-linux-thread-multi ... $ psql ... baroque= select version(); version ─ PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.9.0 20140604 (prerelease), 64-bit (1 row) Time: 1.033 ms baroque= do $$my $a=chr(0x100); return $a =~ /\\xa9/i$$ language plperl; DO Time: 1.161 ms -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general
Re: [GENERAL] pl/perl and recent perl versions - failing to load internal modules
Hi Alex, your example (chr(0x100) =~ /\\xa9/) works on my instance (pg 9.3.4, plperl 5.18) However the following code fails: = do $$ \N{U+263A} =~ /[[:punct:]]/$$ language plperl; ERROR: Unable to load utf8.pm into plperl at line 1. BEGIN failed--compilation aborted. CONTEXT: PL/Perl anonymous code block Oddly, even if I add utf8 to plperl.oninit, I then get an error about being unable to load the 're' (regex) module. I don't understand how the example you gave does manage to work! - Original Message - From: Alex Hunsaker bada...@gmail.com To: Toby Corkindale toby.corkind...@strategicdata.com.au Cc: pgsql-general pgsql-general@postgresql.org Sent: Wednesday, 2 July, 2014 9:28:52 AM Subject: Re: [GENERAL] pl/perl and recent perl versions - failing to load internal modules On Mon, Jun 30, 2014 at 7:47 PM, Toby Corkindale toby.corkind...@strategicdata.com.au wrote: Hi, I've been trying out PostgreSQL 9.3 with pl/perl built against Ubuntu 14.04 LTS' Perl 5.18 (Sourced from apt.postgresql.org) Maybe I'm doing something wrong, but it appears that plperl has become completely useless, as it can't load any new modules, but modern Perl versions have refactored the language into lots of small modules that are automatically loaded as required. Except they can't be loaded as required. For instance, a fairly simple regex will try to load the modules: utf8, utf8_heavy re Since it is forbidden from loading anything, it will fail. pl/perl should be preloading those modules via my $a=chr(0x100); return $a =~ /\\xa9/i. Do you have some example pl/perl code that is broke? It seems to work for me (I only have 5.20 installed, on this machine, but I've used 5.18 on 9.2 and 9.3): $ perl -v This is perl 5, version 20, subversion 0 (v5.20.0) built for x86_64-linux-thread-multi ... $ psql ... baroque= select version(); version ─ PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.9.0 20140604 (prerelease), 64-bit (1 row) Time: 1.033 ms baroque= do $$my $a=chr(0x100); return $a =~ /\\xa9/i$$ language plperl; DO Time: 1.161 ms -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general
Re: [GENERAL] pl/perl and recent perl versions - failing to load internal modules
On Tue, Jul 1, 2014 at 6:39 PM, Toby Corkindale toby.corkind...@strategicdata.com.au wrote: Hi Alex, your example (chr(0x100) =~ /\\xa9/) works on my instance (pg 9.3.4, plperl 5.18) However the following code fails: = do $$ \N{U+263A} =~ /[[:punct:]]/$$ language plperl; ERROR: Unable to load utf8.pm into plperl at line 1. BEGIN failed--compilation aborted. CONTEXT: PL/Perl anonymous code block Oddly, even if I add utf8 to plperl.oninit, I then get an error about being unable to load the 're' (regex) module. I don't understand how the example you gave does manage to work! Strange, seems to works for me with 5.20: = do $$ \N{U+263A} =~ /[[:punct:]]/$$ language plperl; DO Time: 12.928 ms = show plperl.on_init; plperl.on_init (1 row) Time: 0.786 ms = show plperl.on_plperl_init; plperl.on_plperl_init ─── (1 row) One thing you might try is plperl.on_plperl_init = require 'utf8_heavy.pl'; require unicore/Heavy.pl'; or maybe just plperl.on_plperl_init = 'use Unicode::UCD;' If that still fails, You might find the attached useful, it tires to preload all the unicore files. You should be able to stick it somewhere and plperl.on_plperl_init = '/path/to/unicore_preload.pm'. However, hopefully one of the first suggestions will work.. unicore_preload.pm.gz Description: GNU Zip compressed data -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general
Re: [GENERAL] pl/perl and recent perl versions - failing to load internal modules
On Tue, Jul 1, 2014 at 7:31 PM, Alex Hunsaker bada...@gmail.com wrote: On Tue, Jul 1, 2014 at 6:39 PM, Toby Corkindale toby.corkind...@strategicdata.com.au wrote: Hi Alex, However the following code fails: = do $$ \N{U+263A} =~ /[[:punct:]]/$$ language plperl; ERROR: Unable to load utf8.pm into plperl at line 1. BEGIN failed--compilation aborted. CONTEXT: PL/Perl anonymous code block One thing you might try is plperl.on_plperl_init = require 'utf8_heavy.pl'; require unicore/Heavy.pl'; or maybe just plperl.on_plperl_init = 'use Unicode::UCD;' If you are up to recompiling postgres, you might try this patch. Its untested, but the basic idea is to always allow require 'utf8.pm' to work in plperl. Near as I can tell utf8.pm is a strange package, when we look to see if we already have it loaded it, we can't find it for example. Which would explain why plperl.on_init = ' use utf8;' does not work for you. I don't have the time to dig through a bunch of perl versions to find out whats going on with utf8.pm. I suspect this will make it fail on loading a different module (my gut says utf8 is going to want to load unicore stuff once its loaded) but it would be interesting to see nonetheless. diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 2f7a12f..62cf116 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -881,6 +881,17 @@ pp_require_safe(pTHX) if (svp *svp != PL_sv_undef) RETPUSHYES; + /* + * whitelist utf8.pm, perl 5.18 and maybe others needs to try and load this + * probably for unicode/unicore stuff + */ + if (strncmp(utf8.pm, name, len) == 0) { + PUSHMARK(SP); + PUSHs(sv); + PUTBACK; + return pp_require_orig(aTHX); + } + DIE(aTHX_ Unable to load %s into plperl, name); /* -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general