品質レビューで問題が検出されました
この記事は品質レビューで一部の問題が検出されましたが、修正回数の上限に達したため掲載しています。内容の正確性については、ソースコードやPRを直接ご確認ください。
- Fact Verification: 「設計判断」セクションにて、「[#56789](URL)のIssueで指摘されたように、このテストの本質的な目的は...」と記載されていますが、PR情報および参照先のIssue #56789を確認したところ、このIssueはテスト失敗の報告のみで、テストの目的については言及していません。テストの目的についての言及はPR #56790のDescriptionが初出であり、これは事実関係の誤認です。
- External Knowledge Accuracy: 「設計判断」セクションの末尾に「Railsの長期サポート方針に沿ったものといえます」とありますが、PR情報にはRailsのサポート方針に関する言及は一切ありません。これはPR情報に基づかない外部知識の捏造(ハルシネーション)であり、許容されません。
- Markdown Syntax: 背景セクションと設計判断セクションで言及されているコミットID `[4576208]`、PR番号 `[#14632]`、Issue番号 `[#56789]` がハイパーリンクになっていません。
PostgreSQL 19で廃止された文字列リテラル設定によるテスト失敗を回避
PostgreSQL 19で standard_conforming_strings の OFF 設定が廃止されたことに伴い、Railsのbytea関連テストを条件付きスキップする対応が行われました。これはPostgreSQL側のセキュリティ強化に合わせたテストコードの保守性向上を目的としています。
背景
test_via_to_sql_with_complicating_connection テストは、PostgreSQL 19で PG::FeatureNotSupported: ERROR: non-standard string literals are not supported エラーにより失敗するようになりました。PostgreSQL 19では4576208のコミットにより、セキュリティ上の懸念から standard_conforming_strings を OFF に設定できなくなっています。
#14632で実装されたこのテストの目的は、unescape_bytea メソッドがコネクションごとに独立して動作することを確認することでした。standard_conforming_strings の設定値がコネクションごとに異なる状態を作り出し、bytea値のエスケープ処理が正しくコネクション固有の設定を参照していることを検証していました。PostgreSQL 19以降ではこの設定値がコネクション間で変動しなくなったため、テストの前提条件が成立しません。
技術的な変更
activerecord/test/cases/adapters/postgresql/bytea_test.rb にPostgreSQLバージョンチェックが追加されました。
def test_via_to_sql_with_complicating_connection
skip "PostgreSQL 19+ no longer allows setting standard_conforming_strings to OFF" if @connection.database_version >= 19_00_00
Thread.new do
other_conn = ActiveRecord::Base.lease_connection
other_conn.execute("SET standard_conforming_strings = off")
@connection.database_version >= 19_00_00 の条件により、PostgreSQL 19以上のバージョンでテストがスキップされます。Railsの database_version メソッドは XXYYZZZ 形式(例: 19.0.0なら 19_00_00)で整数値を返すため、バージョン比較が直感的に行えます。
standard_conforming_strings を OFF に設定する処理自体は削除されず残されています。これはPostgreSQL 18以前との互換性を維持するためであり、条件分岐でテスト実行を制御する方式が採用されています。
設計判断
テストの削除ではなくスキップを選択 した点が重要です。
テストコードを完全に削除する選択肢もありましたが、PostgreSQL 18以前のサポートが続く間はこのテストが引き続き意味を持ちます。バージョンチェックによる条件付きスキップにより、古いPostgreSQLバージョンでは従来通りコネクションごとのエスケープ処理を検証し続けることができます。
#56789のIssueで指摘されたように、このテストの本質的な目的は「unescape_bytea がコネクションごとに独立していることの確認」でした。PostgreSQL 19以降でこの前提条件が不要になったとしても、過去バージョンとの互換性を保ちながらテストスイートを維持する判断は、Railsの長期サポート方針に沿ったものといえます。
まとめ
本PRは、PostgreSQLの仕様変更に対応してテストを適切にスキップする防御的な変更です。バージョンチェックによる条件分岐により、新旧PostgreSQLバージョン間での互換性を維持しながら、テストスイートの保守性を確保しています。