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

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

Version 1.3.155 (2011-05-27)

  • トリガーがあるテーブルを変更した際に、新しいトリガーがテーブル名_COPY_x_yという名前のテーブル名で作成され初期化されている。これは将来的にはそうならないよう計画されている。
    • 何書いてるか意味不明だ...。これは、ALTER TABLEしたときに、この時点では、1.新しいテーブルを作成 2.データをコピー 3.元のテーブルをリネーム 4.新しいテーブルをリネーム 5.元のテーブルをドロップ という順に処理されていたため。元々、その一時テーブル名をTEMP_TABLE_x_yという名前にしていたが、わかりやすいように、テーブル名_COPY_x_yとしたという修正
  • ファイルシステム操作が失敗した場合に、System.gc()がループの中で呼ばれていた。現在、一度しか呼ばれないようになった。
  • トリガー(全文検索含む)が、'期待されないコードパス'例外をセッションログ内で投げることがあった。
  • CURRENT_TIMESTAMP() などが、同一トランザクション内では同じ値を返すようになった
  • CALL文がARRAYの返り値を値のリストに変換しなくなった。今後、ARRAYが返されるようになる。
  • VALUESが単体のコマンド並びにテーブルソースとして利用できるようになった。SELECT * FROM(VALUES(1, 'Hello'),(2, 'World')) AS V;
  • TIMESTAMPADDが利用できるようになった(DATEADDのエイリアス) 多くのSQL_TSI_定数がTIMESTAMPADDとTIMESTAMPDIFFでサポートされるようになった(SQL_TSI_QUARTERとSQL_TSI_FRAC_SECONDは除く)
  • Issue 313: サブクエリかビューを含むselectクエリでNullPointerExceptionが発生する
  • 組み込み全文検索: '<','>','\'もホワイトスペース扱いになった。また、ホワイトスペース扱いの文字列もFullText.setWhitespaceChars(conn, ...)で変更できるようになった。
  • クラスパスからの読み込み時(例えば、read_file('classpath:logo.png'))、もしリソースが見つからなければコンテキストクラスローダーを利用する。
    • 原文は、content class loader となっているが、ソースコードを見ると、最後にそのスレッドのコンテキストクラスローダーからgetResourceAsStreamをしている。誤記?そういういいまわしがある?
  • ステートメント "script drop"が作成するスクリプトが、そのテーブルがユーザー定義関数への参照を含む場合、実行が出来なかった。
  • 想定通り動作しないにもかかわらず、データベースオープン時にマルチスレッドモードとロックモード0(ロック無効)を両方共指定可能だった(一度のみ)。現在は指定できないようになった。
  • トランザクションのコミット時にLOBオブジェクトが削除され、空き領域が再利用されるようになった。これまでは、コネクションがクローズされるまで再利用されなかった。
  • テーブルに対してSCRIPT DROPがカスケードオプションを利用していなかった。これは、そのビューが依存しているテーブルがドロップされたとき問題になる。現在カスケードオプションが利用されている。
  • ネステッドジョインを含むサブクエリを含むクエリのプランが良くなかった。これは、正しいクエリに対し、シンタックスエラーを引き起こす可能性があった。例:select 1 from (select 2 from ( ( test t1 inner join test t2 on t1.id=t2.id) inner join test t3 on t3.id=t1.id ) ) x;
  • DatabaseEventListener.init がサーバモードのとき、urlがnullで呼び出されていた。
  • 関数LNをサポート(LOGへのエイリアス)
  • 関数CEILをサポート(CEILINGへのエイリアス)
  • Issue 315: 複数のLOBへのアクセスがJavaレベルでのデッドロックを引き起こす可能性があった。
  • ICU4Jのcollatorをサポート
  • Oracleとの互換性の向上。NVL2のサポート。
  • PostgreSQLとの互換性の向上。RAND()に加えてRANDOM()のサポート。
  • クラスローダのメモリリーク問題が存在していた。あるクラスで、ある例外(スタックトレースを含む)に対して静的な参照を含んでいた
    • org.h2.store.DataReaderがEOFExceptionのオブジェクトをstatic finalで保持していた。
  • Split file system: ファイルの切り捨てを逆順で行うようにした。これにより、切り捨て中に処理が中断してもファイルリストの整合性が保たれる。
  • H2 JDBCクライアントが未署名のアプレットでも利用できるようになった。System.getPropertyがスローするSercurityExceptionが無視されるようになった。
  • 条件"in(select ...)"が、次のようにサブクエリを"distinct"のクエリに変換できない時、正確に動作していなかった。"select * from dual where x in (select x from dual group by x order by max(x))" 現在、その効率化が必要な場合には、サブクエリで手動で設定する必要がある。
  • 前回リリースで、"ユーザ名またはパスワードが不正です"のエラーコードが28000ではなく08004になっており、そのためエラーメッセージが間違っていた。
  • いくつかのケースで、テーブル作成中もしくはテーブルの変更中に次の例外がスローされていた。Unique index or primary key violation: "PRIMARY KEY ON """".PAGE_INDEX".
  • シェルツールで組み込みコマンドの"show"が使えなくなりました。これらは、H2及びMySQLではSQLステートメントのため。一方、"describe"コマンドは引き続きサポートされており、パラメータなしで呼び出されるとすべてのテーブルを表示します。
  • ソートされたインサートモード("insert into ... direct sorted select")が永続化データベースの非永続化テーブルにおいて動作していなかった。ClassCastExceptionがスローされていた。
  • Issue 308: Statement.getGeneratedKeys()が、キーを生成していない時空の結果セットを返すようになった。
  • h2small.jar(build jarSmallでビルドされる)がAndroid APIを含んでいた。削除され、jarファイルは21kb小さくなった。
  • テーブルを作成する際、精度が少なくともスケールより大きくなくてはならないようになった。
  • Java1.3及びJava1.4のサポートが削除された。
  • シンタックスエラーの際のエラーメッセージの改善: 期待されるトークンの列が時折正しくセットされていなかった。
  • データベースのファイルの最大サイズが、データベース設定PAGE_STORE_MAX_GROWTHで制限されるようになった。遅いファイルサイズの拡張は操作の遅さにつながるかもしれないが、データベースのクローズ速度が向上する。
  • 読み込み専用のデータベースで書き込み可能なリンクドテーブルがDATABASE_IS_READ_ONLY (90097)を引き起こす事があった。修正済み。