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

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

Version 1.3.175 (2013-01-18)

今回はchangelogに挙った変更点は若干少なめ。ただMVStoreの修正はほとんどchangelogに載らずにばんばん修正入っているようです。

今回のchangelogで初めて知ったのですが、HikariCPという高速が売りのConnection Poolがあるのですね。Tomcat CPの100倍以上速いとか。

https://github.com/brettwooldridge/HikariCP

あと、久しぶりに送ったパッチが取り込まれました。DB2のWITH UR等の isolation-clause と lock-request-clause を読み飛ばすという、DB2との互換性向上のパッチ。

Oracle互換モードで空文字列をnullのように扱う」は結構嬉しい人も多いのではないでしょうか。

  • "ANY" もしくは "SOME" を含むクエリでEXPLAINが不正だった
  • "out"パラメータを含むCallableStatement: 同じステートメントを二度実行すると例外が発生していた("パラメータがセットされていません")
  • Unionクエリ: サブクエリに"order by"を含んでいた場合、重複行が返される場合があった
  • GEOMETRYデータタイプが結果セットを返すユーザ定義関数で動作するようになった
  • PostgreSQL互換性: PgServerがdatabase_to_upperがfalseに設定されている場合に正しく動作していなかった
  • JdbcDataSource: setUrl及びgetUrlがsetURLとgetURLのエイリアスとして追加された。これはHikariCP(Hikari connection pool)との問題を解決するためのもの。
  • Issue 537: H2 Console: スキーマの読み込み時に、不正なJDBC呼び出しが発行されており、"カラムの精度が見つかりません"という例外が発生する原因となっていた
  • Geometry処理の改善(issue 535)
  • 既にあるテーブルと照合順序が同じ場合にデータベースURLで照合順序を設定できるようになった。
    • ちょっとわかりにくい...原文は "The collation can now be set in the database URL, even if there are data tables, if the collection is the same as the current collation."
    • 元々は、テーブルが一つでも作られてしまうと照合順序が同じであっても再セットできない仕様だったため、事実上データベースURLに照合順序を設定できない(初回接続でテーブルを作成すると2回目以降同じデータベースURLでもエラーになってしまう)、ということになっていたので、それを回避するための改修だと思われます。
  • Oracleとの互換性の改善: CASE WHENとDECODE
    • それぞれ短絡評価をするようになったのと、CASE WHENで対象の式を1度しか評価しなくなったっぽいですね。こ、細かい。
    • 1.3.175で実行。
sql> create sequence seq;
(Update count: 0, 2 ms)
sql> select case seq.nextval when 2 then 'two' when 3 then 'three' when 1 then 'one' else 'other' end result from dual;
RESULT
one
(1 row, 5 ms)
sql> select decode(1, 1, '1', 1, '11') r from dual;
R
1
(1 row, 1 ms)
    • 1.3.174で実行。
sql> create sequence seq;
(Update count: 0, 2 ms)
sql> select case seq.nextval when 2 then 'two' when 3 then 'three' when 1 then 'one' else 'other' end result from dual;
RESULT
other
(1 row, 6 ms)
sql> select decode(1, 1, '1', 1, '11') r from dual;
R
11
(1 row, 1 ms)
  • 制約を経由してビューに依存しているテーブルがある場合に"drop all objects"ステートメントが動作していなかった
    • 具体的には下記のような場合(テストケースからの抜粋)
        stat.execute("create table a(x int)");
        stat.execute("create view b as select * from a");
        stat.execute("create table c(y int check (select count(*) from b) = 0)");
  • サブクエリもしくはビューでorder byと一緒にエイリアスが使えなかった。これは1.3.174でのデグレード
    • 下記のSQLが1.3.174では文法エラーになっていた。
select * from (select x as y from dual order by y);
  • Issue 73: MySQLとの互換性の向上: REPLACEのサポート
    • 知らなかったんですが、DB2とかOracleのMERGE文相当なんですね。
  • MVStoreストレージ上でMVCCモードで空間インデックスが動作するようになった
  • MVStore: 同時平行稼働の問題が修正された。APIがシンプルになった。
  • 制約の配下のインデックスを削除しようとした場合のエラーメッセージから制約を特定できるように、エラーメッセージを改善。
  • Issue 518: EXCLUSIVEな接続でLOBを更新した後、java.sql.Connection.commit() でフリーズしていた
  • Issue 517: Create or replace viewステートメントが既に存在しているJDBC接続に対して効果がなかった
    • Aテーブルを参照しているビューXをリプレースして、Bテーブルを参照するようにしてもそれが別のコネクションに反映されなかった(Aテーブルを参照し続けた)、というか厳密には、ビューのリプレース時に内部的なデータベース変更履歴番号が更新されなかったため、クエリキャッシュが無効にならなかった、ということみたい。
  • Javaのような123Lシンタックスのサポート。例) SELECT (2000000000L*2)
  • Issue 520: シーケンスの最大値、最小値、循環のサポート
    • あと、併せてNOCACHEもサポートされたみたい
  • Issue 521: ScriptReaderがCloseableをimplement
    • CloseableってJava7からかと思ってた...
  • Issue 524: RunScript.executeが自身のStatementをクローズしていなかった
  • DB2の"WITH UR"句のサポート
  • MySQLのような values() 関数を伴うON DUPLICATE KEY UPDATE文によるinsertされるデータによるupdateのサポート。
    • なんだかよくわからない文に...原文は"Added support for ON DUPLICATE KEY UPDATE like MySQL with the values() function to update with the value that was to be inserted."
    • MySQL likeといいつつ、MySQLモードでのみのサポート。これもMERGE文みたいなもんですね。
    • テストケースのSQL
INSERT INTO table_test ( id , a_text, some_text ) VALUES (1, 'zzzzzzzzzz', 'abcdefghij') ON DUPLICATE KEY UPDATE some_text='UPDATE';
INSERT INTO table_test ( id , a_text, some_text ) VALUES (3, 'zzzzzzzzzz', 'SOME TEXT') ON DUPLICATE KEY UPDATE some_text=values(some_text);
  • Issue 522: Oracle互換モードで空文字列をnullのように扱う
  • Issue 527: Oracle互換モード: 不正確な位取りの挙動
  • ビューのメタデータの消費メモリをわずかに削減
    • String型の変数1個削減
  • 付与されたユーザがテーブルを操作できるように"GRANT ALTER ANY SCHEMA TO "のサポートの拡張。
  • Issue 532: ErrorCode.ROLES_AND_RIGHT_CANNOT_BE_MIXEDのJavadocが良くなかった
  • Issue 528: Oracle互換の TO_CHAR 関数の追加
  • Issue 534: CREATE ALIAS で NOCACHE のサポート
    • といいつつ、実際の引数としては、NOBUFFER。
  • CLOBでのユニコードサロゲートペアの保存についての課題の解決
  • H2 console: SHIFT+ENTERで"選択された文の実行"
  • DB2の"select * from test with ur"文法のバグの修正
  • DROP ALL OBJECTSで、内部的な依存性の取り扱いのバグの修正

そういやH2追っかけ始めてそろそろ4年。