続いてHyperSQL 2.0での新機能のうち、特に使い勝手に影響するものピックアップして紹介していく。2.0での新機能の詳細なリストはこちらを参照してほしい。

SQL標準への準拠

SQLパーサなども大幅なリライトが行われており、ANSI-92 SQLのほぼすべてと、SQL:2008の多くをサポートするようになった。これによってBETWEENやMERGE文などが利用できるようになった。また、BIT、BLOB、CLOB、INTERVALなどSQL標準で定義されているデータ型や、SUBSTRINGやTRIMなどの標準的な関数も追加されている。

配列型

データ型として配列型が利用できるようになった。以下に配列型を使用したテーブル定義の例を示す。

CREATE TABLE CONTACT_LIST (
  ID INT PRIMARY KEY, 
  NAME VARCHAR(100) NOT NULL, 
  MAILS VARCHAR(100) ARRAY[10])

このテーブルにレコードをインサートするには以下のようにする。

INSERT INTO CONTACT_LIST VALUES
  (1, 'Naoki Takezoe', 
  ARRAY['takezoe@gmail.com', 'takezoe@example.com']);

トリガー

HyperSQL 2.0ではトリガーもサポートされている。以下にトリガー定義の例を示す。

CREATE TRIGGER INSERT_USER_INFO AFTER INSERT ON USER_INFO
FOR EACH ROW 
  UPDATE USER_INFO SET FULL_NAME = FIRST_NAME + ' ' + LAST_NAME

ストアドファンクション

これまではJavaで実装したstaticメソッドをSQLから呼び出すことはできたものの、いわゆる一般的なストアドファンクション/プロシージャはサポートされていなかった。HyperSQL 2.0ではSQL/Javaによるストアドが利用きるようになった。

以下はSQLによるストアドファンクションの定義例だ。このストアドファンクションは引数に渡した時間から-1時間した値を返す。

CREATE FUNCTION AN_HOUR_BEFORE (T TIMESTAMP)
  RETURNS TIMESTAMP
  RETURN T - 1 HOUR

この関数はSQLの中で通常の関数と同じように利用することができる。

SELECT 
  AN_HOUR_BEFORE(EVENT_TIMESTAMP) AS NOTIFICATION_TIMESTAMP,
  EVENT_NAME
FROM EVENTS

ストアドプロシージャ

ストアドプロシージャの例も見てみよう。

CREATE PROCEDURE NEW_USER_INFO 
  (FIRST_NAME VARCHAR(100), LASTS_NAME VARCHAR(100))
  MODIFIES SQL DATA
  INSERT INTO USER_INFO 
    VALUES (DEFAULT, FIRST_NAME, LAST_NAME)

上記のストアドプロシージャは以下のようにして呼び出すことができる。

CALL NEW_USER_INFO('Naoki', 'Takezoe');

ここでは取り上げないが、ストアドファンクション/プロシージャはJavaで実装することも可能だ。複雑な処理や、外部リソースを使用するストアドを実装することができるだろう。

まとめ

HyperSQL 2.0は5年の開発期間を要しただけあり、新機能満載のリリースだ。HSQLDBはJavaにおける高速な組み込み/軽量データベースとして定評のあるプロダクトではあるが、近年はApache DerbyやH2など機能面で勝る競合プロダクトが多く登場し、それらの影にかくれがちだった面もある。今回のリリースによってHyperSQL 2.0が再び軽量Javaデータベースの主役に躍り出るかもしれない。