From ae9ab22a8ff1b48c90f7dfe2899c09efaa65b161 Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Tue, 2 Oct 2018 17:52:30 +1300 Subject: [PATCH] FIX: Use DELETE FROM instead of TRUNCATE for clearTable clearTable is mainly used for clearing data between tests. In this case, there are very few or zero records, and DELETE FROM is quicker than TRUNCATE, which works by deleting and recreating the table. This materially speeds up test execution, at least on MySQL. --- model/connect/MySQLDatabase.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/model/connect/MySQLDatabase.php b/model/connect/MySQLDatabase.php index f0628e4d5..92d86b513 100644 --- a/model/connect/MySQLDatabase.php +++ b/model/connect/MySQLDatabase.php @@ -362,4 +362,23 @@ class MySQLDatabase extends SS_Database { public function random() { return 'RAND()'; } + + /** + * Clear all data in a given table + * + * @param string $table Name of table + */ + public function clearTable($table) { + $this->query("DELETE FROM \"$table\""); + + // Check if resetting the auto-increment is needed + $autoIncrement = $this->preparedQuery( + 'SELECT "AUTO_INCREMENT" FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?', + [ $this->getSelectedDatabase(), $table] + )->value(); + + if ($autoIncrement > 1) { + $this->query("ALTER TABLE \"$table\" AUTO_INCREMENT = 1"); + } + } }