PostgreSQL7.4.13以前の信じられないバグ
残念なバグに遭遇した。
本番機で障害が出て、Javaのコードを調べた。そのコード自体、凝集度が低いもので、非常に解析に苦労したが、どうも問題の事象は起こしそうにない。
しかも、同じデータをDBダンプして、試験機にインポートしても、再現しないという。
再現しないことには、デバッガの動かしようがないので、仕方なくログ出力を余分に盛り込んだ版を本番機に入れてもらって問題を再現させ、やっと原因がわかった。次のSQL文がそれだ。(イメージ)
SELECT name FROM exile WHERE name='MAKIDAI'; name ----- MAKIDAI SELECT name FROM exile WHERE name='MATSU'; name ----- MATSU SELECT name FROM exile WHERE name IN ('MAKIDAI', 'MATSU'); name ----- MATSU
3つめのSQLで、なぜかMAKIDAIが取得できていない!
調べたところ、PostgreSQL7.4.13のChangeLogに、以下の記述があった。
Fix bug that sometimes caused OR'd index scans to miss rows they should have returned
まさか。コミットログを調べる。
Fix nasty bug in nodeIndexscan.c's detection of duplicate tuples during a multiple (OR'ed) indexscan.
[...]
If one of these tuples is fetched by an earlier OR'ed indexscan and the other by a later indexscan, nodeIndexscan.c would incorrectly ignore the second tuple.
git.postgresql.org Git
これは非常に怪しい。さらに調べるとこんな記述があった。
http://archives.postgresql.org/pgsql-general/2006-05/msg00756.php
DB、いいかげんバージョンアップしようぜ