Skip to content

Commit

Permalink
Fix unwanted SQLite schema emulation in SqliteSchemaManager
Browse files Browse the repository at this point in the history
  • Loading branch information
mvorisek committed Oct 1, 2024
1 parent b6eb756 commit 9969a51
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 4 deletions.
3 changes: 3 additions & 0 deletions psalm.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,9 @@

<!-- TODO: remove in 4.0.0 -->
<referencedMethod name="Doctrine\DBAL\Platforms\DB2Platform::getForUpdateSQL"/>

<!-- TODO: remove in 4.0.0 -->
<referencedMethod name="Doctrine\DBAL\Platforms\SqlitePlatform::canEmulateSchemas"/>
</errorLevel>
</DeprecatedMethod>
<DeprecatedProperty>
Expand Down
2 changes: 1 addition & 1 deletion src/Platforms/SqlitePlatform.php
Original file line number Diff line number Diff line change
Expand Up @@ -908,7 +908,7 @@ public function getTemporaryTableName($tableName)
*/
public function canEmulateSchemas()
{
Deprecation::trigger(
Deprecation::triggerIfCalledFromOutside(
'doctrine/dbal',
'https://github.com/doctrine/dbal/pull/4805',
'SqlitePlatform::canEmulateSchemas() is deprecated.',
Expand Down
12 changes: 9 additions & 3 deletions src/Schema/SqliteSchemaManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -704,7 +704,9 @@ protected function selectTableColumns(string $databaseName, ?string $tableName =

if ($tableName !== null) {
$conditions[] = 't.name = ?';
$params[] = str_replace('.', '__', $tableName);
$params[] = $this->_platform->canEmulateSchemas()
? str_replace('.', '__', $tableName)
: $tableName;
}

$sql .= ' WHERE ' . implode(' AND ', $conditions) . ' ORDER BY t.name, c.cid';
Expand All @@ -729,7 +731,9 @@ protected function selectIndexColumns(string $databaseName, ?string $tableName =

if ($tableName !== null) {
$conditions[] = 't.name = ?';
$params[] = str_replace('.', '__', $tableName);
$params[] = $this->_platform->canEmulateSchemas()
? str_replace('.', '__', $tableName)
: $tableName;
}

$sql .= ' WHERE ' . implode(' AND ', $conditions) . ' ORDER BY t.name, i.seq';
Expand All @@ -755,7 +759,9 @@ protected function selectForeignKeyColumns(string $databaseName, ?string $tableN

if ($tableName !== null) {
$conditions[] = 't.name = ?';
$params[] = str_replace('.', '__', $tableName);
$params[] = $this->_platform->canEmulateSchemas()
? str_replace('.', '__', $tableName)
: $tableName;
}

$sql .= ' WHERE ' . implode(' AND ', $conditions) . ' ORDER BY t.name, p.id DESC, p.seq';
Expand Down
53 changes: 53 additions & 0 deletions tests/Functional/Schema/SqliteSchemaManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
use Doctrine\DBAL\Types\BlobType;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Types\Types;
use ReflectionMethod;

use function array_keys;
use function array_map;
use function array_shift;
use function assert;
use function dirname;
Expand Down Expand Up @@ -397,4 +399,55 @@ public function testShorthandInForeignKeyReferenceWithMultipleColumns(): void
$createTableTrackSql,
);
}

public function testListTableNoSchemaEmulation(): void
{
$databasePlatform = $this->connection->getDatabasePlatform();
assert($databasePlatform instanceof SqlitePlatform);
$databasePlatform->disableSchemaEmulation();

$this->dropTableIfExists('`list_table_no_schema_emulation.test`');

$this->connection->executeStatement(<<<'DDL'
CREATE TABLE `list_table_no_schema_emulation.test` (
id INTEGER,
parent_id INTEGER,
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES `list_table_no_schema_emulation.test` (id)
);
DDL);

$this->connection->executeStatement(<<<'DDL'
CREATE INDEX i ON `list_table_no_schema_emulation.test` (parent_id);
DDL);

$schemaManager = $this->schemaManager;
$refl = new ReflectionMethod($schemaManager, 'selectTableColumns');
$refl->setAccessible(true);
$res = $refl->invoke($schemaManager, 'main', 'list_table_no_schema_emulation.test')
->fetchAllAssociative();

self::assertSame([
['list_table_no_schema_emulation.test', 'id'],
['list_table_no_schema_emulation.test', 'parent_id'],
], array_map(static fn (array $row) => [$row['table_name'], $row['name']], $res));

$refl = new ReflectionMethod($schemaManager, 'selectIndexColumns');
$refl->setAccessible(true);
$res = $refl->invoke($schemaManager, 'main', 'list_table_no_schema_emulation.test')
->fetchAllAssociative();

self::assertSame([
['list_table_no_schema_emulation.test', 'i'],
], array_map(static fn (array $row) => [$row['table_name'], $row['name']], $res));

$refl = new ReflectionMethod($schemaManager, 'selectForeignKeyColumns');
$refl->setAccessible(true);
$res = $refl->invoke($schemaManager, 'main', 'list_table_no_schema_emulation.test')
->fetchAllAssociative();

self::assertSame([
['list_table_no_schema_emulation.test', 'parent_id', 'id'],
], array_map(static fn (array $row) => [$row['table_name'], $row['from'], $row['to']], $res));
}
}

0 comments on commit 9969a51

Please sign in to comment.