PostgreSQL の最低サポートバージョンを 10.0 に引き上げ

rails/rails

Rails の PostgreSQL アダプターが要求する最低バージョンが 9.3 から 10.0 に引き上げられました。これにより、PostgreSQL 18 との互換性が確保されるとともに、バージョン分岐のためのコードが整理されています。

背景

PostgreSQL 18 がキャンセルリクエストキーのフォーマットを変更したことで、Rails の既存テストが失敗するようになったことがこの変更の直接の引き金です。postgres/postgres の a460251 で導入された変更により、プロトコルバージョン 3.2 以降では 32 ビット固定だったキャンセルリクエストキーが最大 256 バイトの可変長に変更されました。この変更は総当たりによるクエリキャンセルへの耐性向上を目的としています。

この影響を受け、ActiveRecord::PostgresqlTransactionTest#test_raises_Interrupt_when_canceling_statement_via_interrupt が pg gem 1.5.9 と PostgreSQL 18 beta1 の組み合わせで失敗するようになりました。新しいキャンセル関数への対応は ged/ruby-pg#614PG::CancelConnection クラスとして実装され、pg gem v1.6.0 に含まれています。

一方、pg gem v1.6 は ged/ruby-pg#606 で PostgreSQL 9.x のサポートを打ち切り、最低サポートバージョンを 10 に引き上げました。Rails 側が引き続き 9.3 以上を宣言したままでは pg gem v1.6 との整合性が取れないため、Rails の最低サポートバージョンも 10.0 に揃える必要が生じました。

技術的な変更

バージョン条件分岐の削除と、それに伴う非推奨化の追加が変更の中心です。

バージョン条件分岐の削除として、postgresql_adapter.rb では database_version を参照していた複数のバージョンガードが true に置き換えられました。

変更前:

def supports_insert_on_conflict?
  database_version >= 9_05_00 # >= 9.5
end

def supports_identity_columns? # :nodoc:
  database_version >= 10_00_00 # >= 10.0
end

def supports_native_partitioning? # :nodoc:
  database_version >= 10_00_00 # >= 10.0
end

変更後:

def supports_insert_on_conflict?
  true
end

def supports_identity_columns? # :nodoc:
  true
end

def supports_native_partitioning? # :nodoc:
  true
end

同様に schema_statements.rb では、シーケンスの最小値取得クエリでバージョンによって pg_sequence ビューと min_value カラムを切り替えていた分岐が削除され、PostgreSQL 10 以降の pg_sequence ビューを用いた書き方に一本化されました。また rename_enum_value メソッドでも「PostgreSQL 10 以降でのみサポート」という旨のガード節が不要になり削除されています。

非推奨化として、supports_pgcrypto_uuid? メソッドが非推奨になりました。pgcryptogen_random_uuid() を提供するのは PostgreSQL 9.4 以降であり、最低バージョンが 10.0 になった以上このメソッドは常に true を返すだけで実質的な意味を持たなくなるためです。

def supports_pgcrypto_uuid?
  true
end
deprecate :supports_pgcrypto_uuid?, deprecator: ActiveRecord.deprecator

テストコードでも同様の整理が行われています。uuid_test.rb では supports_pgcrypto_uuid? を参照していた条件分岐と uuid_function / uuid_default ヘルパーメソッドが削除され、gen_random_uuid() を直接使用するよう変更されました。また schema_test.rb では DROP COLUMN IF EXISTS が「9.X のみの構文」として避けられていたコメントが削除され、素直に使用するよう修正されています。

設計判断

バージョンガードを削除して定数 true を返す方式が採用されました。database_version >= N という条件を true に置き換えることで、サポートバージョンの実態をメソッドの戻り値から読み取りやすくしています。将来的に PostgreSQL 15 以降向けの分岐(例: supports_nulls_not_distinct? など)が残っている箇所は引き続きバージョンチェックを維持しており、変更の対象は最低バージョン引き上げで常時 true になるものに限定されています。

supports_pgcrypto_uuid? を即座に削除するのではなく 非推奨(deprecate) とした点も設計上の判断です。外部から呼び出しているコードとの後方互換性を一定期間維持しつつ、メソッド自体を段階的に廃止する方針が取られています。

まとめ

PostgreSQL 18 のプロトコル変更を起点に、Rails の PostgreSQL アダプターが要求する最低バージョンが 9.3 から 10.0 に引き上げられました。バージョン条件分岐の撤廃により、アダプターのコードはシンプルになり、pg gem v1.6 との依存関係の整合性も確保されています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
f61eafac

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→ 背景・技術詳細(各論)→ まとめ(結論)の3部構成が明確です。必須要素であるリード文、背景、技術的な変更がすべて含まれており、設計判断セクションも設けられているため、構成として非常に優れています。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```言語:ファイルパス)や、コミットID、外部PRへのリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

PostgreSQLアダプター、pg gem、バージョンガードといった専門用語を前提知識として扱っており、専門のエンジニアという対象読者に適合した内容になっています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフがトピックセンテンスで始まり、1段落1トピックの原則が守られています。これにより、見出しと各段落の1文目を追うだけで概要を把握できる高い可読性を実現しています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているコードブロック(変更前・変更後)や、`schema_statements.rb`、テストコードに関する説明は、提供されたDiffの内容と完全に一致しています。コードの引用は正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「キャンセルリクエストキー」「バージョンガード」「非推奨化(deprecate)」などの技術用語が、PRの文脈と一般的な用法の両方において正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

PostgreSQL 18の変更が根本的な原因であること、pg gemのバージョンアップに追随する必要があったことなど、変更の連鎖的な背景が技術的に正確かつ論理的に説明されています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の主張はすべて、PRのTitle, Description, Diff, またはPRが参照するコミットリンクで裏付けられています。ハルシネーション(捏造)は見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#55282)、PostgreSQLのバージョン(10.0, 9.3, 18)、コミットID(a460251)など、記事に含まれる数値や固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「PostgreSQL の最低サポートバージョンを 10.0 に引き上げ」は、PRのタイトル「Bump required PostgreSQL version to 10.0」と完全に一致しており、内容を的確に表しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

「総当たりによるクエリキャンセルへの耐性向上」という目的はPRに直接記載がありませんが、PRが参照するpostgres/postgresのコミットメッセージに基づいています。PR情報にない外部知識の無断追加ではなく、提供された情報源に基づく深掘りであり、許容範囲です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

pg gem v1.6.0が「upcoming」であるというPRのニュアンスを「含まれています」と表現していますが、リリース候補版が出ている状況を鑑みると、事実に反する歪曲ではなく、許容できる表現です。