Skip to content

Commit

Permalink
MDL-79638 phpunit: Remove mysql/mariadb hack
Browse files Browse the repository at this point in the history
This hack was introduced to work around a bug in MySQL 5.6.14 and
MariaDB at the time.

https://bugs.mysql.com/bug.php?id=69882

It was addressed a few months later in 5.6.16, and 5.7.4.
MariaDB merged version 5.6.16 of MySQL's InnoDB engine in MariaDB
10.0.11 and got hte patch from there.

Moodle has required MySQL 8.0, and MariaDB 10.6.7 since Moodle 4.2 and
it is therefore safe to remove these hacks.
  • Loading branch information
andrewnicols committed Oct 10, 2023
1 parent 9713039 commit f3de063
Showing 1 changed file with 0 additions and 65 deletions.
65 changes: 0 additions & 65 deletions lib/testing/classes/util.php
Expand Up @@ -640,78 +640,13 @@ public static function reset_database() {
$updatedtables = self::$tableupdated;
}

$borkedmysql = false;
if ($DB->get_dbfamily() === 'mysql') {
$version = $DB->get_server_info();
if (version_compare($version['version'], '5.6.0') == 1 and version_compare($version['version'], '5.6.16') == -1) {
// Everything that comes from Oracle is evil!
//
// See http://dev.mysql.com/doc/refman/5.6/en/alter-table.html
// You cannot reset the counter to a value less than or equal to to the value that is currently in use.
//
// From 5.6.16 release notes:
// InnoDB: The ALTER TABLE INPLACE algorithm would fail to decrease the auto-increment value.
// (Bug #17250787, Bug #69882)
$borkedmysql = true;

} else if (version_compare($version['version'], '10.0.0') == 1) {
// And MariaDB is no better!
// Let's hope they pick the patch sometime later...
$borkedmysql = true;
}
}

if ($borkedmysql) {
$mysqlsequences = array();
$prefix = $DB->get_prefix();
$rs = $DB->get_recordset_sql("SHOW TABLE STATUS LIKE ?", array($prefix.'%'));
foreach ($rs as $info) {
$table = strtolower($info->name);
if (strpos($table, $prefix) !== 0) {
// Incorrect table match caused by _ char.
continue;
}
if (!is_null($info->auto_increment)) {
$table = preg_replace('/^'.preg_quote($prefix, '/').'/', '', $table);
$mysqlsequences[$table] = $info->auto_increment;
}
}
$rs->close();
}

foreach ($data as $table => $records) {
// If table is not modified then no need to do anything.
// $updatedtables tables is set after the first run, so check before checking for specific table update.
if (!empty($updatedtables) && !isset($updatedtables[$table])) {
continue;
}

if ($borkedmysql) {
if (empty($records)) {
if (!isset($empties[$table])) {
// Table has been modified and is not empty.
$DB->delete_records($table, null);
}
continue;
}

if (isset($structure[$table]['id']) and $structure[$table]['id']->auto_increment) {
$current = $DB->get_records($table, array(), 'id ASC');
if ($current == $records) {
if (isset($mysqlsequences[$table]) and $mysqlsequences[$table] == $structure[$table]['id']->auto_increment) {
continue;
}
}
}

// Use TRUNCATE as a workaround and reinsert everything.
$DB->delete_records($table, null);
foreach ($records as $record) {
$DB->import_record($table, $record, false, true);
}
continue;
}

if (empty($records)) {
if (!isset($empties[$table])) {
// Table has been modified and is not empty.
Expand Down

0 comments on commit f3de063

Please sign in to comment.