From 79d9c076521a0854f2e5139852c4b230f3815571 Mon Sep 17 00:00:00 2001 From: Benjamin Eberlei Date: Sun, 11 Mar 2012 22:28:57 +0100 Subject: [PATCH] [DDC-1693] Fix fatal errors in DQL when using Optimistic or None lock modes. Added tests. --- lib/Doctrine/ORM/Query/SqlWalker.php | 6 ++++-- .../Tests/ORM/Functional/Locking/LockTest.php | 19 +++++++++++++++++-- .../ORM/Query/SelectSqlGenerationTest.php | 14 ++++++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 9701f4718..3e2ed8dac 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -440,13 +440,15 @@ class SqlWalker implements TreeWalker $sql .= ' ' . $this->_platform->getWriteLockSQL(); break; - case LockMode::PESSIMISTIC_OPTIMISTIC: + case LockMode::OPTIMISTIC: foreach ($this->_selectedClasses AS $selectedClass) { - if ( ! $class->isVersioned) { + if ( ! $selectedClass['class']->isVersioned) { throw \Doctrine\ORM\OptimisticLockException::lockFailed($selectedClass['class']->name); } } break; + case LockMode::NONE: + break; default: throw \Doctrine\ORM\Query\QueryException::invalidLockMode(); diff --git a/tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php b/tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php index 62c787409..215580996 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/Locking/LockTest.php @@ -9,6 +9,9 @@ use Doctrine\Tests\Models\CMS\CmsArticle, require_once __DIR__ . '/../../../TestInit.php'; +/** + * @group locking + */ class LockTest extends \Doctrine\Tests\OrmFunctionalTestCase { protected function setUp() { $this->useModelSet('cms'); @@ -139,7 +142,6 @@ class LockTest extends \Doctrine\Tests\OrmFunctionalTestCase { /** * @group DDC-178 - * @group locking */ public function testLockPessimisticRead() { $readLockSql = $this->_em->getConnection()->getDatabasePlatform()->getReadLockSql(); @@ -166,4 +168,17 @@ class LockTest extends \Doctrine\Tests\OrmFunctionalTestCase { $query = array_pop( $this->_sqlLoggerStack->queries ); $this->assertContains($readLockSql, $query['sql']); } -} \ No newline at end of file + + /** + * @group DDC-1693 + */ + public function testLockOptimisticNonVersionedThrowsExceptionInDQL() + { + $dql = "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'"; + + $this->setExpectedException('Doctrine\ORM\OptimisticLockException', 'The optimistic lock on an entity failed.'); + $sql = $this->_em->createQuery($dql)->setHint( + \Doctrine\ORM\Query::HINT_LOCK_MODE, \Doctrine\DBAL\LockMode::OPTIMISTIC + )->getSQL(); + } +} diff --git a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php index fccfed03b..2bec9a562 100644 --- a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php +++ b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php @@ -908,6 +908,20 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase ); } + /** + * @group DDC-1693 + * @group locking + */ + public function testLockModeNoneQueryHint() + { + $this->assertSqlGeneration( + "SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.username = 'gblanco'", + "SELECT c0_.id AS id0, c0_.status AS status1, c0_.username AS username2, c0_.name AS name3 ". + "FROM cms_users c0_ WHERE c0_.username = 'gblanco'", + array(Query::HINT_LOCK_MODE => \Doctrine\DBAL\LockMode::NONE) + ); + } + /** * @group DDC-430 */