[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 メーリングリストの案内