Tsurugi 1.10.0 をリリースしました。

概要

Tsurugi 1.10.0 では、SQL関連の機能追加として、スカラーサブクエリー、EXISTS 演算子、IN 句内でのサブクエリーに対応しました。
これらの機能により、実用的なアプリケーション開発で求められる様々なクエリーをより幅広く記述できるようになります。

SQL機能追加ではこのほか、VALUES 句(テーブル構築式)の拡張、および FROM 句を省略した SELECT 文に対応しました。
これらの機能により、テーブルに依存しないデータを手軽に扱えるようになります。

また本バージョンではクライアントライブラリの拡充として、Python の標準的なデータベース接続 API である Python DB-API 2.0 (PEP 249) に対応した Tsurugi Python DB-API を公開しました。

Tsurugi Python DB-API を利用することによって、Python の豊富なデータ分析・処理エコシステムとの連携が容易になります。
標準的なデータベースの操作に加え、Tsurugi独自のトランザクションオプションにも対応しており、様々なTsurugi固有の機能も活用できます。

その他、本バージョンではいくつかの重要な不具合修正や安定性の向上を行っています。
前バージョンを利用するすべてのユーザーは本バージョンへのアップグレードを強く推奨します。

機能追加と改善

機能追加と改善 - SQL

  • スカラーサブクエリーに対応
    • スカラーサブクエリーは単一の値(単一の行かつ単一の列)を返すサブクエリーです。SELECT 句や WHERE 句など、単一の値(スカラー値)を記述できる場所であればどこでもサブクエリーを記述できるようになります。
      SELECT
        order_id,
        amount,
        amount - (SELECT AVG(amount) FROM orders) AS diff_from_average
      FROM orders
    • 本バージョンでは相関サブクエリーには対応していません。詳しくは後述の NOTE を参照してください。
  • EXISTS 演算子に対応
    • EXISTS 演算子は、サブクエリーの結果が1件以上存在するかどうかを判定するための演算子です。WHERE 句などでサブクエリーの存在を条件として記述できるようになります。
      SELECT
        order_id
      FROM
        orders
      WHERE
        EXISTS (
          SELECT *
          FROM warehouse_status
          WHERE is_open = TRUE
        )
    • 本バージョンでは相関サブクエリーには対応していません。詳しくは後述の NOTE を参照してください。
  • IN 句内でのサブクエリーに対応
    • IN 句内でサブクエリーを記述できるように対応しました。これにより、IN 句の条件としてサブクエリーの結果を利用できるようになります。
      SELECT
        order_id,
        amount
      FROM
        orders
      WHERE
        customer_id IN (
          SELECT customer_id
          FROM customers
          WHERE country_code = 'JP'
        )
    • 本バージョンでは相関サブクエリーには対応していません。詳しくは後述の NOTE を参照してください。
    • 本バージョンでは IN サブクエリーを OR 演算子のオペランドとして利用できない、 NOT IN  ALL 演算子内で利用できないなどの制約があります。詳しくは 後述の NOTE に記載するドキュメントを参照してください。
  • VALUES 句(テーブル構築式)の拡張
    • これまで、VALUES 句は INSERT 文の一部としてのみ利用可能でしたが、本バージョンで VALUES 句を任意の場所でテーブル構築式として利用できるように対応しました。
    • VALUES 句は単一の値や複数列、複数行の値を「テーブル」として返すことができます。これにより、テーブルを指定せずに任意のテーブルデータを返したり、関数やUDFを呼び出すことができるようになります。
      -- 単一の値を返す
      VALUES (1)
      
      -- 複数行・複数列を返す
      VALUES (1, 'hello', 100), (2, 'world', 200), (3, 'foo', 300)
      
      -- 関数を実行
      VALUES (CURRENT_TIMESTAMP)
      
      -- UDFを実行
      VALUES (Greeter('hello'))
    • ただし、通常の場合は次項の FROM 句を省略した SELECT 文のほうが自然に扱えるかもしれません。
  • FROM 句を省略した SELECT 文に対応
    • これまでは SELECT 文で必ず FROM 句を記述する必要がありましたが、本バージョンでは FROM 句を省略した SELECT 文をサポートしました。内部的には、FROM 句が省略された場合は、1行0列のテーブルを生成する VALUES 句を暗黙的に追加して実行されるようになっています。
      -- VALUES (1) と同等
      SELECT 1
      
      -- VALUES (Greeter('hello')) と同等
      SELECT Greeter('hello')

Note

SQL機能の詳細仕様や現時点での制約については、tsurugidbの以下のドキュメントを参照してください。

Note

本バージョンでは、サブクエリーから外部クエリーのカラムを参照する 相関サブクエリー には対応していません。
SELECT 句で使用するスカラーサブクエリーや EXISTS 演算子は相関サブクエリーとして利用するケースが多いのでご注意ください。

相関サブクエリーは Tsurugi 1.11.0 での対応を計画しています。

機能追加と改善 - Client

  • Tsurugi Python DB-API
    • Tsurugi Python DB-APIは、Pythonの標準的なデータベースAPIである Python DB-API 2.0 (PEP 249) に準拠したTsurugi用のクライアントライブラリです。標準的なデータベースの操作に加え、Tsurugi独自のトランザクションオプションにも対応しており、Tsurugiの様々な機能をPythonから利用できるようになります。
    • Tsurugi Python DB-API は 以下のドキュメントサイトでAPIリファレンスやユーザガイドなどを提供しています。
    • Tsurugi Python DB-API は PyPI で公開されています。

機能追加と改善 - UDF

  • ユーザー定義表値関数 (APPLY 演算子) の改善
    • ユーザー定義表値関数を実行するためのSQL拡張構文である APPLY 演算子を用いてユーザー定義表値関数を呼び出す際の、SQL実行時のスケジューリングの最適化を行いました。
    • SQL実行エンジンの内部で非同期的にスケジューリングを行うようにすることで、APPLY 実行中に他のジョブの処理がまれに停止してしまう問題を解消しました。特に負荷の高い処理や大容量データの処理時の安定性が大きく向上しています。
  • Tsurugi起動時のUDFプラグイン初期化処理時のバリデーション強化と安定化
    • Tsurugiの起動時に、複数のUDFプラグインをデプロイしている場合に生じることがある gRPC メソッド名の重複や message 名の重複といった、UDFプラグイン制約違反を事前に検出するバリデーション機能を追加しました。
    • これまでは上記の制約違反がある場合に Tsurugi が不正な状態で起動エラーになることがありました。本バージョンではその制約違反の内容に応じてUDFプラグインを全体もしくは個別に無効化することで、Tsurugiの起動処理を安定化しました。
      • この対応に伴い、UDFプラグインの構成定義ファイルに プロトコル定義ファイル ( .desc.pb ) が追加されており、これをデプロイする必要があります。詳細は以下のドキュメントを参照してください。
      • udf-plugin - UDF プラグインの構成
    • Tsurugi 1.9.0 以前のバージョンで生成したUDFプラグインは、Tsurugi 1.10.0 では利用できません。udf-plugin-builder を用いてUDFプラグインを再生成してデプロイする必要があります。

バグ修正

バグ修正 - SQL

  • GROUP BY 句や集計関数などによって集約したカラムに対する BETWEEN 演算子や IN 演算子などが不正なエラーとなることがある
  • トランザクション競合例外のメッセージに含まれるテーブル名がサロゲートIDとして表示される

バグ修正 - Transaction

  • OCCトランザクションのスキャン範囲に対して他のOCCトランザクションが INSERT を行った場合に、特定条件下でSerializableの違反を検出できずにコミットが成功してしまうことがある

アップグレードについて

クライアント互換性リスト

Tsurugi 1.10.0 では 以下のクライアントに対応しています。
Tsurugi のアップグレードに併せて、必要に応じて各クライアントをアップグレードしてください。

ClientVersion
Tsubakuro/Java1.13.0+
Iceaxe1.13.0+
Tanzawa1.13.0+
Tsubakuro/Rust0.7.0+
Tsurugi MCP Server0.5.0+
Tsurugi JDBC0.2.0+
Tsurugi UDF0.3.0+

Important

Tsurugi UDF については、udf-plugin-builder を用いてUDFプラグインを再生成してデプロイする必要があります。

アップグレード手順

旧バージョンからのアップグレード手順については、以下のドキュメントを参照してください。

その他

本バージョンにおける変更内容の一覧は、以下のChangelogを参照してください。

本バージョンに対する既知の問題、および本バージョンにて修正された問題の補足情報については、以下のリンクを参照してください。