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

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

Version 1.3.158 (2011-07-17)

送ったパッチが取り込まれたリリースだった。

CLOB/BLOBを含むデータベースに対する不具合の修正が含まれていますが、この手のは、結構さらっと「データベースがオープンできなくなる不具合の修正」とか書いてあってハラハラする。

  • 全文検索(組込): 全文検索の索引が作成された後、コネクションを再オープンするとトランザクションロールバック全文検索の索引をロールバックしなかった。
  • PostgreSQLApache Derbyの互換性の為にROW_NUMBER() OVER() のサポート(ROWNUM()のエイリアス)
  • Issue 325: 全文検索の初期化に使われたコネクションがデータベースの問合せに使われると、全文検索においてデッドロックを引き起こす可能性がある。これは、全文検索だけの問題ではなく、その他のトリガーの初期化に使われたコネクションにおいても発生する。
    • H2の全文検索はトリガーによって実装されている
  • DATABASE_TO_UPPER: falseがセットされると、テーブル名やカラム名といった識別名が大文字、小文字を区別するようになる(集計関数や組み込みの関数、データ種別、キーワードを除く)。これは、MySQLPostgreSQLとの互換性の向上のため。
  • 1.3.xから1.3.157にアップグレードした場合、BLOBやCLOBを使っていると、データベースが一度しかオープンできなかった。
  • SUMをbooleanに対してかけた場合、trueの行数をカウントするようになった。
    • 前のバージョンでは、"SUM、AVGを不正なデータ型 "SUM(XXX)" に使用しました"ということで例外になっていた
  • assertThrowsを使ったテストケースの簡略化
  • 供給されたコネクションを使用して結果セットを返すファンクションで、いくつかのケースで内部エラーを起こすことがあった。現在はそのような結果セットは早い段階でコピーされるようになった。
  • Data type RESULT_SET: information_schema.function_aliases が type 0 を返していた。現在はオラクル同様に-10を返すようになった。
  • Data type RESULT_SET: RESULT_SET型のカラムを持つテーブルを作成することができるが、そのカラムに、データが保持できない。
  • H2Console: Mac OS Xでのシステムトレイアイコンの改善(背景色の透明化)
  • String.toUpperCase()がいくつかの個所で使用されていた。これは、トルコロケールを使用する際に問題になる。 このメソッドは、それらの問題の解決のためにtoUpperCase(Locale.ENGLISH)に置き換えられた。
  • Shell tool: 組み込みコマンドのdisitinctが削除された(代わりに、SQLステートメントの"show tables","show columns from tableName"を使用する) 結果セットのフォーマットが改善された。
  • MERGE: ユニークキーが重複した場合(ただし、それが主キーやmerge自体のキー項目でない場合)、正しくない例外が投げられていた。
  • IBM DB2Apache Derbyとの互換性: 仮想テーブルSYSIBM.SYSDUMMY1をサポート
  • ROWNUM()がIN(..)と組み合わせて使えなかった。次のクエリは想定したように動作していなかった。select * from (select rownum r from test) where r in (1,2)
    • 1.3.157で実行すると下記のような事になる。
sql> create table hoge (id int, txt varchar);
(Update count: 0, 4 ms)
sql> insert into hoge values (2,'a'),(4,'b'),(6,'c');
(Update count: 3, 5 ms)
sql> select * from (select rownum r from hoge) where r in (1,2);
R
1
2
1
2
(4 rows, 21 ms)
  • H2 Console での補完: 補完機能がクォートされた名称をサポートしていなかった。
    • テーブル名。カラム名は1.3.158でもサポートされていない。
  • CLOBやBLOBに対してIndexをはれないようになった(インメモリデータベースやインメモリインデックスは除く)。そのようなカラムではリカバリが動作しないため。全文検索のINDEXについては、当然それらのカラムもサポートしている。
    • リカバリが動作しないためって、のはどういう事なんでしょう。
sql> create table hoge(id int, txt clob);
(Update count: 0, 65 ms)
sql> create index on hoge(txt);
Error: org.h2.jdbc.JdbcSQLException: 機能はサポートされていません: "Index on BLOB or CLOB column: TXT CLOB"
Feature not supported: "Index on BLOB or CLOB column: TXT CLOB"; SQL statement:
create index on hoge(txt) [50100-158]
  • PUBLICスキーマがリネームできるようになっていたが、データベースが正常にオープンできるなくなるため、現在はリネームできないようになった。同様に、INFORMATION_SCHEMAもリネームできないようになった。
  • サーバーモード:サーバとクライアントが、異なるタイムゾーンで異なるサマータイムのルールに従っている場合の問題が解決された(ただし、これは、クライアント、サーバともにこのバージョン以降になっている必要がある)
  • 新しいシステムプロパティ"h2.storeLocalTime"の追加。これは、同じタイムゾーンで異なるサマータームルールを持つ場合の問題の回避のため。
  • Date, time, 及び timestampデータタイプの再実装。TimeはPostgreSQLに似た、nanosecondsの精度とより広い範囲(0以下及び大きい値)をサポートした。
  • ノーブレークスペースを含むSQL文が無効とみなされていた
    • 非空白文字の判定が、!isWhitespaceから!isSpaceCharに変更になっています。