diff --git a/Classes/Core/Testbase.php b/Classes/Core/Testbase.php index 9fc1f898..641a6bf7 100644 --- a/Classes/Core/Testbase.php +++ b/Classes/Core/Testbase.php @@ -816,6 +816,8 @@ public function initializeTestDatabaseAndTruncateTables(string $dbPathSqlite = ' $platform = $connection->getDatabasePlatform(); if ($platform instanceof DoctrineMariaDBPlatform || $platform instanceof DoctrineMySQLPlatform) { $this->truncateAllTablesForMysql(); + } elseif ($platform instanceof DoctrinePostgreSQLPlatform) { + $this->truncateAllTablesForPostgres(); } else { $this->truncateAllTablesForOtherDatabases(); } @@ -882,6 +884,24 @@ private function truncateAllTablesForMysql(): void } } + /** + * Truncates all PostgreSQL tables and restarts their sequences in one statement. + */ + private function truncateAllTablesForPostgres(): void + { + /** @var Connection $connection */ + $connection = GeneralUtility::makeInstance(ConnectionPool::class) + ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); + $tableNames = $connection->createSchemaManager()->listTableNames(); + if ($tableNames === []) { + return; + } + $quotedTableNames = array_map($connection->quoteIdentifier(...), $tableNames); + $connection->executeStatement( + 'TRUNCATE TABLE ' . implode(', ', $quotedTableNames) . ' RESTART IDENTITY CASCADE' + ); + } + /** * Truncates all tables without any database-specific optimizations. */