1: <?php
2:
3: declare(strict_types=1);
4:
5: namespace Atk4\Data\Persistence\Sql\Postgresql;
6:
7: use Doctrine\DBAL\Statement;
8:
9: trait ExpressionTrait
10: {
11: #[\Override]
12: protected function updateRenderBeforeExecute(array $render): array
13: {
14: [$sql, $params] = parent::updateRenderBeforeExecute($render);
15:
16: $sql = preg_replace_callback(
17: '~' . self::QUOTED_TOKEN_REGEX . '\K|:\w+~',
18: static function ($matches) use ($params) {
19: if ($matches[0] === '') {
20: return '';
21: }
22:
23: $sql = $matches[0];
24: $value = $params[$sql];
25:
26: // fix pgsql/pdo_pgsql param type bind
27: // TODO open php-src issue
28: if (is_bool($value)) {
29: $sql = 'cast(' . $sql . ' as BOOLEAN)';
30: } elseif (is_int($value)) {
31: $sql = 'cast(' . $sql . ' as BIGINT)';
32: } elseif (is_float($value)) {
33: $sql = 'cast(' . $sql . ' as DOUBLE PRECISION)';
34: }
35:
36: return $sql;
37: },
38: $sql
39: );
40:
41: return [$sql, $params];
42: }
43:
44: #[\Override]
45: protected function _executeStatement(Statement $statement, bool $fromExecuteStatement)
46: {
47: $sql = \Closure::bind(static fn () => $statement->sql, null, Statement::class)();
48: if (preg_match('~^\s*+select(?=\s|$)~i', $sql)) {
49: return parent::_executeStatement($statement, $fromExecuteStatement);
50: }
51:
52: return $this->connection->atomic(function () use ($statement, $fromExecuteStatement) {
53: return parent::_executeStatement($statement, $fromExecuteStatement);
54: });
55: }
56: }
57: