Skip to content

Commit 4ac0bf5

Browse files
committed
Replace sentinel bytes with direct quote-char properties
Remove the sentinel indirection (\x01/\x02 bytes + strtr at boundaries) and instead quote identifiers directly using $qo/$qc/$qs properties on the renderer, initialized from the platform in init(). Same performance benefit (no platform->quoteIdentifier calls, no identifier cache) with simpler code and zero post-processing.
1 parent cfb7bd4 commit 4ac0bf5

File tree

12 files changed

+51
-95
lines changed

12 files changed

+51
-95
lines changed

src/Sql/AbstractPreparableSql.php

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@
88
use PhpDb\Adapter\AdapterInterface;
99
use PhpDb\Adapter\ParameterContainer;
1010
use PhpDb\Adapter\StatementContainerInterface;
11-
use PhpDb\Sql\Platform\AbstractSqlRenderer;
1211
use PhpDb\Sql\Platform\Sql92Renderer;
1312

14-
use function strtr;
15-
1613
abstract class AbstractPreparableSql extends AbstractSql implements PreparableSqlInterface
1714
{
1815
#[Override]
@@ -28,17 +25,9 @@ public function prepareStatement(
2825
$statementContainer->setParameterContainer($parameterContainer);
2926
}
3027

31-
$renderer = (new Sql92Renderer())->init(
32-
$adapter->getPlatform(),
33-
$adapter->getDriver(),
34-
$parameterContainer
35-
);
36-
3728
$statementContainer->setSql(
38-
strtr(
39-
$this->buildSqlString($renderer),
40-
AbstractSqlRenderer::QI_PAIR,
41-
$renderer->quoteChars
29+
$this->buildSqlString(
30+
(new Sql92Renderer())->init($adapter->getPlatform(), $adapter->getDriver(), $parameterContainer)
4231
)
4332
);
4433

src/Sql/AbstractSql.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
use PhpDb\Sql\Platform\AbstractSqlRenderer;
1111
use PhpDb\Sql\Platform\Sql92Renderer;
1212

13-
use function strtr;
14-
1513
abstract class AbstractSql implements SqlInterface
1614
{
1715
private ?AbstractSqlRenderer $renderer = null;
@@ -24,12 +22,8 @@ public function getSqlString(?PlatformInterface $adapterPlatform = null): string
2422
{
2523
$this->renderer ??= new Sql92Renderer();
2624

27-
$renderer = $this->renderer->init($adapterPlatform ?? new DefaultAdapterPlatform());
28-
29-
return strtr(
30-
$this->buildSqlString($renderer),
31-
AbstractSqlRenderer::QI_PAIR,
32-
$renderer->quoteChars
25+
return $this->buildSqlString(
26+
$this->renderer->init($adapterPlatform ?? new DefaultAdapterPlatform())
3327
);
3428
}
3529

src/Sql/Argument/Identifier.php

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,12 @@
66

77
use PhpDb\Sql\ArgumentInterface;
88
use PhpDb\Sql\ArgumentType;
9-
use PhpDb\Sql\Platform\AbstractSqlRenderer;
10-
11-
use function str_contains;
12-
use function str_replace;
139

1410
final readonly class Identifier implements ArgumentInterface
1511
{
16-
public string $qi;
17-
1812
public function __construct(
1913
public string $identifier
2014
) {
21-
$this->qi = str_contains($identifier, '.')
22-
? AbstractSqlRenderer::QI_OPEN
23-
. str_replace('.', AbstractSqlRenderer::QI_SEP, $identifier)
24-
. AbstractSqlRenderer::QI_CLOSE
25-
: AbstractSqlRenderer::QI_OPEN . $identifier . AbstractSqlRenderer::QI_CLOSE;
2615
}
2716

2817
public function getType(): ArgumentType

src/Sql/Insert.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public function buildSqlString(AbstractSqlRenderer $renderer): string
158158
if ($columnNames !== []) {
159159
$columns = [];
160160
foreach ($columnNames as $col) {
161-
$columns[] = AbstractSqlRenderer::QI_OPEN . $col . AbstractSqlRenderer::QI_CLOSE;
161+
$columns[] = $renderer->qo . $col . $renderer->qc;
162162
}
163163
return $keyword . ' ' . $tableSql
164164
. ' (' . implode(', ', $columns) . ') ' . $selectSql;
@@ -178,7 +178,7 @@ public function buildSqlString(AbstractSqlRenderer $renderer): string
178178
$hasParamContainer = $renderer->parameterContainer instanceof ParameterContainer;
179179

180180
foreach ($this->columns as $column => $value) {
181-
$columns[] = AbstractSqlRenderer::QI_OPEN . $column . AbstractSqlRenderer::QI_CLOSE;
181+
$columns[] = $renderer->qo . $column . $renderer->qc;
182182

183183
if ($value === null) {
184184
$values[] = 'NULL';

src/Sql/Part/Columns.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use function is_array;
1818
use function is_numeric;
1919
use function key;
20+
use function str_replace;
2021

2122
class Columns extends AbstractPart
2223
{
@@ -79,7 +80,8 @@ public function toSql(AbstractSqlRenderer $renderer, string $paramPrefix = '', i
7980
$column = $ref->column;
8081

8182
if ($column instanceof Identifier) {
82-
$columnSql = $prefix . $column->qi;
83+
$columnSql = $prefix
84+
. $renderer->qo . str_replace('.', $renderer->qs, $column->identifier) . $renderer->qc;
8385
} elseif ($column instanceof ArgumentInterface) {
8486
$columnSql = $prefix . $renderer->renderArgument($column, '', $pi);
8587
} else {
@@ -88,7 +90,7 @@ public function toSql(AbstractSqlRenderer $renderer, string $paramPrefix = '', i
8890

8991
if ($ref->columnAlias !== null) {
9092
$fragments[] = $columnSql . ' AS '
91-
. AbstractSqlRenderer::QI_OPEN . $ref->columnAlias . AbstractSqlRenderer::QI_CLOSE;
93+
. $renderer->qo . $ref->columnAlias . $renderer->qc;
9294
} elseif ($ref->containsAlias) {
9395
$fragments[] = $columnSql;
9496
} else {

src/Sql/Part/GroupBy.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use function implode;
1212
use function is_array;
13+
use function str_replace;
1314

1415
class GroupBy extends AbstractPart
1516
{
@@ -28,7 +29,7 @@ public function toSql(AbstractSqlRenderer $renderer, string $paramPrefix = '', i
2829
$column = $ref->column;
2930

3031
if ($column instanceof Identifier) {
31-
$groups[] = $column->qi;
32+
$groups[] = $renderer->qo . str_replace('.', $renderer->qs, $column->identifier) . $renderer->qc;
3233
} elseif ($column instanceof ArgumentInterface) {
3334
$pi = 0;
3435
$groups[] = $renderer->renderArgument($column, '', $pi);

src/Sql/Part/InsertSelect.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public function toSql(AbstractSqlRenderer $renderer, string $paramPrefix = '', i
3434

3535
$columns = [];
3636
foreach (array_keys($this->columns) as $name) {
37-
$columns[] = AbstractSqlRenderer::QI_OPEN . $name . AbstractSqlRenderer::QI_CLOSE;
37+
$columns[] = $renderer->qo . $name . $renderer->qc;
3838
}
3939
$columnsSql = implode(', ', $columns);
4040

src/Sql/Part/InsertValues.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public function toSql(AbstractSqlRenderer $renderer, string $paramPrefix = '', i
4848
$isPdoDriver = $renderer->driver instanceof PdoDriverInterface;
4949

5050
foreach ($this->columnValues as $cv) {
51-
$columns[] = AbstractSqlRenderer::QI_OPEN . $cv->column . AbstractSqlRenderer::QI_CLOSE;
51+
$columns[] = $renderer->qo . $cv->column . $renderer->qc;
5252

5353
$values[] = match ($cv->value->getType()) {
5454
ArgumentType::Parameter => $renderer->bindParameter(

src/Sql/Part/OrderBy.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use function ltrim;
1717
use function preg_split;
1818
use function str_contains;
19+
use function str_replace;
1920

2021
class OrderBy extends AbstractPart
2122
{
@@ -37,7 +38,9 @@ public function toSql(AbstractSqlRenderer $renderer, string $paramPrefix = '', i
3738
$column = $spec->column;
3839

3940
if ($column instanceof Identifier) {
40-
$orders[] = $column->qi . ' ' . $spec->direction;
41+
$orders[] = $renderer->qo
42+
. str_replace('.', $renderer->qs, $column->identifier)
43+
. $renderer->qc . ' ' . $spec->direction;
4144
} elseif ($column instanceof ArgumentInterface) {
4245
$pi = 0;
4346
$orders[] = $renderer->renderArgument($column, '', $pi)

src/Sql/Part/Set.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace PhpDb\Sql\Part;
66

77
use PhpDb\Adapter\Driver\PdoDriverInterface;
8-
use PhpDb\Sql\Argument\Identifier;
98
use PhpDb\Sql\Argument\NullValue;
109
use PhpDb\Sql\Argument\Parameter;
1110
use PhpDb\Sql\Argument\Select as SelectArgument;
@@ -18,15 +17,13 @@
1817

1918
use function implode;
2019
use function is_string;
20+
use function str_replace;
2121

2222
class Set extends AbstractPart
2323
{
2424
/** @var array<string, ArgumentInterface>|null */
2525
public ?array $model = null;
2626

27-
/** @var array<string, Identifier> */
28-
private array $columnIds = [];
29-
3027
public function toSql(AbstractSqlRenderer $renderer, string $paramPrefix = '', int &$paramIndex = 0): ?string
3128
{
3229
if ($this->model === null || $this->model === []) {
@@ -39,7 +36,7 @@ public function toSql(AbstractSqlRenderer $renderer, string $paramPrefix = '', i
3936
$isPdoDriver = $renderer->driver instanceof PdoDriverInterface;
4037

4138
foreach ($this->model as $column => $arg) {
42-
$prefix = $this->columnIds[$column]->qi . ' = ';
39+
$prefix = $renderer->qo . str_replace('.', $renderer->qs, $column) . $renderer->qc . ' = ';
4340

4441
$setSql[] = $prefix . match ($arg->getType()) {
4542
ArgumentType::Parameter => $renderer->bindParameter(
@@ -67,17 +64,15 @@ public function set(array $values, string|int $flag = 'set'): static
6764
$this->model ??= [];
6865

6966
if ($flag === 'set') {
70-
$this->model = [];
71-
$this->columnIds = [];
67+
$this->model = [];
7268
}
7369

7470
foreach ($values as $k => $v) {
7571
if (! is_string($k)) {
7672
throw new Exception\InvalidArgumentException('set() expects a string for the value key');
7773
}
7874

79-
$this->model[$k] = $this->normalizeValue($k, $v);
80-
$this->columnIds[$k] = new Identifier($k);
75+
$this->model[$k] = $this->normalizeValue($k, $v);
8176
}
8277
return $this;
8378
}

0 commit comments

Comments
 (0)