Column#hashメソッドで誤ったインスタンス変数を参照していた問題を修正
PostgreSQLとSQLite3のColumnクラスにおいて、#hashメソッドが存在しないインスタンス変数を参照していた問題が修正されました。この変更により、Columnオブジェクトのハッシュ値計算が正しく動作するようになります。
背景
#56801で#hashメソッドの実装が改善された際、PostgreSQLとSQLite3のColumnクラスにおいて、ハッシュ値の計算に使用するインスタンス変数の指定に誤りが生じていました。PostgreSQLのColumnクラスでは@virtual、SQLite3のColumnクラスでは@virtualという、実際には定義されていないインスタンス変数が参照されていました。
この問題は、ハッシュ値の計算時にnilが含まれることになり、Columnオブジェクトの一意性判定に影響を与える可能性がありました。
技術的な変更
PostgreSQL Columnクラス:
activerecord/lib/active_record/connection_adapters/postgresql/column.rbにおいて、@virtualを@generatedに修正しました。
変更前:
def hash
[
super,
@identity,
@serial,
@virtual,
].hash
end
変更後:
def hash
[
super,
@identity,
@serial,
@generated,
].hash
end
SQLite3 Columnクラス:
activerecord/lib/active_record/connection_adapters/sqlite3/column.rbにおいて、@virtualを@generated_typeに修正しました。
変更前:
def hash
[
super,
@auto_increment,
@rowid,
@virtual,
].hash
end
変更後:
def hash
[
super,
@auto_increment,
@rowid,
@generated_type,
].hash
end
PostgreSQLでは@generated、SQLite3では@generated_typeが、それぞれのColumnクラスで実際に定義されているインスタンス変数です。
設計判断
この修正は、各データベースアダプタのColumnクラスが保持する固有の属性を正しく反映させるものです。PostgreSQLの@generatedはGENERATED列の情報を、SQLite3の@generated_typeはGENERATED列のタイプ(STORED/VIRTUAL)を表します。
#56801で導入されたRuby 3.2以降の最適化(配列割り当ての回避)を活用しつつ、各アダプタ固有の属性を正確にハッシュ値計算に含めることで、Columnオブジェクトの同一性判定が正しく機能します。
まとめ
本PRは、#hashメソッドの実装改善時に混入したインスタンス変数の参照ミスを修正したものです。存在しない変数を参照していた箇所を、各データベースアダプタで実際に定義されている変数に置き換えることで、Columnオブジェクトのハッシュ値計算の正確性を回復しています。