HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

外部結合とある条件を満たす副照会の合わせ技で発現するバグ

対象バージョンが「DB2 for LUW V9.1 FP(Fix Pack)7/FP7a/FP8, V9.5 FP4/FP4a, V9.7 GA」ということで、手元にあるバージョン

  • DB2 Express-C 9.1.2 (対象外)
  • DB2 Express-C 9.5.2 (対象外)
  • DB2 Express-C 9.7.0 (対象バージョン)

で確認してみた。(すべてWindows Vista上で稼動)
最初に実行するクエリーは上記サイトに載っている例。

create table T1(C1 int not null primary key, C2 int);
create table T2(C1 int);
insert into T1 values (1, 1);
select T1.* from T1 left join T2 on T1.C2=T2.C1
 where T1.C1 = 1 or T1.C1 = (select C1 from T1 where C1=99);

煩わしいので、問題のクエリの実行結果だけ貼り付け。
DB2 9.1.2。

select T1.* from T1 left join T2 on T1.C2=T2.C1 where T1.C1 = 1 or T1.C1 = (select C1 from T1 where C1=99)

C1          C2
----------- -----------
          1           1

  1 レコードが選択されました。

DB2 9.5.2。

select T1.* from T1 left join T2 on T1.C2=T2.C1 where T1.C1 = 1 or T1.C1 = (select C1 from T1 where C1=99)

C1          C2
----------- -----------
          1           1

  1 レコードが選択されました。

DB2 9.7.0。

select T1.* from T1 left join T2 on T1.C2=T2.C1 where T1.C1 = 1 or T1.C1 = (select C1 from T1 where C1=99)

C1          C2
----------- -----------

  0 レコードが選択されました。

おぉ、確かに。
DBのクエリの結果が正しくないという問題に対して、アプリケーション開発者はどのような注意をしていったらいいのだろうかと悩むところだ。今回の問題は同じパターンのクエリであれば問題が発現するもののようなので、比較的容易に発見することができるだろうけど、ある特定の値の場合にのみ発生する問題なんかは本番になって初めて発覚するということが多々あるだろうな、と思うと結構怖いかも。