From a86038b484c813e9b65015d88f465e5e2f835711 Mon Sep 17 00:00:00 2001 From: Guilherme Blanco Date: Wed, 21 Sep 2011 17:30:45 -0300 Subject: [PATCH] Fixed issue with CaseExpression not working in Subselects. --- lib/Doctrine/ORM/Query/Parser.php | 1 + lib/Doctrine/ORM/Query/SqlWalker.php | 19 +++++++++++ .../ORM/Query/SelectSqlGenerationTest.php | 32 +++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/lib/Doctrine/ORM/Query/Parser.php b/lib/Doctrine/ORM/Query/Parser.php index 5083bf5af..d5b57a00d 100644 --- a/lib/Doctrine/ORM/Query/Parser.php +++ b/lib/Doctrine/ORM/Query/Parser.php @@ -1696,6 +1696,7 @@ class Parser return $this->CoalesceExpression(); case Lexer::T_CASE: + $this->_lexer->resetPeek(); $peek = $this->_lexer->peek(); return ($peek['type'] === Lexer::T_WHEN) diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index d78d1d134..77e5d5faa 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -1316,6 +1316,25 @@ class SqlWalker implements TreeWalker $columnAlias = 'sclr' . $this->_aliasCounter++; $sql .= $this->walkSimpleArithmeticExpression($expr) . ' AS ' . $columnAlias; $this->_scalarResultAliasMap[$alias] = $columnAlias; + } else if ( + $expr instanceof AST\NullIfExpression || + $expr instanceof AST\CoalesceExpression || + $expr instanceof AST\GeneralCaseExpression || + $expr instanceof AST\SimpleCaseExpression + ) { + if ( ! $simpleSelectExpression->fieldIdentificationVariable) { + $alias = $this->_scalarResultCounter++; + } else { + $alias = $simpleSelectExpression->fieldIdentificationVariable; + } + + $columnAlias = 'sclr' . $this->_aliasCounter++; + $sql .= $this->walkCaseExpression($expr) . ' AS ' . $columnAlias; + + $this->_scalarResultAliasMap[$alias] = $columnAlias; + + $columnAlias = $this->_platform->getSQLResultCasing($columnAlias); + $this->_rsm->addScalarResult($columnAlias, $alias); } else { // IdentificationVariable $class = $this->_queryComponents[$expr]['metadata']; diff --git a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php index 1846653e6..6ef886035 100644 --- a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php +++ b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php @@ -1042,6 +1042,38 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase ); } + public function testGeneralCaseWithSingleWhenClauseInSubselect() + { + $this->assertSqlGeneration( + "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id IN (SELECT CASE WHEN ((g2.id / 2) > 18) THEN 2 ELSE 1 END FROM Doctrine\Tests\Models\CMS\CmsGroup g2)", + "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id IN (SELECT CASE WHEN (c1_.id / 2 > 18) THEN 2 ELSE 1 END AS sclr2 FROM cms_groups c1_)" + ); + } + + public function testGeneralCaseWithMultipleWhenClauseInSubselect() + { + $this->assertSqlGeneration( + "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id IN (SELECT CASE WHEN (g.id / 2 < 10) THEN 3 WHEN ((g.id / 2) > 20) THEN 2 ELSE 1 END FROM Doctrine\Tests\Models\CMS\CmsGroup g2)", + "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id IN (SELECT CASE WHEN (c0_.id / 2 < 10) THEN 3 WHEN (c0_.id / 2 > 20) THEN 2 ELSE 1 END AS sclr2 FROM cms_groups c1_)" + ); + } + + public function testSimpleCaseWithSingleWhenClauseInSubselect() + { + $this->assertSqlGeneration( + "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id IN (SELECT CASE g2.name WHEN 'admin' THEN 1 ELSE 2 END FROM Doctrine\Tests\Models\CMS\CmsGroup g2)", + "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id IN (SELECT CASE c1_.name WHEN admin THEN 1 ELSE 2 END AS sclr2 FROM cms_groups c1_)" + ); + } + + public function testSimpleCaseWithMultipleWhenClauseInSubselect() + { + $this->assertSqlGeneration( + "SELECT g FROM Doctrine\Tests\Models\CMS\CmsGroup g WHERE g.id IN (SELECT CASE g2.name WHEN 'admin' THEN 1 WHEN 'moderator' THEN 2 ELSE 3 END FROM Doctrine\Tests\Models\CMS\CmsGroup g2)", + "SELECT c0_.id AS id0, c0_.name AS name1 FROM cms_groups c0_ WHERE c0_.id IN (SELECT CASE c1_.name WHEN admin THEN 1 WHEN moderator THEN 2 ELSE 3 END AS sclr2 FROM cms_groups c1_)" + ); + } + /** * @group DDC-1339 */