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

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

Version 1.4.186 Beta (2015-03-02)

書いたパッチが取り込まれた版。system_rangeテーブル(仮想表というか関数というか)は知ってると便利です。PostgreSQLならgenerate_seriesです。Oracleだとない(と思うので)、1から9が入った表を作ったりするのは、よくやられていたりするのかしら。

しかし、select * from dual join(select x from dual) on 1=1 が壊れるバグとか怖いですね。

  • Servlet API 2.4に代わり、Servlet API 3.0.1が使われるようになった
  • MVStore: アペンドオンリーモードにて、古いチャンクが削除されないようになった
  • MVStore: ページ参照のキャッシュが巨大になることがあり、場合によってOut of Memoryを引き起こす結果となっていた
  • MVStore: 参照されなくなったLOBオブジェクトが適切に削除されておらず、場合によっては不必要なデータベースの巨大化を引き起こしていた
  • MVStore: 最大キャッシュサイズが不自然に2GBに制限されていた(integerの桁数溢れのため)
  • MVStore / TransactionStore: 更新の同時実行が、"Too many open transactions"例外を引き起こしていた
  • StringUtils.toUpperEnglish が小さなキャッシュを持つようになった。これにより、結果セットからカラムネームを使う際に読み込みが速くなる
  • MVStore: 65535を超える同時トランザクションをサポートするようになった。以前は、もっとも古いトランザクションから最新のものまで65535トランザクションに制限されていた(これはきわめて奇妙な制限である)
  • デフォルトのインプレイスのLOBオブジェクトの最大サイズが128バイトから256バイトに変更された。読み込みのたびにLOBに対する参照が作成されており、その参照のメンテナンスが大きなオーバーヘッドになっていた。制限値が大きければ、必要な参照が少なくて済む。
  • カラムのないテーブルが動作していなかった(テスト用に使用されている)
  • LIRSキャッシュがすべてのケースで自動でリサイズされるようになった。averageMemoryの設定が不要になった。
  • MVStoreデータベースから、非MVStoreデータベースへリンクテーブルを作成すると、2つめの非MVStoreデータべースファイルを作成していた
  • バージョン 1.4.184 以降で、結合とワイルドカードを含むクエリが壊れてしまうバグ。例) select * from dual join(select x from dual) on 1=1
    • 1.4.184
sql> select * from dual join(select x from dual) on 1=1;
Error: org.h2.jdbc.JdbcSQLException: 一般エラー: "java.lang.RuntimeException: Unexpected code path"
General error: "java.lang.RuntimeException: Unexpected code path" [50000-184]
    • 1.4.186
sql> select * from dual join(select x from dual) on 1=1;
X | X
1 | 1
(1 row, 41 ms)
    • すごいなこれ。
  • Issue 598: 範囲外の値を生成しないために、パーサが timestamp "24:00:00.1234" のような値で失敗するようになった
  • トリガーも関数同様にソースコードで定義できるようになった
  • GROUP BYしているときに、すべてのGROUP BYカラムがSELECT文中に記載されていない場合にもプランナにソートにインデックスを使うようにした
    • んー...
    • 原文:"Make the planner use indexes for sorting when doing a GROUP BY where all of the GROUP BY columns are not mentioned in the select. Patch by Frederico (zepfred)."
  • PostgreSQL互換性: generate_series(system_rangeテーブルへのエイリアス)
    • しかし、system_rangeテーブルがgenerate_seriesよりも機能が足りてなかった(STEP指定ができなかった)ので、そこも追加になっています。
  • IN条件の中で、右側のパラメータのカラムの型が抜け落ちてしまう不具合の対応