正確に言えば「日本語など非アスキー文字」です。WindowsにPostgreSQLを普通にインストールすると(公式サイトが推奨するEnterpriseDB社のインストーラで)、データベース作成時のデフォルトロケールがJapanese_Japan.932になります。これが、PL/Rで非アスキー文字を使えない、というか変数に非アスキー文字を入れると致命的なエラーになってPostgreSQLサーバが落ちる原因でした。 詳しく言うと、ロケールのうちLC_CTYPEにJapanese_Japan.932でなくCを設定したデータベースなら、嘘みたいに何の問題も起きず。Windows 7 32bit + PostgreSQL 9.3.5 + R 3.1.2 + PL/R 8.3.0.15 で確認しました。てっきり日本語版Windows特有の問題だと思い込み、前のブログでたびたびこの件を書いて今ごろ気付き、すみません m(_)m ↓ 問題が起きるデータベースの場合。Character typeという項目がLC_CTYPEです。 PL/Rを使うデータベースなら ↓ のように、作成時に手動でCharacter typeにCを設定すれば良いです。Character typeを設定するため、Templateにtemplate0を使います(そうしないと変更できない)。文字コードはずっとUTF-8にしており、他の場合は試していません。 PostgreSQLのロケールについてはLet's postgres - ロケール(国際化と地域化)に詳しい解説があります。また下記は、日本語ドキュメントでのロケールと、ロケールを含むデータベース作成時のコマンドオプションの頁。
動作確認
下は簡単な例で、変数に℃という非アスキー文字を入れてメッセージ欄に出力するストアド関数。問題の起きるデータベースでも、関数の定義自体は普通にできます(だから怖い)。ところがSELECT文で実行した途端、PostgreSQLサーバが落ちます。
CREATE OR REPLACE FUNCTION test.input_wide_character()
RETURNS void LANGUAGE plr IMMUTABLE AS
$$
dummy = '℃'
pg.thrownotice(dummy)
$$;
↓ LC_CTYPEをCに設定したデータベースなら問題なく実行でき、今までの苦労が嘘のよう。 というわけで、晴れて自由に日本語入りのPL/Rストアドを作れるようになったので、フォントを自由に設定できるRのパッケージshowtextと、フリーフォントの「花園明朝」を使ってグラフを出力してみました。↓ がストアド関数の定義文で、最後に実行時のSELECT文があります。 事前にRでinstall.packages('showtext')を実行してパッケージを入れておきます。詳細は前ブログの記事を参照。上のストアドでは、使うフォントをR:/に置き、同じ場所にPDFでグラフ出力する設定です。R単体と違ってPostgreSQL上から実行するので、PostgreSQLのユーザがR:/を読み取り・書き込みできるよう、事前に権限を与えておきます。 関数の戻り値がvoidなので実行しても ↓ 何も表示されませんが、指定した場所にPDFが出力されます(二つ目の画像。実物はこちら)。