From 550fcbc17fc9d927edf34bd0e5f9efc3b68ce344 Mon Sep 17 00:00:00 2001 From: Guilherme Blanco Date: Sun, 3 Jul 2011 01:48:18 -0300 Subject: [PATCH] [DDC-1237] Fixed issue with QueryBuilder where user may have includes nested complex expression in a string format while consuming a composite expression (AND or OR). --- lib/Doctrine/ORM/Query/Expr/Composite.php | 21 ++++++++++++++++--- tests/Doctrine/Tests/ORM/QueryBuilderTest.php | 11 ++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Query/Expr/Composite.php b/lib/Doctrine/ORM/Query/Expr/Composite.php index 97c15e64b..0d606a9b0 100644 --- a/lib/Doctrine/ORM/Query/Expr/Composite.php +++ b/lib/Doctrine/ORM/Query/Expr/Composite.php @@ -43,11 +43,26 @@ class Composite extends Base $components = array(); foreach ($this->_parts as $part) { - $components[] = (is_object($part) && $part instanceof self && $part->count() > 1) - ? $this->_preSeparator . ((string) $part) . $this->_postSeparator - : ((string) $part); + $components[] = $this->processQueryPart($part); } return implode($this->_separator, $components); } + + + private function processQueryPart($part) + { + $queryPart = (string) $part; + + if (is_object($part) && $part instanceof self && $part->count() > 1) { + return $this->_preSeparator . $queryPart . $this->_postSeparator; + } + + // Fixes DDC-1237: User may have added a where item containing nested expression (with "OR" or "AND") + if (mb_stripos($queryPart, ' OR ') !== false || mb_stripos($queryPart, ' AND ') !== false) { + return $this->_preSeparator . $queryPart . $this->_postSeparator; + } + + return $queryPart; + } } \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/QueryBuilderTest.php b/tests/Doctrine/Tests/ORM/QueryBuilderTest.php index 57eb82946..2b352bdce 100644 --- a/tests/Doctrine/Tests/ORM/QueryBuilderTest.php +++ b/tests/Doctrine/Tests/ORM/QueryBuilderTest.php @@ -197,6 +197,17 @@ class QueryBuilderTest extends \Doctrine\Tests\OrmTestCase $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE u.id = :uid'); } + + public function testComplexAndWhere() + { + $qb = $this->_em->createQueryBuilder() + ->select('u') + ->from('Doctrine\Tests\Models\CMS\CmsUser', 'u') + ->where('u.id = :uid OR u.id = :uid2 OR u.id = :uid3') + ->andWhere('u.name = :name'); + + $this->assertValidQueryBuilder($qb, 'SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u WHERE (u.id = :uid OR u.id = :uid2 OR u.id = :uid3) AND u.name = :name'); + } public function testAndWhere() {