1
0
mirror of synced 2025-03-06 12:56:10 +03:00

Fix parameter name comparison in AbstractQuery#setParameter() with different types

This commit is contained in:
Michael Moravec 2017-11-24 02:22:07 +01:00 committed by Luís Cobucci
parent 4bbb1067ac
commit 6cb5a9c50a
No known key found for this signature in database
GPG Key ID: EC61C5F01750ED3C
2 changed files with 71 additions and 15 deletions

View File

@ -321,14 +321,14 @@ abstract class AbstractQuery
public function getParameter($key) public function getParameter($key)
{ {
$filteredParameters = $this->parameters->filter( $filteredParameters = $this->parameters->filter(
function ($parameter) use ($key) function (Query\Parameter $parameter) use ($key) : bool {
{ $parameterName = $parameter->getName();
// Must not be identical because of string to integer conversion
return ($key == $parameter->getName()); return $key === $parameterName || (string) $key === (string) $parameterName;
} }
); );
return count($filteredParameters) ? $filteredParameters->first() : null; return ! $filteredParameters->isEmpty() ? $filteredParameters->first() : null;
} }
/** /**
@ -369,17 +369,10 @@ abstract class AbstractQuery
*/ */
public function setParameter($key, $value, $type = null) public function setParameter($key, $value, $type = null)
{ {
$filteredParameters = $this->parameters->filter( $existingParameter = $this->getParameter($key);
function ($parameter) use ($key)
{
// Must not be identical because of string to integer conversion
return ($key == $parameter->getName());
}
);
if (count($filteredParameters)) { if ($existingParameter !== null) {
$parameter = $filteredParameters->first(); $existingParameter->setValue($value, $type);
$parameter->setValue($value, $type);
return $this; return $this;
} }

View File

@ -12,6 +12,7 @@ use Doctrine\ORM\Query\QueryException;
use Doctrine\Tests\Mocks\DriverConnectionMock; use Doctrine\Tests\Mocks\DriverConnectionMock;
use Doctrine\Tests\Mocks\StatementArrayMock; use Doctrine\Tests\Mocks\StatementArrayMock;
use Doctrine\Tests\Models\CMS\CmsAddress; use Doctrine\Tests\Models\CMS\CmsAddress;
use Doctrine\Tests\Models\CMS\CmsUser;
use Doctrine\Tests\OrmTestCase; use Doctrine\Tests\OrmTestCase;
class QueryTest extends OrmTestCase class QueryTest extends OrmTestCase
@ -303,4 +304,66 @@ class QueryTest extends OrmTestCase
$this->expectExceptionMessage('Subquery'); $this->expectExceptionMessage('Subquery');
$query->getSQL(); $query->getSQL();
} }
/**
* @group 6699
*/
public function testGetParameterTypeJuggling() : void
{
$query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id = ?0');
$query->setParameter(0, 0);
self::assertCount(1, $query->getParameters());
self::assertSame(0, $query->getParameter(0)->getValue());
self::assertSame(0, $query->getParameter('0')->getValue());
}
/**
* @group 6699
*/
public function testSetParameterWithNameZeroIsNotOverridden() : void
{
$query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
$query->setParameter(0, 0);
$query->setParameter('name', 'Doctrine');
self::assertCount(2, $query->getParameters());
self::assertSame(0, $query->getParameter('0')->getValue());
self::assertSame('Doctrine', $query->getParameter('name')->getValue());
}
/**
* @group 6699
*/
public function testSetParameterWithNameZeroDoesNotOverrideAnotherParameter() : void
{
$query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
$query->setParameter('name', 'Doctrine');
$query->setParameter(0, 0);
self::assertCount(2, $query->getParameters());
self::assertSame(0, $query->getParameter(0)->getValue());
self::assertSame('Doctrine', $query->getParameter('name')->getValue());
}
/**
* @group 6699
*/
public function testSetParameterWithTypeJugglingWorks() : void
{
$query = $this->_em->createQuery('select u from ' . CmsUser::class . ' u where u.id != ?0 and u.username = :name');
$query->setParameter('0', 1);
$query->setParameter('name', 'Doctrine');
$query->setParameter(0, 2);
$query->setParameter('0', 3);
self::assertCount(2, $query->getParameters());
self::assertSame(3, $query->getParameter(0)->getValue());
self::assertSame(3, $query->getParameter('0')->getValue());
self::assertSame('Doctrine', $query->getParameter('name')->getValue());
}
} }