Commit e00b815e authored by Jan Provaznik's avatar Jan Provaznik

Fix index for mysql adapter

* similar to rails 5 it assures that index length is set for blob
  columns also in rails 4
* it also ignores multiple definitions of indexes for mysql, for some
  tables we define multiple indexes on the same set of columns, but with
  different parameters (opclasses, where), these are not supported by
  mysql adapter so the second definition of index is skipped
parent 62bd2aca
...@@ -24,28 +24,46 @@ if defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) ...@@ -24,28 +24,46 @@ if defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)
ActiveRecord::ConnectionAdapters::Mysql2Adapter.send(:prepend, MysqlSetLengthForBinaryIndex) ActiveRecord::ConnectionAdapters::Mysql2Adapter.send(:prepend, MysqlSetLengthForBinaryIndex)
end end
if Gitlab.rails5? module MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema
module MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema # This method is used in Rails 5 schema loading as t.index
# This method is used in Rails 5 schema loading as t.index def index(column_names, options = {})
def index(column_names, options = {}) # Ignore indexes that use opclasses,
options[:length] ||= {} # also see config/initializers/mysql_ignore_postgresql_options.rb
Array(column_names).each do |column_name| if options[:opclasses]
column = columns.find { |c| c.name == column_name } warn "WARNING: index on columns #{column_names} uses unsupported option, skipping."
return
if column&.type == :binary end
options[:length][column_name] = 20
end # when running rails 4 with rails 5 schema, rails 4 doesn't support multiple
end # indexes on the same set of columns. Mysql doesn't support partial indexes, so if
# an index already exists and we add another index, skip it if it's partial:
# see https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/21492#note_102821326
if !Gitlab.rails5? && indexes[column_names] && options[:where]
warn "WARNING: index on columns #{column_names} already exists and partial index is not supported, skipping."
return
end
options[:length] ||= {}
Array(column_names).each do |column_name|
column = columns.find { |c| c.name == column_name }
# Ignore indexes that use opclasses, if column&.type == :binary
# also see config/initializers/mysql_ignore_postgresql_options.rb options[:length][column_name] = 20
unless options[:opclasses]
super(column_names, options)
end end
end end
super(column_names, options)
end end
end
def mysql_adapter?
defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) && ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)
end
if Gitlab.rails5?
if defined?(ActiveRecord::ConnectionAdapters::MySQL::TableDefinition) if defined?(ActiveRecord::ConnectionAdapters::MySQL::TableDefinition)
ActiveRecord::ConnectionAdapters::MySQL::TableDefinition.send(:prepend, MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema) ActiveRecord::ConnectionAdapters::MySQL::TableDefinition.send(:prepend, MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema)
end end
elsif mysql_adapter? && defined?(ActiveRecord::ConnectionAdapters::TableDefinition)
ActiveRecord::ConnectionAdapters::TableDefinition.send(:prepend, MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema)
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment