Postgresql

預設情況下,如何將“utf8”載入到 plperl 中?

  • January 19, 2018

我正在嘗試解決此處另一個問題中解釋的問題。在帶有 Postgres 9.1.12 的 Debian 7.4 上,我可以qr很好地使用 Perl 運算符。但是,在帶有 Postgres 9.2.4 的 Solaris 5.11 上,我做不到。

如上述問題所述,以下儲存過程在 Solaris 安裝中失敗:

REATE FUNCTION foo(VARCHAR) RETURNS VARCHAR AS $$
   my ( $re ) = @_;
   $re = ''.qr/\b($re)\b/i;
   return $re;
$$ LANGUAGE plperl;

出現以下錯誤:

ERROR:  Unable to load utf8.pm into plperl at line 3.
BEGIN failed--compilation aborted.
CONTEXT:  PL/Perl function "foo"

很明顯,在 Postgres 的 Debian 安裝中,‘utf8’ 已經預設載入。我在兩個系統上執行了以下儲存過程:

CREATE FUNCTION perl_modules() RETURNS VOID AS $$
   warn join(', ',sort keys %INC);
$$ LANGUAGE plperl;

在 Debian 系統上:

警告:Carp.pm、Carp/Heavy.pm、Exporter.pm、feature.pm、overload.pm、strict.pm、unicore/Heavy.pl、unicore/To/Fold.pl、utf8.pm、utf8_heavy.pl、 vars.pm、warnings.pm、warnings/register.pm 在第 2 行。

在 Solaris 系統上:

警告:Carp.pm、Carp/Heavy.pm、Exporter.pm、feature.pm、overload.pm、overloading.pm、strict.pm、vars.pm、warnings.pm、warnings/register.pm 在第 2 行。

我嘗試utf8通過將其添加到 postgres 配置文件中來在 Solaris 系統上傳入模組:

plperl.on_init = 'use utf8; use re;'

並且成功載入了utf8re模組,如下所示:

警告:Carp.pm、Carp/Heavy.pm、Exporter.pm、XSLoader.pm、feature.pm、overload.pm、overloading.pm、re.pm、strict.pm、utf8.pm、vars.pm、警告。 pm,warnings/register.pm 在第 2 行。

但是foo()儲存過程仍然失敗:

dc=# select foo('foo');
ERROR:  Attempt to reload utf8_heavy.pl aborted.
Compilation failed in require at /opt/perl-5.18.0/lib/utf8.pm line 17.
CONTEXT:  PL/Perl function "foo"

在此 Solaris 環境中成功載入utf8及其依賴項的秘訣是什麼?

我發現的解決方案utf8在設置中模仿模組的 AUTOLOAD 功能plperl.on_init

plperl.on_init = 'use utf8; use re; package utf8; require "utf8_heavy.pl";'

utf8_heavy.pl在進入 Postgres 執行 perl 腳本的安全模式之前,這會成功載入和初始化文件。

另一種方法是使用plperlu.

這使它可以使用系統上的所有模組。

引用自:https://dba.stackexchange.com/questions/65268