Active RecordのPostgreSQL最小バージョン要件を9.3から9.5に引き上げ
#55654で導入されたarray_position関数の使用により、PostgreSQLの実質的な最小要件が9.5に上昇していたため、バージョンチェックとドキュメントをその実態に合わせて修正しました。
背景
Active RecordのPostgreSQLアダプターには、接続時にデータベースバージョンを検証する仕組みが備わっていますが、コードが依存するPostgreSQL機能の要件とチェック基準が乖離していました。コミット c93d1b0(#55654)でプライマリキー取得の最適化が行われた際、PostgreSQL 9.5で追加された array_position 関数が利用されるようになりました。しかし、バージョンチェックのしきい値は9.3のままでした。
この状態では、9.3〜9.4のPostgreSQLへの接続時にバージョンチェックを通過しながら、array_positionを含む処理で実行時エラーが発生するという矛盾が生じていました。本PRはこの不整合を解消します。
技術的な変更
変更の核心は check_version メソッドのしきい値更新です。postgresql_adapter.rb の1箇所と、ドキュメント3箇所が一括して修正されています。
変更前:
def check_version # :nodoc:
if database_version < 9_03_00 # < 9.3
raise "Your version of PostgreSQL (#{database_version}) is too old. Active Record supports PostgreSQL >= 9.3."
end
end
変更後:
def check_version # :nodoc:
if database_version < 9_05_00 # < 9.5
raise "Your version of PostgreSQL (#{database_version}) is too old. Active Record supports PostgreSQL >= 9.5."
end
end
ドキュメント側では、guides/source/active_record_postgresql.md、guides/source/command_line.md、および railties/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt(アプリ生成時のデータベース設定テンプレート)のバージョン表記がそれぞれ9.3から9.5に更新されています。これにより、新規プロジェクトの雛形ファイルにも正確な要件が反映されます。
設計判断
コードの実態に合わせてバリデーションを厳格化するという方針が採られました。
array_positionが導入された時点で最小バージョン要件も同時に引き上げるべきでしたが、#55654ではその対応が漏れていました。本PRはその後追い修正として、ランタイムエラーよりも早い接続確立フェーズで明示的なエラーを出す状態へと修正しています。コード変更はしきい値の数値のみであり、チェックロジック自体の変更はありません。
まとめ
本PRは、実際に依存している機能のバージョン要件とバリデーションのしきい値を一致させた整合性修正です。バージョンチェックは「使用している機能の最低要件を正確に反映すべき」という原則を示しており、機能追加時に依存する外部コンポーネントの要件更新を同時に行う重要性を改めて示す変更といえます。