diff options
author | Dave Lawrence <dlawrence@mozilla.com> | 2013-02-18 03:24:56 +0100 |
---|---|---|
committer | Dave Lawrence <dlawrence@mozilla.com> | 2013-02-18 03:24:56 +0100 |
commit | 2541a7dcf12529052a710def2e70afc794f4fbff (patch) | |
tree | 5e70d2fa5e3c326290384087091d787e7fbe32b5 | |
parent | 11a0cd743d60b18c1dde5f02c8fde3d590272bec (diff) | |
download | bugzilla-2541a7dcf12529052a710def2e70afc794f4fbff.tar.gz bugzilla-2541a7dcf12529052a710def2e70afc794f4fbff.tar.xz |
Bug 824346 - The flaginclusions and flagexclusions DB tables have no UNIQUE index
r/a=LpSolit
-rw-r--r-- | Bugzilla/DB/Schema.pm | 8 | ||||
-rw-r--r-- | Bugzilla/Install/DB.pm | 32 |
2 files changed, 36 insertions, 4 deletions
diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm index 058e78a5f..f92d0aeb7 100644 --- a/Bugzilla/DB/Schema.pm +++ b/Bugzilla/DB/Schema.pm @@ -640,8 +640,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' }, ], }, @@ -661,8 +661,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' }, ], }, diff --git a/Bugzilla/Install/DB.pm b/Bugzilla/Install/DB.pm index cb7276fb9..3170babf6 100644 --- a/Bugzilla/Install/DB.pm +++ b/Bugzilla/Install/DB.pm @@ -708,6 +708,9 @@ sub update_table_definitions { # 2013-01-02 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 # ################################################################ @@ -3825,6 +3828,35 @@ sub _add_password_salt_separator { $dbh->bz_commit_transaction(); } +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__ |