From eda43c77bb48048e41659971e7ce4034f6d03df6 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Wed, 19 Dec 2012 23:33:41 -0200 Subject: [PATCH 1/2] Fix DDC-2208 --- lib/Doctrine/ORM/Query/Parser.php | 9 ++++++++- .../Tests/ORM/Query/SelectSqlGenerationTest.php | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/Query/Parser.php b/lib/Doctrine/ORM/Query/Parser.php index 036c11934..4139ea2f4 100644 --- a/lib/Doctrine/ORM/Query/Parser.php +++ b/lib/Doctrine/ORM/Query/Parser.php @@ -1807,7 +1807,14 @@ class Parser return new AST\Literal(AST\Literal::BOOLEAN, $this->lexer->token['value']); case ($lookahead === Lexer::T_INPUT_PARAMETER): - return $this->InputParameter(); + switch (true) { + case $this->isMathOperator($peek): + // :param + u.value + return $this->SimpleArithmeticExpression(); + + default: + return $this->InputParameter(); + } case ($lookahead === Lexer::T_CASE): case ($lookahead === Lexer::T_COALESCE): diff --git a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php index a15e8367c..2014f3112 100644 --- a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php +++ b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php @@ -1773,6 +1773,21 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase 'SELECT q0_."group-id" AS groupid0, q0_."group-name" AS groupname1, q1_."group-id" AS groupid2, q1_."group-name" AS groupname3 FROM "quote-group" q0_ INNER JOIN "quote-group" q1_ ON q0_."parent-id" = q1_."group-id"' ); } + /** + * @group DDC-2208 + */ + public function testCaseThenParameterArithmeticExpression() + { + $this->assertSqlGeneration( + 'SELECT SUM(CASE WHEN e.startDate <= :date THEN e.startDate - :date WHEN e.startDate >= :date THEN :date - e.startDate ELSE 0 END) FROM Doctrine\Tests\Models\Company\CompanyEmployee e', + 'SELECT SUM(CASE WHEN c0_.startDate <= ? THEN c0_.startDate - ? WHEN c0_.startDate >= ? THEN ? - c0_.startDate ELSE 0 END) AS sclr0 FROM company_employees c0_ INNER JOIN company_persons c1_ ON c0_.id = c1_.id' + ); + + $this->assertSqlGeneration( + 'SELECT SUM(CASE WHEN e.startDate <= :date THEN e.startDate - :date WHEN e.startDate >= :date THEN :date - e.startDate ELSE e.startDate + 0 END) FROM Doctrine\Tests\Models\Company\CompanyEmployee e', + 'SELECT SUM(CASE WHEN c0_.startDate <= ? THEN c0_.startDate - ? WHEN c0_.startDate >= ? THEN ? - c0_.startDate ELSE c0_.startDate + 0 END) AS sclr0 FROM company_employees c0_ INNER JOIN company_persons c1_ ON c0_.id = c1_.id' + ); + } } class MyAbsFunction extends \Doctrine\ORM\Query\AST\Functions\FunctionNode From b6b493f450a9da262e1b4908136f6adf215784f4 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Thu, 20 Dec 2012 22:58:24 -0200 Subject: [PATCH 2/2] test parentheses --- .../Tests/ORM/Query/SelectSqlGenerationTest.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php index 2014f3112..bb4bcea3c 100644 --- a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php +++ b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php @@ -1773,19 +1773,25 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase 'SELECT q0_."group-id" AS groupid0, q0_."group-name" AS groupname1, q1_."group-id" AS groupid2, q1_."group-name" AS groupname3 FROM "quote-group" q0_ INNER JOIN "quote-group" q1_ ON q0_."parent-id" = q1_."group-id"' ); } + /** * @group DDC-2208 */ public function testCaseThenParameterArithmeticExpression() { $this->assertSqlGeneration( - 'SELECT SUM(CASE WHEN e.startDate <= :date THEN e.startDate - :date WHEN e.startDate >= :date THEN :date - e.startDate ELSE 0 END) FROM Doctrine\Tests\Models\Company\CompanyEmployee e', - 'SELECT SUM(CASE WHEN c0_.startDate <= ? THEN c0_.startDate - ? WHEN c0_.startDate >= ? THEN ? - c0_.startDate ELSE 0 END) AS sclr0 FROM company_employees c0_ INNER JOIN company_persons c1_ ON c0_.id = c1_.id' + 'SELECT SUM(CASE WHEN e.salary <= :value THEN e.salary - :value WHEN e.salary >= :value THEN :value - e.salary ELSE 0 END) FROM Doctrine\Tests\Models\Company\CompanyEmployee e', + 'SELECT SUM(CASE WHEN c0_.salary <= ? THEN c0_.salary - ? WHEN c0_.salary >= ? THEN ? - c0_.salary ELSE 0 END) AS sclr0 FROM company_employees c0_ INNER JOIN company_persons c1_ ON c0_.id = c1_.id' ); $this->assertSqlGeneration( - 'SELECT SUM(CASE WHEN e.startDate <= :date THEN e.startDate - :date WHEN e.startDate >= :date THEN :date - e.startDate ELSE e.startDate + 0 END) FROM Doctrine\Tests\Models\Company\CompanyEmployee e', - 'SELECT SUM(CASE WHEN c0_.startDate <= ? THEN c0_.startDate - ? WHEN c0_.startDate >= ? THEN ? - c0_.startDate ELSE c0_.startDate + 0 END) AS sclr0 FROM company_employees c0_ INNER JOIN company_persons c1_ ON c0_.id = c1_.id' + 'SELECT SUM(CASE WHEN e.salary <= :value THEN e.salary - :value WHEN e.salary >= :value THEN :value - e.salary ELSE e.salary + 0 END) FROM Doctrine\Tests\Models\Company\CompanyEmployee e', + 'SELECT SUM(CASE WHEN c0_.salary <= ? THEN c0_.salary - ? WHEN c0_.salary >= ? THEN ? - c0_.salary ELSE c0_.salary + 0 END) AS sclr0 FROM company_employees c0_ INNER JOIN company_persons c1_ ON c0_.id = c1_.id' + ); + + $this->assertSqlGeneration( + 'SELECT SUM(CASE WHEN e.salary <= :value THEN (e.salary - :value) WHEN e.salary >= :value THEN (:value - e.salary) ELSE (e.salary + :value) END) FROM Doctrine\Tests\Models\Company\CompanyEmployee e', + 'SELECT SUM(CASE WHEN c0_.salary <= ? THEN c0_.salary - ? WHEN c0_.salary >= ? THEN ? - c0_.salary ELSE c0_.salary + ? END) AS sclr0 FROM company_employees c0_ INNER JOIN company_persons c1_ ON c0_.id = c1_.id' ); } }