diff --git a/psalm.xml.dist b/psalm.xml.dist
index 31e4a8b663..d685b545c1 100644
--- a/psalm.xml.dist
+++ b/psalm.xml.dist
@@ -519,6 +519,9 @@
+
+
+
diff --git a/src/Platforms/SqlitePlatform.php b/src/Platforms/SqlitePlatform.php
index 48c692fdb4..dd69688fbb 100644
--- a/src/Platforms/SqlitePlatform.php
+++ b/src/Platforms/SqlitePlatform.php
@@ -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.',
diff --git a/src/Schema/SqliteSchemaManager.php b/src/Schema/SqliteSchemaManager.php
index 3b464f21ad..4b96739e16 100644
--- a/src/Schema/SqliteSchemaManager.php
+++ b/src/Schema/SqliteSchemaManager.php
@@ -715,7 +715,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';
@@ -740,7 +742,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';
@@ -766,7 +770,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';
diff --git a/tests/Functional/Schema/SqliteSchemaManagerTest.php b/tests/Functional/Schema/SqliteSchemaManagerTest.php
index a8d5ca6b3c..c2da909ebb 100644
--- a/tests/Functional/Schema/SqliteSchemaManagerTest.php
+++ b/tests/Functional/Schema/SqliteSchemaManagerTest.php
@@ -7,6 +7,7 @@
use Doctrine\DBAL\Platforms\SqlitePlatform;
use Doctrine\DBAL\Schema\Column;
use Doctrine\DBAL\Schema\ForeignKeyConstraint;
+use Doctrine\DBAL\Schema\SqliteSchemaManager;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Schema\TableDiff;
use Doctrine\DBAL\Types\BlobType;
@@ -14,6 +15,7 @@
use Doctrine\DBAL\Types\Types;
use function array_keys;
+use function array_map;
use function array_shift;
use function assert;
use function dirname;
@@ -398,6 +400,82 @@ public function testShorthandInForeignKeyReferenceWithMultipleColumns(): void
);
}
+ 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);
+
+ $customSqliteSchemaManager = new class ($this->connection, $databasePlatform) extends SqliteSchemaManager {
+ /** @return list> */
+ public function selectTableColumnsWithSchema(): array
+ {
+ return $this->selectTableColumns('main', 'list_table_no_schema_emulation.test')
+ ->fetchAllAssociative();
+ }
+
+ /** @return list> */
+ public function selectIndexColumnsWithSchema(): array
+ {
+ return $this->selectIndexColumns('main', 'list_table_no_schema_emulation.test')
+ ->fetchAllAssociative();
+ }
+
+ /** @return list> */
+ public function selectForeignKeyColumnsWithSchema(): array
+ {
+ return $this->selectForeignKeyColumns('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']],
+ $customSqliteSchemaManager->selectTableColumnsWithSchema(),
+ ),
+ );
+
+ self::assertSame(
+ [
+ ['list_table_no_schema_emulation.test', 'i'],
+ ],
+ array_map(
+ static fn (array $row) => [$row['table_name'], $row['name']],
+ $customSqliteSchemaManager->selectIndexColumnsWithSchema(),
+ ),
+ );
+
+ self::assertSame(
+ [
+ ['list_table_no_schema_emulation.test', 'parent_id', 'id'],
+ ],
+ array_map(
+ static fn (array $row) => [$row['table_name'], $row['from'], $row['to']],
+ $customSqliteSchemaManager->selectForeignKeyColumnsWithSchema(),
+ ),
+ );
+ }
+
/**
* This test duplicates {@see parent::testCommentInTable()} with the only difference that the name of the table
* being created is quoted. It is only meant to cover the logic of parsing the SQLite CREATE TABLE statement