Project

General

Profile

Actions

Bug(バグ) #4131

closed

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

Added by Youichi Kimura almost 8 years ago. Updated almost 5 years ago.

Status:
Fixed(完了)
Priority:
Normal(通常)
Assignee:
Target version:
Start date:
2020-01-29
Due date:
% Done:

100%

Estimated time:
(Total: 0:00 h)
3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Yes (はい)

Description

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


Subtasks 2 (0 open2 closed)

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

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

Actions
Actions #1

Updated by Youichi Kimura almost 8 years ago

  • Status changed from New(新規) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

下記 Pull Request にて修正しました
https://github.com/openpne/OpenPNE3/pull/432

なお、残念ながらこのバグを修正しても #3135 は直りません

Actions #2

Updated by Youichi Kimura almost 8 years ago

  • Description updated (diff)
Actions #3

Updated by kaoru n over 7 years ago

  • Status changed from Pending Review(レビュー待ち) to Rejected(差し戻し)
  • Target version changed from OpenPNE 3.9.0-old to OpenPNE 3.9.0

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

Actions #4

Updated by kaoru n almost 5 years ago

  • Target version changed from OpenPNE 3.9.0 to OpenPNE 3.10.x
Actions #5

Updated by kaoru n almost 5 years ago

  • Status changed from Rejected(差し戻し) to Pending Review(レビュー待ち)

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

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

Actions #6

Updated by kaoru n almost 5 years ago

  • Assignee changed from Youichi Kimura to kaoru n
Actions #7

Updated by Rimpei Ogawa almost 5 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70
Actions #8

Updated by kaoru n almost 5 years ago

  • Target version changed from OpenPNE 3.10.x to OpenPNE 3.9.8
Actions #9

Updated by kaoru n almost 5 years ago

  • Target version changed from OpenPNE 3.9.8 to OpenPNE 3.10.0
Actions #10

Updated by isao sano almost 5 years ago

  • Status changed from Pending Testing(テスト待ち) to Pending Merge(マージ待ち)
  • % Done changed from 70 to 80

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

Actions #11

Updated by kaoru n almost 5 years ago

  • Status changed from Pending Merge(マージ待ち) to Fixed(完了)
  • % Done changed from 80 to 100

マージしました

Actions

Also available in: Atom PDF