Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLin Jen-Shin <godfat@godfat.org>2017-06-27 12:46:45 +0300
committerLin Jen-Shin <godfat@godfat.org>2017-06-27 12:46:45 +0300
commit10e732d2bb1afff22a0549c74636641859cc3bde (patch)
treef93fe19cf9f6b1054201a0aea6f3bb7f2071b9e6
parent6ff162cfd911ccfeeabc8fd1516840b10a8f9700 (diff)
Rename instead of delete, feedback:
https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/12363#note_33449374
-rw-r--r--db/migrate/20170622135451_remove_duplicated_variable.rb45
-rw-r--r--db/migrate/20170622135451_rename_duplicated_variable_key.rb35
-rw-r--r--spec/migrations/remove_duplicated_variable_spec.rb15
3 files changed, 47 insertions, 48 deletions
diff --git a/db/migrate/20170622135451_remove_duplicated_variable.rb b/db/migrate/20170622135451_remove_duplicated_variable.rb
deleted file mode 100644
index bd3aa3f5323..00000000000
--- a/db/migrate/20170622135451_remove_duplicated_variable.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-class RemoveDuplicatedVariable < ActiveRecord::Migration
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- if Gitlab::Database.postgresql?
- execute <<~SQL
- DELETE FROM ci_variables var USING (#{duplicated_ids}) dup
- #{join_conditions}
- SQL
- else
- execute <<~SQL
- DELETE var FROM ci_variables var INNER JOIN (#{duplicated_ids}) dup
- #{join_conditions}
- SQL
- end
- end
-
- def down
- # noop
- end
-
- def duplicated_ids
- <<~SQL
- SELECT MAX(id) AS id, #{key}, project_id
- FROM ci_variables GROUP BY #{key}, project_id
- SQL
- end
-
- def join_conditions
- <<~SQL
- WHERE var.key = dup.key
- AND var.project_id = dup.project_id
- AND var.id <> dup.id
- SQL
- end
-
- def key
- # key needs to be quoted in MySQL
- quote_column_name('key')
- end
-end
diff --git a/db/migrate/20170622135451_rename_duplicated_variable_key.rb b/db/migrate/20170622135451_rename_duplicated_variable_key.rb
new file mode 100644
index 00000000000..b88e7d7ba81
--- /dev/null
+++ b/db/migrate/20170622135451_rename_duplicated_variable_key.rb
@@ -0,0 +1,35 @@
+class RenameDuplicatedVariableKey < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ execute(<<~SQL)
+ UPDATE ci_variables SET #{key} = CONCAT(#{key}, #{underscore}, id)
+ WHERE id IN (
+ SELECT * FROM ( -- MySQL requires an extra layer
+ SELECT dup.id FROM ci_variables dup
+ INNER JOIN (SELECT max(id) AS id, #{key}, project_id
+ FROM ci_variables tmp
+ GROUP BY #{key}, project_id) var
+ USING (#{key}, project_id) where dup.id <> var.id
+ ) dummy
+ )
+ SQL
+ end
+
+ def down
+ # noop
+ end
+
+ def key
+ # key needs to be quoted in MySQL
+ quote_column_name('key')
+ end
+
+ def underscore
+ quote('_')
+ end
+end
diff --git a/spec/migrations/remove_duplicated_variable_spec.rb b/spec/migrations/remove_duplicated_variable_spec.rb
index 9a521a7d980..11096564dfa 100644
--- a/spec/migrations/remove_duplicated_variable_spec.rb
+++ b/spec/migrations/remove_duplicated_variable_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
-require Rails.root.join('db', 'migrate', '20170622135451_remove_duplicated_variable.rb')
+require Rails.root.join('db', 'migrate', '20170622135451_rename_duplicated_variable_key.rb')
-describe RemoveDuplicatedVariable, :migration do
+describe RenameDuplicatedVariableKey, :migration do
let(:variables) { table(:ci_variables) }
let(:projects) { table(:projects) }
@@ -20,6 +20,15 @@ describe RemoveDuplicatedVariable, :migration do
it 'correctly remove duplicated records with smaller id' do
migrate!
- expect(variables.pluck(:id)).to contain_exactly(1, 2, 6, 7, 8)
+ expect(variables.pluck(:id, :key)).to contain_exactly(
+ [1, 'key1'],
+ [2, 'key2'],
+ [3, 'keyX_3'],
+ [4, 'keyX_4'],
+ [5, 'keyY_5'],
+ [6, 'keyX'],
+ [7, 'key7'],
+ [8, 'keyY']
+ )
end
end