プロジェクト

全般

プロフィール

Bug(バグ) #4131

Doctrine_Query::execute() の $params に応じて WHERE ... IN の要素数が変化する場合にクエリキャッシュが対応できていない

Youichi Kimura約7年前に追加. 約4年前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2020-01-29
期日:
進捗率:

100%

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 を書き換えることで対処する。


子チケット

Backport(バックポート) #4355: Doctrine_Query::execute() の $params に応じて WHERE ... IN の要素数が変化する場合にクエリキャッシュが対応できていないFixed(完了)kaoru n

Backport(バックポート) #4356: Doctrine_Query::execute() の $params に応じて WHERE ... IN の要素数が変化する場合にクエリキャッシュが対応できていないFixed(完了)kaoru n

関係しているリビジョン

リビジョン b145a803 (差分)
Youichi Kimura約4年前に追加

fix query hash for caching consider to the number of placeholder will vary depending on the execute() params (fixes #4131)

リビジョン a7453b68
kaoru n約4年前に追加

Merge pull request #559 from nishizoe/t-4131

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)

#3 kaoru nほぼ7年前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更
  • 対象バージョンOpenPNE 3.9.0-old から OpenPNE 3.9.0 に変更

対象バージョン変更により修正内容の確認が必要であるため差し戻します。

#4 kaoru n約4年前に更新

  • 対象バージョンOpenPNE 3.9.0 から OpenPNE 3.10.x に変更

#5 kaoru n約4年前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

master 向けにプルリクエスト作成しました。
https://github.com/openpne/OpenPNE3/pull/559

https://github.com/openpne/OpenPNE3/pull/432
については、close します。

#6 kaoru n約4年前に更新

  • 担当者Youichi Kimura から kaoru n に変更

#7 Rimpei Ogawa約4年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#8 kaoru n約4年前に更新

  • 対象バージョンOpenPNE 3.10.x から OpenPNE 3.9.8 に変更

#9 kaoru n約4年前に更新

  • 対象バージョンOpenPNE 3.9.8 から OpenPNE 3.10.0 に変更

#10 isao sano約4年前に更新

  • ステータスPending Testing(テスト待ち) から Pending Merge(マージ待ち) に変更
  • 進捗率70 から 80 に変更

試験完了です。問題ありません。

#11 kaoru n約4年前に更新

  • ステータスPending Merge(マージ待ち) から Fixed(完了) に変更
  • 進捗率80 から 100 に変更

マージしました

他の形式にエクスポート: Atom PDF