Trinoで2022年に追加された新機能を紹介します。他にも多くの機能が追加されていますがメジャーなものに絞りました。
Polymorphic table functionsは聞き慣れないかもしれませんが、スカラー関数とは違って複数の行や列を返却できる関数のことです。例: SELECT * FROM TABLE(my_function(1, 100));
テーブルを引数に取れないなど内部的にはまだ未実装の部分もありますが、クエリをパススルーする関数がJDBC系コネクター、Elasticsearch, BigQueryおよびMongoDBが実装しています。関数の性質上、クエリをリモートに実際に実行する前に結果のカラム名とタイプを取得する必要があります。JDBCはPrepared StatementでResultSetMetaDataから取得、Elasticserachは取得が難しいので現状は1カラム1レコードにJSONを詰め込む形の実装、BigQueryはクエリをdry runして取得、MongoDBは内部的に管理している_schemaコレクションから取得といった流れになっています。
JDBCコネクターを使用する人が多そうなのでもう少し内部的な実装を説明すると、ResultSetMetaDataを取得する必要があるのでDDLなどは基本的にはサポートされていません。"基本的には"と書いたのはJDBCドライバの実装依存だからです。DDLに関してはTable functionではなくProcedureで実装される予定です #12322。次に内部的には完全にパススルーしている訳ではなくSELECT * FROM (...) oのようにラップしています。そのため対象のデータベースが生成されたクエリを実行できない場合もあります。例えばSELECT * FROM (SHOW DATABASES) oなどはエラーになるDBが多いでしょう。これらはあくまでデフォルトの実装 (DefaultQueryBuilder)なのでコネクターを自身で開発されている方は適宜変更することも可能です。
関連リンク
元々JSON関連の関数は存在しましたがJSON pathがサポートされ、これまでよりシンプルに複雑なJSONを分析することが可能になりました。
JSON pathを使用したjson_exists関数の例を説明します。以下のようなテーブルがあったとします。
id | description
----+---------------------------------------------------
101 | {"comment" : "nice", "children" : [10, 13, 16]}
103 | {"comment" : "knows best", "children" : [2]}
102 | {"comment" : "problematic", "children" : [8, 11]}
childrenフィールドの配列内に10より大きい数が存在するかを確認するためにはlax $.children[*]?(@ > 10)というパスを使用できます。
SELECT
id,
json_exists(
description,
'lax $.children[*]?(@ > 10)'
) AS children_above_ten
FROM customers;
id | children_above_ten
----+--------------------
102 | true
103 | false
101 | true