[アップデート] Amazon Aurora PostgreSQL 17.9 がリリースされたので、Babelfish 5.5 のアップデート内容を確認してみた
いわさです。
先日 Aurora PostgreSQL 17.9 がリリースされました。
前回リリースされたのが Aurora PostgreSQL 17.7 で今回は 17.9 です。17.8 がスキップされていますね。
背景として、2026 年 2 月 12 日に PostgreSQL 本体の 17.8 がリリースされたのですが、CVE-2026-2006 の修正に起因するリグレッションが発生していました。substring() 関数がマルチバイト(非 ASCII)テキスト値に対して不正にエラーを返す問題や、スタンバイが停止する問題です。
これに対処するために 2026 年 2 月 26 日に PostgreSQL 17.9 が定期スケジュール外でリリースされました。Aurora PostgreSQL は 17.8 をスキップして 17.9 を直接サポートする形となっています。以前 Aurora PostgreSQL 16.5 や 16.7 がスキップされた時と同じパターンですね。
実際にコンソールのバージョン選択を見ても、17.7 の次が 17.9 になっていて 17.8 は存在しません。

Aurora PostgreSQL 固有の改善としては、パッチバージョンアップグレード時のダウンタイム最小化や、データベース起動時の不要なストレージチェックポイントの修正、フェイルオーバー関連の安定性向上なども含まれています。
毎度のことですが、Aurora PostgreSQL の新しいバージョンがリリースされたということは Babelfish バージョンも最新のものがあわせてリリースされています。
前回も Aurora PostgreSQL リリース時に Babelfish の最新状況を確認していたので今回も確認してみます。
バージョン確認
まずは Babelfish のバージョン確認から行います。ここは psql から確認します。
% psql -h hoge0409aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -d babelfish_db
Password for user postgres:
psql (14.15 (Homebrew), server 17.9)
WARNING: psql major version 14, server major version 17.
Some psql features might not work.
Type "help" for help.
babelfish_db=> SELECT aurora_version() AS aurora_version, version() AS postgresql_version, sys.version() AS Babelfish_compatibility, sys.SERVERPROPERTY('BabelfishVersion') AS Babelfish_Version;
aurora_version | postgresql_version | babelfish_compatibility | babelfish_version
----------------+--------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------+-------------------
17.9.0 | PostgreSQL 17.9 on aarch64-unknown-linux-gnu, compiled by aarch64-unknown-linux-gnu-gcc (GCC) 10.5.0, 64-bit | Babelfish for Aurora PostgreSQL with SQL Server Compatibility - 12.0.2000.8+| 5.5.0
| | Mar 18 2026 22:03:13 +|
| | Copyright (c) Amazon Web Services +|
| | PostgreSQL 17.9 on aarch64-unknown-linux-gnu (Babelfish 5.5.0) |
(1 row)
Babelfish バージョンは 5.5.0 ですね。互換性は SQL Server Compatibility - 12.0.2000.8+(SQL Server 2014)のままです。ここはずっと変わらなそうです。
新機能を確認
では Babelfish 5.5.0 で新しく使えるようになった機能を確認してみましょう。
Babelfish のリリースノートは以下です。ここを見るとバージョンごとにどういう機能が追加されるようになったのか確認できます。
今回の新機能は以下の 3 つです。
- geography/geometry データタイプで Polygon インスタンスがサポート
- (n)varchar/(n)char から datetimeoffset データタイプへの暗黙キャストがサポート
- sys.fn_varbintohexstr システムオブジェクトがサポート
また、セキュリティ面では Babelfish のクロスデータベースクエリでダイナミックデータマスキングポリシーが適用されるようになっています。
そのほか、安定性やバグ修正も多く含まれています。datetimeoffset 関連の UNION クエリの戻り値データタイプの修正、binary/varbinary の比較演算子のインデックススキャンの修正、MONEY/SMALLMONEY 型の変換に関する修正など、細かいですが実運用で遭遇しそうな修正が入っていますね。
今回は SQL Server からの移行時に互換性として気になるポイントとして、varchar から datetimeoffset への暗黙キャストを中心に確認してみます。
varchar から datetimeoffset への暗黙キャスト
SQL Server では文字列型(varchar や nvarchar)から datetimeoffset 型への暗黙的な変換が当たり前のように動作します。例えば COALESCE で datetimeoffset 型のカラムが NULL だった場合に varchar のフォールバック値を返すようなケースです。
SQL Server を使っている方からすると意識すらしないレベルの話なのですが、これまでの Babelfish ではこの暗黙キャストが一部サポートされておらず、COALESCE などの関数内で varchar から datetimeoffset への変換が必要な場面でエラーになっていました。
実際に Babelfish 5.4(Aurora PostgreSQL 17.7)と Babelfish 5.5(Aurora PostgreSQL 17.9)で比較してみましょう。
まず、datetimeoffset 型のカラムと varchar 型のカラムを持つテーブルを作成し、COALESCE で組み合わせてみます。
1> CREATE TABLE DtoTest (id INT, dto DATETIMEOFFSET NULL, fallback_str VARCHAR(50));
2> go
1> INSERT INTO DtoTest VALUES (1, NULL, '2026-04-09 10:00:00 +09:00');
2> INSERT INTO DtoTest VALUES (2, '2026-04-09 14:30:00 +09:00', '2026-04-09 23:00:00 +09:00');
3> go
dto カラムが NULL の場合に fallback_str の値を使いたいので、COALESCE で書きます。SQL Server では何の問題もなく動くクエリです。
Babelfish 5.4(Aurora PostgreSQL 17.7)の場合
1> SELECT id, COALESCE(dto, fallback_str) AS result FROM DtoTest ORDER BY id;
2> go
Msg 33557097, Level 16, State 1, Server hoge0409aurora2-instance-1, Line 1
COALESCE could not convert type "varchar" to datetimeoffset
エラーになりました。COALESCE 内で varchar から datetimeoffset への暗黙キャストが効かないため、型の不一致でエラーになっています。
5.4 以前ではこのようなクエリを動かすには COALESCE(dto, CAST(fallback_str AS DATETIMEOFFSET)) のように明示的な CAST を入れる必要がありました。
Babelfish 5.5(Aurora PostgreSQL 17.9)の場合
1> SELECT id, COALESCE(dto, fallback_str) AS result FROM DtoTest ORDER BY id;
2> go
id result
----------- --------------------------------------------------
1 2026-04-09 10:00:00 +09:00
2 2026-04-09 14:30:00 +09:00
(2 rows affected)
5.5.0 では暗黙キャストが効いて、CAST なしでそのまま動くようになりました。id=1 は dto が NULL なので fallback_str の値が、id=2 は dto の値がそれぞれ返されています。
変数を使ったパターンも確認してみます。
1> DECLARE @dto DATETIMEOFFSET = NULL;
2> SELECT COALESCE(@dto, '2026-04-09 10:00:00 +09:00') AS result;
3> go
result
--------------------------------------------------
2026-04-09 10:00:00 +09:00
(1 rows affected)
こちらも問題なく動作しています。
go-sqlcmd 1.9.0 で Babelfish 5.5 に接続するとエラーになった
今回の検証中にハマったのですが、go-sqlcmd(Microsoft の新しい sqlcmd)1.9.0 で Babelfish 5.5 に接続すると、SELECT 1 のような単純なクエリでも TDS プロトコルのエラーが発生しました。
% sqlcmd --version
sqlcmd: Install/Create/Query SQL Server, Azure SQL, and Tools
Version: 1.9.0
% sqlcmd -S hoge0409aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -N -C -Q "SELECT 1 AS test;"
test
-----------
Invalid TDS stream: unknown token type returned: token(165)
Babelfish 5.4(Aurora PostgreSQL 17.7)では同じ go-sqlcmd 1.9.0 で問題なく接続できていました。
% sqlcmd -S hoge0409aurora2.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -N -C -Q "SELECT 1 AS test;"
test
-----------
1
(1 row affected)
今回は Python の pymssql ライブラリに切り替えることで検証を進めることができました。
% pip3 install pymssql
import pymssql
conn = pymssql.connect(
server='hoge0409aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com',
user='postgres', password='xxxxxx', database='master',
tds_version='7.4', encryption='require'
)
cur = conn.cursor()
cur.execute("SELECT 1 AS test")
print(cur.fetchone())
# (1,)
pymssql は内部で FreeTDS を使っているのですが、こちらでは問題なく接続できました。
Babelfish 5.5 で go-sqlcmd を使おうとしてエラーになった場合は、pymssql や ODBC ベースの旧 sqlcmd(mssql-tools18)を試してみてください。
こういうパターンもあるんだなぁ。
さいごに
本日は Amazon Aurora PostgreSQL 17.9 がリリースされたので、Babelfish 5.5 のアップデート内容を確認してみました。
SQL Server からの移行を考えると、datetimeoffset を使っているアプリケーションは結構あるのではと思います。CAST なしで動くようになったのは移行時のクエリ書き換え箇所が減って結構嬉しい気がしますね。
細かいアップデートですが、こういう互換性改善よって少しづつ移行しやすくなっていると思います。






