From 6857134f36097187ab2f0d932f4f1d9ffab12854 Mon Sep 17 00:00:00 2001 From: Guilherme Blanco Date: Mon, 15 Aug 2011 12:47:17 -0300 Subject: [PATCH] Fixed issue with duplicated commas if Entity has no fields. --- lib/Doctrine/ORM/Query/SqlWalker.php | 18 ++-- .../ORM/Functional/Ticket/DDC1225Test.php | 85 +++++++++++++++++++ 2 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1225Test.php diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index dc97d6bb5..5e92b0973 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -510,9 +510,8 @@ class SqlWalker implements TreeWalker */ public function walkSelectClause($selectClause) { - $sql = 'SELECT ' . (($selectClause->isDistinct) ? 'DISTINCT ' : '') . implode( - ', ', array_filter(array_map(array($this, 'walkSelectExpression'), $selectClause->selectExpressions)) - ); + $sql = 'SELECT ' . (($selectClause->isDistinct) ? 'DISTINCT ' : ''); + $sqlSelectExpressions = array_filter(array_map(array($this, 'walkSelectExpression'), $selectClause->selectExpressions)); $addMetaColumns = ! $this->_query->getHint(Query::HINT_FORCE_PARTIAL_LOAD) && $this->_query->getHydrationMode() == Query::HYDRATE_OBJECT @@ -538,7 +537,8 @@ class SqlWalker implements TreeWalker $tblAlias = $this->getSQLTableAlias($rootClass->table['name'], $dqlAlias); $discrColumn = $rootClass->discriminatorColumn; $columnAlias = $this->getSQLColumnAlias($discrColumn['name']); - $sql .= ", $tblAlias." . $discrColumn['name'] . ' AS ' . $columnAlias; + + $sqlSelectExpressions[] = $tblAlias . '.' . $discrColumn['name'] . ' AS ' . $columnAlias; $columnAlias = $this->_platform->getSQLResultCasing($columnAlias); $this->_rsm->setDiscriminatorColumn($dqlAlias, $columnAlias); @@ -558,7 +558,9 @@ class SqlWalker implements TreeWalker foreach ($assoc['targetToSourceKeyColumns'] as $srcColumn) { $columnAlias = $this->getSQLColumnAlias($srcColumn); - $sql .= ", $sqlTableAlias." . $srcColumn . ' AS ' . $columnAlias; + + $sqlSelectExpressions[] = $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias; + $columnAlias = $this->_platform->getSQLResultCasing($columnAlias); $this->_rsm->addMetaResult($dqlAlias, $this->_platform->getSQLResultCasing($columnAlias), $srcColumn, (isset($assoc['id']) && $assoc['id'] === true)); } @@ -573,7 +575,9 @@ class SqlWalker implements TreeWalker if ($assoc['isOwningSide'] && $assoc['type'] & ClassMetadata::TO_ONE) { foreach ($assoc['targetToSourceKeyColumns'] as $srcColumn) { $columnAlias = $this->getSQLColumnAlias($srcColumn); - $sql .= ', ' . $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias; + + $sqlSelectExpressions[] = $sqlTableAlias . '.' . $srcColumn . ' AS ' . $columnAlias; + $columnAlias = $this->_platform->getSQLResultCasing($columnAlias); $this->_rsm->addMetaResult($dqlAlias, $this->_platform->getSQLResultCasing($columnAlias), $srcColumn, (isset($assoc['id']) && $assoc['id'] === true)); } @@ -582,6 +586,8 @@ class SqlWalker implements TreeWalker } } } + + $sql .= implode(', ', $sqlSelectExpressions); return $sql; } diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1225Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1225Test.php new file mode 100644 index 000000000..cec258f37 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1225Test.php @@ -0,0 +1,85 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1225_TestEntity1'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1225_TestEntity2'), + )); + } catch(\PDOException $e) { + + } + } + + public function testIssue() + { + $qb = $this->_em->createQueryBuilder(); + $qb->from('Doctrine\Tests\ORM\Functional\Ticket\DDC1225_TestEntity1', 'te1') + ->select('te1') + ->where('te1.testEntity2 = ?1') + ->setParameter(1, 0); + + $this->assertEquals( + 'SELECT t0_.test_entity2_id AS test_entity2_id0 FROM te1 t0_ WHERE t0_.test_entity2_id = ?', + $qb->getQuery()->getSQL() + ); + } +} + +/** + * @Entity + * @Table(name="te1") + */ +class DDC1225_TestEntity1 +{ + /** + * @Id + * @ManyToOne(targetEntity="Doctrine\Tests\ORM\Functional\Ticket\DDC1225_TestEntity2") + * @JoinColumn(name="test_entity2_id", referencedColumnName="id", nullable=false) + */ + private $testEntity2; + + /** + * @param DDC1225_TestEntity2 $testEntity2 + */ + public function setTestEntity2(DDC1225_TestEntity2 $testEntity2) + { + $this->testEntity2 = $testEntity2; + } + + /** + * @return DDC1225_TestEntity2 + */ + public function getTestEntity2() + { + return $this->testEntity2; + } +} + +/** + * @Entity + * @Table(name="te2") + */ +class DDC1225_TestEntity2 +{ + /** + * @Id + * @GeneratedValue(strategy="AUTO") + * @Column(type="integer") + */ + private $id; +} \ No newline at end of file