]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 824346 - The flaginclusions and flagexclusions DB tables have no UNIQUE index
authorDave Lawrence <dlawrence@mozilla.com>
Mon, 18 Feb 2013 02:31:41 +0000 (21:31 -0500)
committerDave Lawrence <dlawrence@mozilla.com>
Mon, 18 Feb 2013 02:31:41 +0000 (21:31 -0500)
r/a=LpSolit

Bugzilla/DB/Schema.pm
Bugzilla/Install/DB.pm

index f9784ff439df2ecb2f847c2ea5184e62fa5ec9be..80c57a3df58bb2478f584a0e4e45f6840107ec9d 100644 (file)
@@ -638,8 +638,8 @@ use constant ABSTRACT_SCHEMA => {
                                             DELETE => 'CASCADE'}},
         ],
         INDEXES => [
-            flaginclusions_type_id_idx =>
-                [qw(type_id product_id component_id)],
+            flaginclusions_type_id_idx => { FIELDS => [qw(type_id product_id component_id)],
+                                            TYPE   => 'UNIQUE' },
         ],
     },
 
@@ -659,8 +659,8 @@ use constant ABSTRACT_SCHEMA => {
                                             DELETE => 'CASCADE'}},
         ],
         INDEXES => [
-            flagexclusions_type_id_idx =>
-                [qw(type_id product_id component_id)],
+            flagexclusions_type_id_idx => { FIELDS => [qw(type_id product_id component_id)],
+                                            TYPE   => 'UNIQUE' },
         ],
     },
 
index ffcafeb4f8e98ca5ff9ca7729dbfccb6053a847e..386c8d2b46c81afafacdf513d277f41132dc803b 100644 (file)
@@ -703,6 +703,9 @@ sub update_table_definitions {
     # 2012-12-23 LpSolit@gmail.com - Bug 824361
     _fix_longdescs_indexes();
 
+    # 2013-02-04 dkl@mozilla.com - Bug 824346
+    _fix_flagclusions_indexes();
+
     ################################################################
     # New --TABLE-- changes should go *** A B O V E *** this point #
     ################################################################
@@ -3787,6 +3790,35 @@ sub _shorten_long_quips {
     $dbh->bz_alter_column('quips', 'quip', { TYPE => 'varchar(512)', NOTNULL => 1});
 }
 
+sub _fix_flagclusions_indexes {
+    my $dbh = Bugzilla->dbh;
+    foreach my $table ('flaginclusions', 'flagexclusions') {
+        my $index = $table . '_type_id_idx';
+        my $idx_info = $dbh->bz_index_info($table, $index);
+        if ($idx_info && $idx_info->{'TYPE'} ne 'UNIQUE') {
+            # Remove duplicated entries
+            my $dupes = $dbh->selectall_arrayref("
+                SELECT type_id, product_id, component_id, COUNT(*) AS count
+                  FROM $table " .
+                $dbh->sql_group_by('type_id, product_id, component_id') . "
+                HAVING COUNT(*) > 1",
+                { Slice => {} });
+            say "Removing duplicated entries from the '$table' table..." if @$dupes;
+            foreach my $dupe (@$dupes) {
+                $dbh->do("DELETE FROM $table 
+                          WHERE type_id = ? AND product_id = ? AND component_id = ?",
+                         undef, $dupe->{type_id}, $dupe->{product_id}, $dupe->{component_id});
+                $dbh->do("INSERT INTO $table (type_id, product_id, component_id) VALUES (?, ?, ?)",
+                         undef, $dupe->{type_id}, $dupe->{product_id}, $dupe->{component_id});
+            }
+            $dbh->bz_drop_index($table, $index);
+            $dbh->bz_add_index($table, $index,
+                { FIELDS => [qw(type_id product_id component_id)],
+                  TYPE   => 'UNIQUE' });
+        }
+    }
+}
+
 1;
 
 __END__