diff --git a/lib/db/install.xml b/lib/db/install.xml
index 51e9ac16601..aecf51e66eb 100644
--- a/lib/db/install.xml
+++ b/lib/db/install.xml
@@ -2230,6 +2230,7 @@
+
-
\ No newline at end of file
+
diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php
index 4fa1f58ec07..0d34d582aa8 100644
--- a/lib/db/upgrade.php
+++ b/lib/db/upgrade.php
@@ -2373,5 +2373,32 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2018051704.03);
}
+ if ($oldversion < 2018051704.04) {
+ // Remove duplicate entries from group memberships.
+ // Find records with multiple userid/groupid combinations and find the highest ID.
+ // Later we will remove all those entries.
+ $sql = "
+ SELECT MIN(id) as minid, userid, groupid
+ FROM {groups_members}
+ GROUP BY userid, groupid
+ HAVING COUNT(id) > 1";
+ if ($duplicatedrows = $DB->get_recordset_sql($sql)) {
+ foreach ($duplicatedrows as $row) {
+ $DB->delete_records_select('groups_members',
+ 'userid = :userid AND groupid = :groupid AND id <> :minid', (array)$row);
+ }
+ }
+ $duplicatedrows->close();
+
+ // Define key useridgroupid (unique) to be added to group_members.
+ $table = new xmldb_table('groups_members');
+ $key = new xmldb_key('useridgroupid', XMLDB_KEY_UNIQUE, array('userid', 'groupid'));
+ // Launch add key useridgroupid.
+ $dbman->add_key($table, $key);
+
+ // Main savepoint reached.
+ upgrade_main_savepoint(true, 2018051704.04);
+ }
+
return true;
}
diff --git a/version.php b/version.php
index 89c8802a5d7..ff4313d7530 100644
--- a/version.php
+++ b/version.php
@@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
-$version = 2018051704.03; // 20180517 = branching date YYYYMMDD - do not modify!
+$version = 2018051704.04; // 20180517 = branching date YYYYMMDD - do not modify!
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.