[アップデート] Amazon Aurora PostgreSQL 18.6 がリリースされたので、Babelfish 6.2 のアップデート内容を確認してみた
いわさです。
先日 Aurora PostgreSQL 18.6 がリリースされました。
今回も PostgreSQL 18.6, 17.11, 16.15, 15.19, 14.24 が同時にリリースされていて、CVE 対応やバグ修正を含むため早めのアップグレードが推奨されています。
毎度のことですが、Aurora PostgreSQL の新しいバージョンがリリースされたということは Babelfish バージョンも最新のものがあわせてリリースされています。
コンソールのバージョン選択はこんな感じ。

前回は 18.4 のときに Babelfish 6.1.0 を確認していたので、今回も同じ感じで確認してみます。
バージョン確認
まずは Babelfish のバージョン確認から行います。ここは psql から確認します。
% PGGSSENCMODE=disable psql "host=xxxxxxxx.cluster-xxxxxxxx.ap-northeast-1.rds.amazonaws.com port=5432 dbname=babelfish_db user=postgres sslmode=verify-full sslrootcert=/tmp/rds-global-bundle.pem" -c \
"SELECT aurora_version() AS aurora_version, sys.SERVERPROPERTY('BabelfishVersion') AS bbf_version;"
aurora_version | bbf_version
----------------+-------------
18.6.0 | 6.2.0
(1 row)
Babelfish バージョンは 6.2.0 ですね。今回も Graviton (aarch64) インスタンスで確認しています。
T-SQL の確認は SQL Server 互換の TDS ポート 1433 側に sqlcmd で接続して行っています。
新機能を確認
Babelfish 6.2.0 の新機能はリリースノートで確認できます。ここを見るとバージョンごとにどういう機能が追加されるようになったのか確認できます。
今回の新機能は FOR XML AUTO モードと XML の .query() メソッド、MultiLinestring インスタンスと空間インデックス、Aurora レプリカ上のローカル一時テーブル、相関集約サブクエリ変換の4つです。
このうち今回は試しやすい XML まわりと空間データまわりの2つを見てみます。
FOR XML AUTO と .query() を試す
前回の 6.1 では FOR XML の RAW / PATH で ELEMENTS ディレクティブが使えるようになりました。今回の AUTO モードは、SELECT の FROM に指定したテーブル(別名)を要素名にして XML を組み立てるモードです。
まず検証用のテーブルを用意します。
CREATE TABLE dbo.Dept (DeptID INT, DeptName NVARCHAR(50));
INSERT INTO dbo.Dept VALUES (10,'Eng'),(20,'Sales');
CREATE TABLE dbo.Emp (EmpID INT, EmpName NVARCHAR(50), DeptID INT);
INSERT INTO dbo.Emp VALUES (1,'Tanaka',10),(2,'Suzuki',20),(3,'Sato',10);
2 つのテーブルを結合して FOR XML AUTO を付けてみます。
1> SELECT d.DeptName, e.EmpName FROM dbo.Dept d JOIN dbo.Emp e ON d.DeptID=e.DeptID ORDER BY d.DeptName FOR XML AUTO;
2> go
xml
----------------------------------------------------------------
<d DeptName="Eng"><e EmpName="Tanaka"/><e EmpName="Sato"/></d><d DeptName="Sales"><e EmpName="Suzuki"/></d>
部署(<d>)の下に従業員(<e>)がぶら下がる階層になりました。
前回の RAW / PATH では自分で要素名を指定して並列に出力していましたが、AUTO では結合の親子関係に応じた入れ子の XML になります。
次に .query() メソッドを試します。
XML データ型に XPath(XML の階層をパスで指定する記法)を渡して、一致した部分を取り出すメソッドです。
1> DECLARE @x XML = '<Emps><Emp id="1"><Name>Tanaka</Name></Emp><Emp id="2"><Name>Suzuki</Name></Emp></Emps>';
2> SELECT @x.query('/Emps/Emp') AS result;
3> go
result
----------------------------------------------------------------
<Emp id="1"><Name>Tanaka</Name></Emp><Emp id="2"><Name>Suzuki</Name></Emp>
XPath で指定した Emp 要素がまとめて取り出せました。
先ほどの FOR XML AUTO の出力を XML 変数に入れて .query() で絞り込むこともできます。
ただし FOR XML AUTO の出力は複数のルート要素を持つフラグメントなので、そのまま XML 変数に代入するとエラーになりました。
1> DECLARE @x XML = (SELECT DeptName FROM dbo.Dept FOR XML AUTO);
2> go
Msg 33557097, Level 16, State 1, Server xxxxxxxx, Line 1
could not parse XML document
.query() は単一のルート要素を持つ XML でないと扱えないようなので、ROOT を付けて1つの要素で包むと代入でき、絞り込めました。
1> DECLARE @x XML = (SELECT DeptID, DeptName FROM dbo.Dept FOR XML AUTO, ROOT('root'));
2> SELECT @x.query('/root/Dept[@DeptID="10"]') AS picked;
3> go
picked
----------------------------------------------------------------
<Dept DeptID="10" DeptName="Eng"/>
MultiLinestring と空間インデックスを試す
空間データは前回の 6.1 で Multipoint がサポートされ、今回は MultiLinestring と空間インデックスが追加されています。
MultiLinestring は複数の線分(LineString)をまとめて1つのジオメトリとして扱う型です。
まず WKT(図形を文字列で表す記法)から MultiLinestring を生成して、型名とメソッドを確認します。
1> DECLARE @g geometry = geometry::STGeomFromText('MULTILINESTRING((0 0, 1 1, 2 2),(10 10, 20 20))', 0);
2> SELECT @g.STGeometryType() AS GeometryType, @g.STNumPoints() AS NumPoints;
3> go
GeometryType NumPoints
--------------------------- -----------
MultiLineString 5
型名は MultiLineString、ポイント数の合計も取得できました。
STAsText() など基本的な検査系のメソッドも動作します。
一方で、コレクションを分解する系のメソッドはエラーになりました。
STNumGeometries()(含まれる線分の数)、STLength()(全長)、STGeometryN()(N 番目の線分)を呼ぶと、いずれも同じエラーが返ります。
1> DECLARE @g geometry = geometry::STGeomFromText('MULTILINESTRING((0 0, 1 1, 2 2),(10 10, 20 20))', 0);
2> SELECT @g.STNumGeometries();
3> go
Msg 33557097, Level 16, State 1, Server xxxxxxxx, Line 1
schema "@g" does not exist
うーむ、メソッドとして解決されずに @g をスキーマ名として扱おうとしているようなエラーです。
MultiLinestring の型自体は作れて基本的な検査系のメソッドは動くものの、コレクションを分解する系のメソッドはまだ扱えないみたいです。
続いて空間インデックスです。
geometry 型の列を持つテーブルに CREATE SPATIAL INDEX を実行します。
1> CREATE TABLE dbo.Routes (id INT PRIMARY KEY, geom geometry);
2> INSERT INTO dbo.Routes VALUES (1, geometry::STGeomFromText('LINESTRING(0 0, 5 5)', 0));
3> INSERT INTO dbo.Routes VALUES (2, geometry::STGeomFromText('LINESTRING(10 10, 20 20)', 0));
4> CREATE SPATIAL INDEX SIdx_Routes ON dbo.Routes(geom);
5> go
エラーなく空間インデックスを作成できました。
以前はこの構文はエラーになっていたので、SQL Server で geometry 列に空間インデックスを張っているスキーマも、同じ定義のまま持っていけそうです。
さいごに
本日は Amazon Aurora PostgreSQL 18.6 がリリースされたので、Babelfish 6.2 のアップデート内容を確認してみました。
FOR XML AUTO と XML の .query() メソッドが使えるようになったのと、空間データで MultiLinestring の型と空間インデックスがサポートされたのが今回の目玉です。
空間データは STLength() や STNumGeometries() など一部のメソッドはまだエラーになったので、移行前にアプリで使っているメソッドがサポート済みかは確認しておいた方がよさそうです。
リリースノートを確認すると新機能のほかにもクラッシュ修正や性能改善が多数含まれているので、Babelfish をお使いの方はバージョンアップしてみてください。







