預設情況下,如何將“utf8”載入到 plperl 中?
我正在嘗試解決此處另一個問題中解釋的問題。在帶有 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;'
並且成功載入了
utf8
和re
模組,如下所示:警告: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
.這使它可以使用系統上的所有模組。