H2Databaseを追っかけていたりしたブログ

H2 database のリリースノートを読んだりとか。

H2 Version 1.2.138 (2010-06-27)

今回もあまり変更点は多くありません。「1.3になったらこれがデフォルト」というのも数多く出てきているのでそろそろ1.3に移行するのかな、とか。

そういえば、中国のH2 google groupがなくなってますね。撤退したからなんでしょうが、今回ようやく気がついた。

•参照整合性制約: 子テーブル側で、外部キーがnullだった場合に、親テーブルでキーがnullの行を削除できなかった。ちょっと分かりにくいですね。下記の例はv1.2.137での例ですが、最後の参照整合制約違反がv1.2.138では発生しません。

sql> create table hogea(id int,name varchar);
create table hogeb(id int,name varchar, ida int references hogea(id));
(Update count: 0, 0 ms)
sql> (Update count: 0, 0 ms)
sql> insert into hogea values (null, 'test');
(Update count: 1, 0 ms)
sql> insert into hogeb values(1,'test2',null);
(Update count: 1, 0 ms)
sql> insert into hogeb values(1,'test3',3);
Error: org.h2.jdbc.JdbcSQLException: 参照整合性制約違反: "CONSTRAINT_4: PUBLIC.HOGEB FOREIGN KEY(IDA) REFERENCES PUBLIC.HOGEA(ID)"
Referential integrity constraint violation: "CONSTRAINT_4: PUBLIC.HOGEB FOREIGN KEY(IDA) REFERENCES PUBLIC.HOGEA(ID)"; SQL statement: insert into hogeb values(1,'test3',3) [23002-137]
sql> delete from hogea;
Error: org.h2.jdbc.JdbcSQLException: 参照整合性制約違反: "CONSTRAINT_4: PUBLIC.HOGEB FOREIGN KEY(IDA) REFERENCES PUBLIC.HOGEA(ID)"
Referential integrity constraint violation: "CONSTRAINT_4: PUBLIC.HOGEB FOREIGN KEY(IDA) REFERENCES PUBLIC.HOGEA(ID)"; SQL statement: delete from hogea [23003-137]

•実験的機能: ケースセンシティブなカタログ名のサポート。h2.databaseToUpperをfalseにすると利用可能。1.3系では、falseがデフォルトになる。
•実験的期ののサポート: ネステッドジョインのサポート。h2.nestedJoinsプロパティをtrueにすることで利用可能。ネストした結合と、右外部結合が期待通りに動くようになります...が、現状デフォルトにはならないんですね。なにか不都合があるんでしょうか。1.3系ではtrueがデフォルトになるようです。
•サンプルアプリケーションの追加: CachedPreparedStatements.
スキーマを指定してファンクションを作成した場合に、viewやネストしたクエリや制約中で使用できなかった不具合の修正。
ベンチマークで使用するデータベースのバージョンを新しくした
•Version 1.2.137 がJava1.4にコンバートしてビルドできなかったので、それの修正
クラスター: アドミン権限を保有していないユーザーが、1ノード落ちたクラスター化データベースに接続できない不具合の修正。これでもうちょっとちゃんと使えるようになります。
•DROP VIEW で CASCADE と RESTRICT のサポート。デフォルトはRESTRICT。RESTRICTだと、viewに依存したviewがある場合、削除できません。CASCADEだと、依存しているviewも削除されます。Oracleだと無効になりますね。

sql> create table hoge(id int, txt varchar, day date);
(Update count: 0, 0 ms)
sql> create view vhoge as select id, txt from hoge;
(Update count: 0, 15 ms)
sql> select * from vhoge;
ID         |TXT
(0 rows, 94 ms)
sql> create view v2hoge as select * from vhoge;
(Update count: 0, 0 ms)
sql> drop view vhoge restrict;
Error: org.h2.jdbc.JdbcSQLException: "V2HOGE" が依存しているため、"VHOGE" をドロップすることはできません
Cannot drop "VHOGE" because "V2HOGE" depends on it; SQL statement:
drop view vhoge restrict [90107-138]
sql> drop view vhoge cascade;
(Update count: 0, 0 ms)
sql> select * from v2hoge;
Error: org.h2.jdbc.JdbcSQLException: テーブル "V2HOGE" が見つかりません
Table "V2HOGE" not found; SQL statement:
select * from v2hoge [42102-138]

•CREATE VIEW で、OR REPLACE のサポート
•ビルドツール: 単一のテストケースが実行可能に。(build -Dtest=org.h2.test.db.TestViewDropView)