Skip to content

Commit 61f2752

Browse files
committed
Quote parts of the table name
In aa141bf, I wrongly assumed that $tableName would never contain a dot as I was not able to write a test that caused that to happen. The secret recipe appears to be to define a schema and to quote the table name. To fix it for the table name, I am calling quoteSingleIdentifier() before doing the concatenation between schema name and table name. To fix it for the sequence name, which seems only useful when using DBAL 3 for some reason, I reuse some of the logic of the deprecated method. Fixes #12041
1 parent f3371e1 commit 61f2752

File tree

2 files changed

+45
-9
lines changed

2 files changed

+45
-9
lines changed

src/Mapping/DefaultQuoteStrategy.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@
1010
use function array_map;
1111
use function array_merge;
1212
use function assert;
13+
use function explode;
14+
use function implode;
1315
use function is_numeric;
1416
use function preg_replace;
17+
use function sprintf;
1518
use function substr;
1619

1720
/**
@@ -38,7 +41,13 @@ public function getTableName(ClassMetadata $class, AbstractPlatform $platform):
3841
$tableName = $class->table['name'];
3942

4043
if (! empty($class->table['schema'])) {
41-
$tableName = $class->table['schema'] . '.' . $class->table['name'];
44+
return isset($class->table['quoted'])
45+
? sprintf(
46+
'%s.%s',
47+
$platform->quoteSingleIdentifier($class->table['schema']),
48+
$platform->quoteSingleIdentifier($tableName),
49+
)
50+
: $class->table['schema'] . '.' . $class->table['name'];
4251
}
4352

4453
return isset($class->table['quoted'])
@@ -52,7 +61,10 @@ public function getTableName(ClassMetadata $class, AbstractPlatform $platform):
5261
public function getSequenceName(array $definition, ClassMetadata $class, AbstractPlatform $platform): string
5362
{
5463
return isset($definition['quoted'])
55-
? $platform->quoteSingleIdentifier($definition['sequenceName'])
64+
? implode('.', array_map(
65+
static fn (string $part) => $platform->quoteSingleIdentifier($part),
66+
explode('.', $definition['sequenceName']),
67+
))
5668
: $definition['sequenceName'];
5769
}
5870

tests/Tests/ORM/Functional/Ticket/DDC2825Test.php

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@ protected function setUp(): void
3131
}
3232

3333
#[DataProvider('getTestedClasses')]
34-
public function testClassSchemaMappingsValidity(string $className, string $expectedSchemaName, string $expectedTableName): void
35-
{
34+
public function testClassSchemaMappingsValidity(
35+
string $className,
36+
string $expectedSchemaName,
37+
string $expectedTableName,
38+
bool $isQuoted,
39+
): void {
3640
$classMetadata = $this->_em->getClassMetadata($className);
3741
$platform = $this->_em->getConnection()->getDatabasePlatform();
3842
$quotedTableName = $this->_em->getConfiguration()->getQuoteStrategy()->getTableName($classMetadata, $platform);
@@ -41,13 +45,22 @@ public function testClassSchemaMappingsValidity(string $className, string $expec
4145
self::assertEquals($expectedTableName, $classMetadata->table['name']);
4246
self::assertEquals($expectedSchemaName, $classMetadata->table['schema']);
4347

44-
$fullTableName = sprintf('%s.%s', $expectedSchemaName, $expectedTableName);
48+
$fullTableName = sprintf(
49+
$isQuoted ? '"%s"."%s"' : '%s.%s',
50+
$expectedSchemaName,
51+
$expectedTableName,
52+
);
4553

4654
self::assertEquals($fullTableName, $quotedTableName);
4755

4856
// Checks sequence name validity
4957
self::assertEquals(
50-
$fullTableName . '_' . $classMetadata->getSingleIdentifierColumnName() . '_seq',
58+
sprintf(
59+
'%s.%s_%s_seq',
60+
$expectedSchemaName,
61+
$expectedTableName,
62+
$classMetadata->getSingleIdentifierColumnName(),
63+
),
5164
$classMetadata->getSequenceName($platform),
5265
);
5366
}
@@ -72,9 +85,10 @@ public function testPersistenceOfEntityWithSchemaMapping(string $className): voi
7285
public static function getTestedClasses(): array
7386
{
7487
return [
75-
[ExplicitSchemaAndTable::class, 'explicit_schema', 'explicit_table'],
76-
[SchemaAndTableInTableName::class, 'implicit_schema', 'implicit_table'],
77-
[DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::class, 'myschema', 'order'],
88+
[ExplicitSchemaAndTable::class, 'explicit_schema', 'explicit_table', false],
89+
[SchemaAndTableInTableName::class, 'implicit_schema', 'implicit_table', false],
90+
[DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::class, 'myschema', 'order', false],
91+
[File::class, 'yourschema', 'file', true],
7892
];
7993
}
8094
}
@@ -89,3 +103,13 @@ class DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName
89103
#[ORM\Column(type: 'integer')]
90104
public $id;
91105
}
106+
107+
#[ORM\Entity]
108+
#[ORM\Table(name: '`file`', schema: 'yourschema')]
109+
class File
110+
{
111+
#[ORM\Id]
112+
#[ORM\Column]
113+
#[ORM\GeneratedValue]
114+
public int $id;
115+
}

0 commit comments

Comments
 (0)