Repository metrics
- Stars
- (9,693 stars)
- PR merge metrics
- (Avg merge 12h 52m) (46 merged PRs in 30d)
Description
Bug Report
| Q | A |
|---|---|
| Version | 3.9.3 |
Summary
I usually use $queryBuilder->createNamedParameter($value) to create queries with prepared statements. Even for boolean values.
It was never a problem in mysql, mariadb and mssql in my cases years ago. Sometimes I had to add a type as second parameter.
pgsql now fails when the value ist false.
Current behavior
When I run one of following code, and the value is false
$queryBuilder->insert(self::TABLE)->values([
'is_anonymous' => $queryBuilder->createNamedParameter($entity->isAnonymous()),
// ..
])->executeQuery();
$queryBuilder->insert(self::TABLE)->values([
'is_anonymous' => $queryBuilder->createNamedParameter($entity->isAnonymous(), ParameterType::BOOLEAN),
// ..
])->executeQuery();
Following happens
Doctrine\DBAL\Exception\DriverException:
An exception occurred while executing a query: invalid input syntax for type boolean: ""
at vendor/doctrine/dbal/src/Driver/API/PostgreSQL/ExceptionConverter.php:87
at Doctrine\DBAL\Driver\API\PostgreSQL\ExceptionConverter->convert(object(Exception), object(Query))
(vendor/doctrine/dbal/src/Connection.php:1939)
at Doctrine\DBAL\Connection->handleDriverException(object(Exception), object(Query))
(vendor/doctrine/dbal/src/Connection.php:1881)
...
After some debugging, I worked around to pass a literal 'false' string.
private function booleanToLiteral(bool $value): string
{
return $value ? 'true' : 'false';
}
$queryBuilder->insert(self::TABLE)->values([
'is_anonymous' => $queryBuilder->createNamedParameter($this->booleanToLiteral($entity->isAnonymous())),
// ..
])->executeQuery();
Expected behavior
The Query should succeed with one of these (without having to do an own conversion).
$queryBuilder->insert(self::TABLE)->values([
'is_anonymous' => $queryBuilder->createNamedParameter($entity->isAnonymous()),
// ..
])->executeQuery();
$queryBuilder->insert(self::TABLE)->values([
'is_anonymous' => $queryBuilder->createNamedParameter($entity->isAnonymous(), ParameterType::BOOLEAN),
// ..
])->executeQuery();
How to reproduce
See the code snippets.
Further
I searched for this issue and found some related issues, but they didn't talk directly about createNamedParameter: #1847, https://github.com/doctrine/dbal/pull/564, https://github.com/doctrine/dbal/pull/625,