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

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

Version 1.3.154 (2011-04-04)

今回このメモ書いている際に不具合を2つ見つけてメールしました。

  • 次の例外のSQL stateが変更になった。90005から22001 "列 {0} の値が長過ぎます: {1}"。90039から22003 "精度 {0} に対して値が大きすぎます"は"数値が範囲外です"とマージ。90110から22003 "{0} は範囲外です" は "数値が範囲外です"とマージ。 90021から22018: "データ変換中にエラーが発生しました {0}"。90006から23502: "列 {0} にはnull値が許されていません"。23003から23503: "参照整合性制約違反: {0}"。23001から23505: "ユニークインデックス、またはプライマリキー違反: {0}"。23002から23506: "参照整合性制約違反: {0}"。90056から23507: "列 {0} にデフォルト値が設定されていません"。23000から23513: "制約違反を確認してください: {0}"。08004から28000: "ユーザ名またはパスワードが不正です"。90051から57014: "ステートメントがキャンセルされたか、セッションがタイムアウトしました"。
    • でも、一部8004から28000への変更が中途半端で、ユーザ名かパスワードを間違えると「メッセージが見つからない」という例外になっていた。メールした。
  • H2コンソールがサポートしていないコマンドラインオプションを検出するようになった(将来的には、Server toolと統合される)
  • MySQLとの互換性: SHOW COLUMN FOR schemaName.columnNameが実装された。
    • Shellツールで動作確認しようと思ったら、SHOWという同名のコマンドがあるためにShellツールからだと試せない、という事が発覚。メールしたので次で直るかも。
  • DatabaseMetaData.getCrossReferenceで、プライマリキーのインデックス名も列挙されるようになった
  • 多くのCLOB/BLOBを含むデータベースでコネクションをクローズする際、非常に遅かった。理由は、コネクションをクローズする際、このコネクションのテンポラリのCLOB/BLOBの値が削除されるが、そこに対してインデックスが張られていなかった。既存のCLOB/BLOBを含むデータベースに対して、インデックスの作成は数秒の時間を要する。この既存のデータベースへのインデックスの追加は自動で行われる。
    • 内部的にLOBデータを格納しているINFORMATION_SCHEMA.LOB_DATAに、INDEXが張られていなかった事によるようです。これで気がついたんですが、create tableの隠しパラメータとして、hiddenがあるようです。create table hoge(id int primary key, txt varchar) hidden とすると、テーブルは作られるものの、showコマンドで表示されないテーブルになるようです。selectしたりinsertしたりは普通にできますが。いいのかそれで。
  • CLOB/BLOBをINSERT INTO X ... SELECT ... FROM Xを使って同じテーブル内でコピーしたとき、元の行が削除され、コピーされた行も削除されてしまっていた。これは、チェックポイントやデータベースクローズの際にArrayIndexOutOfBoundsExceptionを引き起こしていた。
  • パフォーマンスの改善(10%) ページストアの同期の部分の変更による。
  • 先頭に/がついていた場合(classpath:/org/...)、リソースの読み取りが動作していなかった。現在は先頭に/があってもなくてもロードできるようになった。
  • 以下の形式をサポート。INSERT INTO TEST SET ID = 1, NAME = 'World' (MySQLとの互換性のため)
  • Issue 304: 条件 [NOT] IN (SELECT ...) でサブクエリにORDER BYを含む場合に、"期待されていないコードパス"例外をスローする事があった。
  • ALTER TABLE ALTER ADD / REMOVE /ALTER COLUMN が、変更したテーブルに依存しているViewの依存オブジェクト(アクセス権、トリガー)をドロップしていた
  • CREATE OR REPLACE VIEW が、依存オブジェクト(アクセス権、トリガー)をもしViewが事前に存在した場合ドロップしてしまっていた。
  • ヒストグラムを計算するための新しい集約関数HISTOGRAM。想定としては、これはヒストグラムを生成するためにANALYZEが実施される際に内部的にクエリオプティマイザによってのみ使用される。
  • 指定された精度で値を切り捨てる、新しいシステム関数 TRUNCATE_VALUE。これはCASTと同様であるが、データタイプの変更を伴わない。そして数値のトランケートをサポートする(この関数の主なユースケースは、切り捨てた値のヒストグラムを作成することである) 現在、BINARY、BLOBとCLOBを切り捨てる事ができ、効率的にキャストする事ができる。
  • ARRAYの値の精度は、今後すべての要素の精度を足したものとなる。結果セットの精度はInteger.MAX_VALUEとなる。
  • CAST(x AS VARCHAR_IGNORECASE(y) / CHAR(y))は新しい精度が古い精度より低い場合、VARCHARを返却する。
  • メモリテーブルに対するユニークなハッシュインデックスがある場合、SHUTDOWN DEFRAGがデータベースのデフラグを完璧に行わなかった。
  • 暗号化ファイルシステムについてのいくつかの小さな修正(現在作業中)
  • いくつかの時間およびタイムゾーンの関数が西暦1年より前をサポートしていなかった。