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条件の中で、右側のパラメータのカラムの型が抜け落ちてしまう不具合の対応

Version 1.4.185 Beta (2015-01-16)

引き続き、MVStore周りが中心は中心だけど、時々すごい不具合が入ってくる。ここの所そういう感じのが続いてますね。

  • バージョン 1.4.184で "group by"がテーブル名を無視してしまっており、そのため、セレクトする項目を誤る可能性があった。例: select 0 as x from system_range(1, 2) d group by d.x;
    • こういうのがポロッと入ってくるところが怖い。
  • 新しい接続設定"REUSE_SPACE"(デフォルト: true)の追加。無効の場合、すべての変更はデータベースに追記され、既存のデータは上書きされない。これにより、データファイルが削除されるまで、前の状態にロールバックできるようになった。
    • 原文: "This allows to rollback to a previous state of the database by truncating the database file." そもそも、ロールバックできる状況下で、データファイルがtruncateされることがあるんだろうか。
  • Issue 587: MVStore: コンパクションと保存処理が同時に行われた場合、IllegalStateExceptionが発生することがあった
  • Issue 594: Profiler.copyInThread が正しく動作しない
  • Script tool: SCRIPT ... TOが常に使われるようになった(処理のスピードアップと仕様ディスク量の低減のため)
  • Script tool: BLOCKSIZE パラメータのパースの対応
  • PageStore#commit メソッドの中のバグの修正。一旦ignoreBigLogフラグがセットされてしまうと、フラグをクリアする処理にたどり着かず、結果パフォーマンスの低下を引き起こしていた。
  • Issue 552: BIT_AND と BIT_OR 集約関数の実装。

Version 1.4.184 Beta (2014-12-19)

MVStoreはまだ結構がちゃがちゃしてますね。1.3.183のバグ対応でリリース間隔が狭かったのかな。

  • version 1.4.183で、デフォルト値がシーケンスによって生成されたカラムを含むテーブルで、インデックスが使用されていなかった。これには、IDENTITYでオートインクリメントの列を含むテーブルも含まれる。このバグは、ビューや生成テーブルで"rownum"をサポートするにあたって、発生するようになってしまった。
    • 原文はバージョンが1.3.183になってた。
  • MVStore: 登録されたBLOBやCLOBデータが見えなくなることがあった。これは、ObjectDataTypeの比較に関連したバグによる。
  • StreamStoreからの読み込みの際に、元のデータが存在しない場合に、IOExceptionをスローするようになった。
  • MVStore: 保存時に例外が発生した場合、いかなる場合でも即座にストアがクローズされるようになった
  • MVStore: 幾つかのファイルで、ダンプツールが無限ループに陥ることがあった
  • MVStore: たくさんのCLOBやBLOBを含むデータベースでリカバリが非常に速くなった
  • セレクト句のクォートされたカラム名エイリアスでのgroup byが動作していなかった。例: select 1 "a" from dual group by "a"
  • Auto-server mode: ホスト名が.lock.dbファイルに記録されるようになった

Version 1.4.183 Beta (2014-12-13)

MVStore周りの改修が続く。そういえば、先日送ったパッチが取り込まれた。1.4.186に含まれるはず。

  • MVStore: デフォルトのオートコミット用のバッファのサイズが2倍になった。これにより大量のデータをインサートした後のデータファイルのサイズが削減される。
  • 組み込み関数の"power"と"radians"の返り値がdoubleになった
  • アウタークエリがそのビューに対する制約を含んでいて、"row_number" や "rownum" がビューや元のテーブルに含まれている場合予期せぬ結果が返ってきていた。例) select b.nr, b.id from (select row_number() over() as nr, a.id as id from (select id from test order by name) as a) as b where b.id = 1
    • なんかよく分からない。原文は'Using "row_number" or "rownum" in views or derived tables had unexpected results if the outer query contained constraints for the given view.'
  • MVStore: リカバーツールがより多くのタイプのファイルの不整合に対応できるようになった。
  • MVStore: TransactionStoreが使用可能になる前に初期化を必要とするようになった。
  • イコールと範囲指定の条件を同一のカラムに対して指定したビューもしくは派生テーブルが正しく動作していなかった。例) select x from (select x from (select 1 as x) where x > 0 and x < 2) where x = 1
  • データベースURLのPAGE_SIZE設定がMVStoreでも使われるようになった。
  • MVStore: 永続化ストアに置けるデフォルトのページ分割サイズが4096バイトになった(以前は、16KBであった) これによりほとんどの場合でデータベースファイルのサイズが小さくなるはず(幾つかのケースでは前のバージョンの半分以下になる)
  • CLOB もしくは BLOBを含むテーブルへのオートアナライズが動作していなかった。
  • MVStore: リファレンスカウンティングが正しく動作していなかったとしても使用済みのチャンクが上書きされないように、リファレンスカウンティングの代わりに、マークアンドスイープGCアルゴリズムの使用。
  • マルチスレッドモードで、バックグラウンドでのカラムのセレクティビティの更新が時々うまく動作していなかった。
  • マルチスレッドモードで、スキーマを更新した(例えばテーブルをドロップした)際に、データベースのメタデータの操作が動作しないことがあった。
  • オリジナルの行が削除されたらCLOBやBLOBの値が読めなかった(MVCCモードを使っているときであっても)
  • MVStoreTool がIllegalArgumentExceptionをスローしていた
  • dateやtime,timestampの変換処理のパフォーマンスの改善
  • H2 Console: 組み込みのWebサーバが不明なファイルをリクエストされた際に適切に動作していなかった
  • MVStore: jarファイルが "h2-mvstore-*.jar" にリネームされ、Mavenに別個にデプロイされるようになった
  • MVStore: 並列読み書き有効がデフォルトになった
  • Server mode: 転送用のバッファサイズが16KBから64KBに変更された。これによりLinux上で大幅にパフォーマンスが改善された。
  • H2 Console and server mode: Poodle SSLv3 脆弱性のために、SSLが無効にして、TLSを使うようにした。セキュアな匿名コネクションを有効にするためのシステムプロパティ"h2.enableAnonymousTLS"が追加された。デフォルトの証明書は自己署名証明書なので、中間者攻撃を回避するためには、手動で証明書をインストールする必要がある。
  • MVStore: R-Treeがメモリの使用量を正確に見積もれていなかった
  • MVStore: R-Treeでのストアのコンパクト化が常に動作していなかった。
  • Issue 581: LOCK_MODE=0で動作しているとき、JdbcDatabaseMetaData#supportsTransactionIsolationLevel(TRANSACTION_READ_UNCOMMITTED)はfalseを返すべき
  • 複数コネクションが同時に同じテーブルにアクセスした場合にデッドロックが発生する不具合を修正
  • コードの複数の部分で、"SET MAX_MEMORY_ROWS x"コマンドに対して値をセットしていなかった(?)
    • 原文 "Some places in the code were not respecting the value set in the "SET MAX_MEMORY_ROWS x" command"
  • 巨大な(4000万行以上)行をユニオンする際にNegativeArraySizeExceptionが生成される不具合を修正
  • MySQLとの互換性のために"USE schema"をフィックス(?)
    • 原文 "Fix "USE schema" command for MySQL compatibility, patch by mfulton"
  • MySQLの ROW_FORMAT=DYNAMIC をパースして無視するようにした

Version 1.4.182 Beta (2014-10-17)

MVStore周り、引き続きもりもり修正が入っています。それにしてもBeta長い。

  • MVStore: エラーメッセージとログの改善。オブジェクトをシリアライズする際のエラー時のふるまいを改善。
  • OSGi: MVStoreパッケージがエクスポートされるようになった
  • MVStore使用時に、複数スレッドで並列にインデックスやテーブルを作成すると比較的容易に"SYS"テーブルに置いてロック取得のタイムアウトが発生する
  • マルチスレッドオプション使用時に、"Unexpected code path"例外がスローされる。特にオプション"analyze_auto"を少ない値に設定しているとき。
  • サーバモードで、CLOBやBLOBを読んでいる途中でコネクションがクローズされると、コネクションがクローズされたと言われずに、NullPointerExceptionがスローされる。
  • DatabaseMetaData.getProcedures 及び getProcedureColumns がユーザ定義関数が向こうの場合に例外をスローしていた
  • Issue 584: 不正なシーケンスの定義についてのエラーメッセージが適切ではない
  • CSV tool: rowSeparatorオプションがサポートされなくなった。代わりにlineSeparatorを使うこと。
  • MVStoreのテーブルで、降順のインデックスが正確に動作していなかった
  • Issue579: MVStoreを使用しているとき、仮想項目"_rowid_"に対するインデックスが使われていなかった。
  • "offset"と"fetch"が1.4からキーワードになる点についてドキュメントの修正。
  • Long.MIN_VALUEがオートインクリメント(ID)項目でパース出来ていなかった
  • Issue 573: "isWrapperFor()" と "unwrap()" をその他のJDBCクラスに対して実装の追加。
    • 1.4.181でJdbcConnection.javaに実装されたのを受けて。
  • Issue 572: update文においての"order by"についてMySQLとの互換性を向上
    • LIMITがORDER BYよりも後ろになった模様。
  • version 1.4.181 で変更されたJDBCのエスケープ処理がパーサ(サーバ上で動作)とJDBC API(クライアント側で動作)の両方に影響があった。そのため、それらのシンタックス"{t 'time}"や "{ts 'timestamp'}"や "{d 'data'}" を使う場合にはクライアントおよびサーバを共に1.4.181以降にアップグレードする必要がある。

Version 1.4.181 Beta (2014-08-06)

今回も変更点少ない。

  • MySQLとの互換性の向上。"use schema"のサポート。
  • 特にデバッグレベルにおいて、トレースファイルへの書き込みが速くなった。
  • データベースのオプション"defrag_always=true"がMVStoreで動作していなかった。
  • JDBCエスケープシンタックスの{ts 'value'}が値を正しくタイムスタンプとして解釈していなかった。{d 'value'} (日付)や{t 'value'}(時刻)も同様。
  • ファイルシステム抽象化: moveを使った既存ファイルの置き換えをサポート(現時点ではWindowsは対象外)
  • "shutdown defrag"文でMVStoreでデータベースの圧縮を行うようになった。このコマンドはデータベースファイルのサイズを大幅に削減し、比較的高速に動作する。ただし、インクリメンタルには動作しない。
  • 参照や書き込みが発生していない時、MVStoreがバックグラウンドで自動的にストアの最小化を行うようになった。一定時間後、ファイルサイズを縮小化する。この機能はまだ開発途中。
  • デフォルトのPAGE_SIZEを2048から4096に変更。多くのファイルシステムのブロックサイズに合わせた(PageStoreのみ。MVStoreは以前から4096になっていた)
  • 利用可能なRAMの量に応じて、自動的にMAX_MEMORY_ROWSとCACHE_SIZEの設定がスケールするように。パワフルなマシンで、設定変更なしでより快適に使えるように。
  • web console でタブをスペース4つのように取り扱うようになった。
  • Issue 573: JdbcConnection.javaに"isWrapperFor()" と "unwrap()" の実装を追加。

Version 1.4.180 Beta (2014-07-13)

ベータが続きます。MVStore周りが引き続き中心です。今回は変更点少ないです。

  • MVStore: ファイルサイズの肥大を避けるために、一定期間で自動でコンパクションが行われるようになった。これについてはまだ実装途中。
  • テンポラリテーブルのシーケンス(オートインクリメントあるいはID列)が不要にデータベースファイルに永続化されており、データベースの再オープン時にも除去されていなかった。
  • MVStore: Storeに同時にアクセスがあるとMVMap.openVersionにてIndexOutOfBoundsExceptionが発生することがあった。
    • MVMap.openVersionに同時にアクセスがあると、か?
  • LIRSキャッシュが必要に応じて内部のハッシュマップをリサイズするようになった。
  • オプションで、セッションの履歴をH2コンソールで永続化するようになった
  • クラスタに幾つのサーバがあるか、またそのサーバが有効かどうかを取得するために、client-infoプロパティが追加になった
  • 暗号化されたデータベースのパスワードを変更する際に、不正なパスワードが渡された場合のバグの修正。
  • Issue 567: H2がリカバーの際に長時間ハングする。テーブルをロックする際にセッションを使い果たすのを避けるためにキューが導入された。