操作
Bug(バグ) #4131
完了Doctrine_Query::execute() の $params に応じて WHERE ... IN の要素数が変化する場合にクエリキャッシュが対応できていない
開始日:
2020-01-29
期日:
進捗率:
100%
予定工数:
(合計: 0:00時間)
3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Yes (はい)
説明
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
を書き換えることで対処する。
Youichi Kimura さんがほぼ8年前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
下記 Pull Request にて修正しました
https://github.com/openpne/OpenPNE3/pull/432
なお、残念ながらこのバグを修正しても #3135 は直りません
kaoru n さんがほぼ5年前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
master 向けにプルリクエスト作成しました。
https://github.com/openpne/OpenPNE3/pull/559
https://github.com/openpne/OpenPNE3/pull/432
については、close します。
Rimpei Ogawa さんが4年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
操作