[pgpool-general-jp: 950] standard_conforming_strings設定のlibpqへの伝播

Tietew tietew @ tietew.net
2011年 6月 28日 (火) 16:45:37 JST


初めまして

Ruby on Railsというフレームワークと組み合わせて使用しています。
直接接続では問題ないのに、pgpool-II経由で接続すると、BYTEA型のデータが壊
れてしまうので原因を調べていました。

詳細は後述しますが、原因としてはlibpqがParameterStatusメッセージをアテに
してエスケープ処理を切り替える場合があるのに、pgpoolがParameterStatusメッ
セージを捨ててしまう、ということです。

今のところ最後に書いたワークアラウンドで解決しているのですが、pgpoolでの
解決は難しいでしょうか。

今のところ、libpqが記憶していそうな設定は standard_conforming_strings と 
client_encoding だと思います。


詳細は以下:

◆前提
postgresql.conf:
standard_conforming_strings = off

◆接続時
ライブラリが以下のSQLを発行(ハードコードされてる)
SET standard_conforming_strings = on;

直接接続の場合、ParameterStatusメッセージが応答される。おそらくlibpqがこ
の設定を記憶している。
pgpool経由の場合、pgpoolがこのメッセージを捨ててしまう。

◆エスケープ
libpqのPQescapeByteaConnを使ってエスケープする

直接接続の場合、standard_conforming_strings = on を記憶しているので、
'\xHHHHHH' という文字列を返す。
pgpool経由の場合、standard_conforming_strings = off だと思っているので、
'\\xHHHHHH' という文字列を返す。

◆クエリ
直接接続の場合、
UPDATE foo SET data = '\xHHHHHH' ...;

pgpool経由の場合、
UPDATE foo SET data = '\\xHHHHHH' ...;

いずれにしてもバックエンドは standard_conforming_strings = on なので、そ
のように解釈する。すなわち、pgpool経由の場合、`\xHHHHHH' というバイナリ
データと保存してしまうので、データが壊れる。

◆ワークアラウンド
ALTER DATABASE dbname SET standard_conforming_strings TO on; でデフォル
ト値を設定したら直ったように見えるので、観察中。



-- 
Tietew <tietew @ tietew.net>
Blog: http://www.tietew.jp/
PGP: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA



pgpool-general-jp メーリングリストの案内