Bug(バグ) #4131
Doctrine_Query::execute() の $params に応じて WHERE ... IN の要素数が変化する場合にクエリキャッシュが対応できていない
100%
説明
Overview (現象)¶
$query = Doctrine_Core::getTable('AdminUser')->createQuery()
->andWhere('id IN ?');
// (1) 生成されるクエリ: SELECT ... FROM admin_user a WHERE (a.id IN (?))
$query->execute(array(array(1)));
// (2) 生成されるクエリ: SELECT ... FROM admin_user a WHERE (a.id IN (?, ?))
$query->execute(array(array(1, 2)));
上記のコードを実行すると、(1) の状態で生成されたクエリキャッシュが (2) でも使用され、パラメーターの数が一致せず下記のエラーが発生する。
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
このような、Doctrine_Query::execute()
が呼び出されるまでプリペアドステートメントの形式が不定となる状況に Doctrine_Query_Abstract::calculateQueryCacheHash()
および opDoctrineQuery::calculateQueryCacheHash()
のいずれも対応できていない。
Way to fix (修正内容)¶
calculateQueryCacheHash()
メソッド内では execute()
メソッドに渡されたパラメータの値を参照する手段が存在しない。
そのため opDoctrineQuery クラスで Doctrine_Query::execute()
をオーバーライドし、渡されたパラメータに応じて一時的に $this->whereInCount
を書き換えることで対処する。
子チケット
関係しているリビジョン
fix query hash for caching consider to the number of placeholder will vary depending on the execute() params (fixes #4131)
履歴
#1 Youichi Kimura が約7年前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
下記 Pull Request にて修正しました
https://github.com/openpne/OpenPNE3/pull/432
なお、残念ながらこのバグを修正しても #3135 は直りません
#2 Youichi Kimura が約7年前に更新
- 説明 を更新 (diff)
#5 kaoru n が約4年前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
master 向けにプルリクエスト作成しました。
https://github.com/openpne/OpenPNE3/pull/559
https://github.com/openpne/OpenPNE3/pull/432
については、close します。
#7 Rimpei Ogawa が約4年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更