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

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

Version 1.2.141 (2010-08-22)

いつもより若干リリースの期間が空きました。が、変更点は少なめ。自分がバグとしてあげたのが1件直ってた。

  • 実験的な仮の暗号アルゴリズムとして"FOG"が実装された。暗号的には弱いもので、テキストエディタで直接みたら中身が読めない、という程度の意味合いしかない、とのこと。有用かどうか、意見求む、と。
  • 文法と関数のドキュメントが翻訳しやすくなったらしい。
  • ハッシュ化パスワードによる接続: 平文のパスワードによる接続の他に、ハッシュ化されたパスワードによる接続をサポート。設定ファイルに平文でパスワードを記述しなくてよくなる。
    • 詳細が、Advanced / Password Hashに書いてあると言う事なので読んでみたけれど、「設定ファイルに平文でパスワードを記述しなくていい」以上の意味がない。接続の際にはハッシュ化されたパスワードが平文で流れるので、そのハッシュ化されたパスワードを奪取すれば、そのまま接続できてしまう(ドキュメントにも書いてある) だったら、最初っからランダムな文字列生成してパスワードとして使っておけばいいような...
  • Lucene3.xのサポートがソースコード上追加された。ただし、まだデフォルトではなく、また、デフォルトのjarでもサポートしていない。有効にするためには、ソースコードを取得して、ビルドする必要がある。1.3系ではLucene3がデフォルトになるとのこと。Issue 147
  • ネイティブの全文検索が複数コネクションによる同時アクセスで、Javaレベルでのデッドロックが発生していた点の修正。
  • CREATE FORCE VIEW が参照しているテーブルが存在していないほとんどのケースで動作しなかった点の修正。
    • 以前だと、create force viewで存在していないテーブルを参照するビューを作成する事はできたものの、その後その参照するテーブルを作成しても、viewが動作しなかったのですが、1.2.141からは、後付けで参照するテーブルを作ってやればその後はちゃんと動作するようになりました。
      • 1.2.140
java -cp h2-1.2.140.jar org.h2.tools.Shell -url jdbc:h2:mem:                                                                                                     [~/bin]

Welcome to H2 Shell 1.2.140 (2010-07-25)
Exit with Ctrl+C
Commands are case insensitive; SQL statements end with ';'
help or ?      Display this help
list           Toggle result list / stack trace mode
maxwidth       Set maximum column width (default is 100)
show           List all tables
describe       Describe a table
history        Show the last 20 statements
quit or exit   Close the connection and exit

sql> create view hoge as select * from fuga;
Error: org.h2.jdbc.JdbcSQLException: ?e?[?u?? "FUGA" ?????????????
Table "FUGA" not found; SQL statement:
create view hoge as select * from fuga [42102-140]
sql> create force view hoge as select * from fuga;
(Update count: 0, 29 ms)
sql> select * from hoge;
Error: org.h2.jdbc.JdbcSQLException: ?r???[ "PUBLIC.HOGE" ????????: "?e?[?u?? ""FUGA"" ?????????????
Table ""FUGA"" not found [42102-140]"
View "PUBLIC.HOGE" is invalid: "?e?[?u?? ""FUGA"" ?????????????
Table ""FUGA"" not found [42102-140]"; SQL statement:
select * from hoge [90109-140]
sql> create table fuga ( id int , text varchar);
(Update count: 0, 10 ms)
sql> select * from hoge;
Error: org.h2.jdbc.JdbcSQLException: ?r???[ "PUBLIC.HOGE" ????????: "?e?[?u?? ""FUGA"" ?????????????
Table ""FUGA"" not found [42102-140]"
View "PUBLIC.HOGE" is invalid: "?e?[?u?? ""FUGA"" ?????????????
Table ""FUGA"" not found [42102-140]"; SQL statement:
select * from hoge [90109-140]
sql> quit
Connection closed
      • 1.2.141
java -cp h2-1.2.141.jar org.h2.tools.Shell -url jdbc:h2:mem:                                                                                                     [~/bin]

Welcome to H2 Shell 1.2.141 (2010-08-22)
Exit with Ctrl+C
Commands are case insensitive; SQL statements end with ';'
help or ?      Display this help
list           Toggle result list / stack trace mode
maxwidth       Set maximum column width (default is 100)
show           List all tables
describe       Describe a table
history        Show the last 20 statements
quit or exit   Close the connection and exit

sql> create view hoge as select * from fuga;
Error: org.h2.jdbc.JdbcSQLException: ?e?[?u?? "FUGA" ?????????????
Table "FUGA" not found; SQL statement:
create view hoge as select * from fuga [42102-141]
sql> create force view hoge as select * from fuga;
(Update count: 0, 11 ms)
sql> select * from hoge;
Error: org.h2.jdbc.JdbcSQLException: ?r???[ "PUBLIC.HOGE" ????????: "?e?[?u?? ""FUGA"" ?????????????
Table ""FUGA"" not found [42102-141]"
View "PUBLIC.HOGE" is invalid: "?e?[?u?? ""FUGA"" ?????????????
Table ""FUGA"" not found [42102-141]"; SQL statement:
select * from hoge [90109-141]
sql> create table fuga (id int, text varchar);
(Update count: 0, 1 ms)
sql> select * from fuga;
ID         |TEXT
(0 rows, 191 ms)
  • MVCC: 2つのコネクションが同じキーで同時に行をinsertした場合に、後のコネクションの方に、即座に"Unique index or primary key violation"が返っていたが、先のコネクションがコミットするまで例外の発生が遅れるようになった。
    • ただ、先のコネクションがコミットするまで、と書いてあるが、後のコネクションの方がinsertしてからしばらく経つと、後のコネクションの方に"Timeout trying to lock table"が発生するのだけれど...。バグ?
      • 追記:というか、LOCK_TIMEOUTに引っかかってるだけか。
  • サーバーモード: クライアントがサーバ側と異なるタイムゾーンで動いている場合、日付の値が異なるタイムゾーン間でシフトしてしまう?
  • 組み込みのコネクションプールがログインタイムアウトの値を適切に取り扱っていない(設定値より早くタイムアウトしてしまう)点を修正
  • 翻訳: 新しいメッセージがスペイン語に翻訳された。
  • INFORMATION_SCHEMA.SETTINGSに明示的に設定したH2関連のシステムプロパティ(h2.で始まるもの)が含まれるようになった。以前は、いくつかのH2関連の設定はリストされていなかった。
    • そのかわり、デフォルトで設定されている値が表示されなくなった...。微妙。
  • EXPLAIN ANALYZEをインメモリデータベースで実行すると例外が発生していた点を修正。Issue 216
    • Issue 216となっているが、Issue 215の間違いかと。
  • データ更新系(insert,update,delete)が最大5倍速くなった。可能な場合、Objectsをbyte arraysに変換するのを避けるようになったため。
    • いきなり5倍って。どういうケースなんだろう。
  • LOG=0の時、若干速くなった(前はLOG=0でもまだログが書き込まれていたため)
  • オプションのソースディレクトリが存在しない場合、コマンドラインツールでメッセージを出力するようになった
    • バックアップコマンド等で、ファイルがない場合と、その上のディレクトリがない場合でメッセージが変わるようになった、という感じのようです。
  • REFERENTIAL_INTEGRITYが無効になっていれば、テーブルのtruncateができるようになった
    • 下記の様なSQLを実行すると、以前は、最後のtruncateもテーブルを空にできません、と怒られたのですが、1.2.141からは空になります。
create table hoge(id int, refid int, text varchar);
create table fuga(id int not null primary key, text varchar);
alter table hoge add foreign key (refid) references fuga(id) on delete restrict;
insert into fuga values (1,'fuga1');
insert into hoge values (1,1,'hoge1-1');
truncate table fuga;
set referential_integrity false;
truncate table fuga;
  • DB (non page store) から 1.2 DB (page store)に自動変換がおこなわれる際に、非暗号化データベースも暗号化データベースに変換されていたのを修正