doctrine/dbal

[pgsql] invalid input syntax for type boolean: ""

Open

#6,780 opened on Feb 11, 2025

View on GitHub
 (6 comments) (0 reactions) (0 assignees)PHP (1,374 forks)batch import
BugHelp wantedPrepared Statementspgsql

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,

Contributor guide