Fixed query cache id generation: added platform to hash #1075

Merged
merged 2 commits into from Jun 27, 2014

Projects

None yet

3 participants

@vilartoni

There's an issue with the query cache id generation in Doctrine\ORM\Query::_getQueryCacheId().

If you happen to use different connections to different platforms on the same project and you're using the query cache, you will get an exception the moment you try to execute a query which SQL is different depending on the platform and it has been previously cached for the other platform, as they will share the same cache id.

In order to reproduce the bug it is sufficient with using the Doctrine Paginator in a query:

$query = $queryBuilder->setFirstResult(0)
    ->setMaxResults(50)
    ->getQuery()
    ->getResult();

If we run the query for the first time with an empty cache in an Oracle connection and later on we try to run the same query in a MySQL connection, we get the following exception:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ROWNUM' in 'where clause'

As it's trying to execute the SQL for Oracle in the MySQL connection due to the same cache id.

This issue can be easily fixed just by taking the platform type into account in the cache id generation.

@doctrinebot

Hello,

thank you for creating this pull request. I have automatically opened an issue
on our Jira Bug Tracker for you. See the issue link:

http://www.doctrine-project.org/jira/browse/DDC-3198

We use Jira to track the state of pull requests and the versions they got
included in.

@Ocramius
Doctrine member

@vilartoni are you using the same cache across different connections on purpose?

@vilartoni

@Ocramius Yes. We're using a common cache server for all cached queries.

@Ocramius
Doctrine member

Can you check if the travis failure here is related to your change?

@vilartoni

Sure. I'd say it is not. It's something to do with the MOD() dql function failing in postgresql.

@Ocramius
Doctrine member

restarted that worker

@vilartoni

All green.

@Ocramius Ocramius self-assigned this Jun 27, 2014
@Ocramius Ocramius commented on an outdated diff Jun 27, 2014
lib/Doctrine/ORM/Query.php
return md5(
- $this->getDql() . serialize($this->_hints) .
+ $this->getDql() . serialize($this->_hints) . $platform .
@Ocramius
Ocramius Jun 27, 2014

Could you add it as a new line and use &platform=? Looking good otherwise.

@Ocramius Ocramius merged commit c370426 into doctrine:master Jun 27, 2014

1 check was pending

Details continuous-integration/travis-ci The Travis CI build is in progress
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment