diff options
4 files changed, 79 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb index 654ed0250e..9004d86b04 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb @@ -934,13 +934,13 @@ module ActiveRecord        def add_index_options(table_name, column_name, options = {}) #:nodoc:          column_names = Array(column_name) -        index_name   = index_name(table_name, column: column_names)          options.assert_valid_keys(:unique, :order, :name, :where, :length, :internal, :using, :algorithm, :type) -        index_type = options[:unique] ? "UNIQUE" : ""          index_type = options[:type].to_s if options.key?(:type) +        index_type ||= options[:unique] ? "UNIQUE" : ""          index_name = options[:name].to_s if options.key?(:name) +        index_name ||= index_name(table_name, column: column_names)          max_index_length = options.fetch(:internal, false) ? index_name_length : allowed_index_name_length          if options.key?(:algorithm) diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb index b123b5415b..09aee1f467 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb @@ -931,8 +931,9 @@ module ActiveRecord        end        def add_index_sql(table_name, column_name, options = {}) -        index_name, index_type, index_columns = add_index_options(table_name, column_name, options) -        "ADD #{index_type} INDEX #{index_name} (#{index_columns})" +        index_name, index_type, index_columns, _, index_algorithm, index_using = add_index_options(table_name, column_name, options) +        index_algorithm[0, 0] = ", " if index_algorithm.present? +        "ADD #{index_type} INDEX #{quote_column_name(index_name)} #{index_using} (#{index_columns})#{index_algorithm}"        end        def remove_index_sql(table_name, options = {}) diff --git a/activerecord/test/cases/adapters/mysql/active_schema_test.rb b/activerecord/test/cases/adapters/mysql/active_schema_test.rb index 6577d56240..57eb5d0e18 100644 --- a/activerecord/test/cases/adapters/mysql/active_schema_test.rb +++ b/activerecord/test/cases/adapters/mysql/active_schema_test.rb @@ -59,6 +59,43 @@ class ActiveSchemaTest < ActiveRecord::TestCase      assert_equal expected, add_index(:people, [:last_name, :first_name], :length => 15, :using => :btree)    end +  def test_index_in_create +    def (ActiveRecord::Base.connection).table_exists?(*); false; end + +    %w(SPATIAL FULLTEXT UNIQUE).each do |type| +      expected = "CREATE TABLE `people` (#{type} INDEX `index_people_on_last_name`  (`last_name`) ) ENGINE=InnoDB" +      actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t| +        t.index :last_name, type: type +      end +      assert_equal expected, actual +    end + +    expected = "CREATE TABLE `people` ( INDEX `index_people_on_last_name` USING btree (`last_name`(10)) ) ENGINE=InnoDB" +    actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t| +      t.index :last_name, length: 10, using: :btree +    end +    assert_equal expected, actual +  end + +  def test_index_in_bulk_change +    def (ActiveRecord::Base.connection).table_exists?(*); true; end +    def (ActiveRecord::Base.connection).index_name_exists?(*); false; end + +    %w(SPATIAL FULLTEXT UNIQUE).each do |type| +      expected = "ALTER TABLE `people` ADD #{type} INDEX `index_people_on_last_name`  (`last_name`)" +      actual = ActiveRecord::Base.connection.change_table(:people, bulk: true) do |t| +        t.index :last_name, type: type +      end +      assert_equal expected, actual +    end + +    expected = "ALTER TABLE `peaple` ADD  INDEX `index_peaple_on_last_name` USING btree (`last_name`(10)), ALGORITHM = COPY" +    actual = ActiveRecord::Base.connection.change_table(:peaple, bulk: true) do |t| +      t.index :last_name, length: 10, using: :btree, algorithm: :copy +    end +    assert_equal expected, actual +  end +    def test_drop_table      assert_equal "DROP TABLE `people`", drop_table(:people)    end diff --git a/activerecord/test/cases/adapters/mysql2/active_schema_test.rb b/activerecord/test/cases/adapters/mysql2/active_schema_test.rb index e87cd3886a..0ea556d4fa 100644 --- a/activerecord/test/cases/adapters/mysql2/active_schema_test.rb +++ b/activerecord/test/cases/adapters/mysql2/active_schema_test.rb @@ -59,6 +59,43 @@ class ActiveSchemaTest < ActiveRecord::TestCase      assert_equal expected, add_index(:people, [:last_name, :first_name], :length => 15, :using => :btree)    end +  def test_index_in_create +    def (ActiveRecord::Base.connection).table_exists?(*); false; end + +    %w(SPATIAL FULLTEXT UNIQUE).each do |type| +      expected = "CREATE TABLE `people` (#{type} INDEX `index_people_on_last_name`  (`last_name`) ) ENGINE=InnoDB" +      actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t| +        t.index :last_name, type: type +      end +      assert_equal expected, actual +    end + +    expected = "CREATE TABLE `people` ( INDEX `index_people_on_last_name` USING btree (`last_name`(10)) ) ENGINE=InnoDB" +    actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t| +      t.index :last_name, length: 10, using: :btree +    end +    assert_equal expected, actual +  end + +  def test_index_in_bulk_change +    def (ActiveRecord::Base.connection).table_exists?(*); true; end +    def (ActiveRecord::Base.connection).index_name_exists?(*); false; end + +    %w(SPATIAL FULLTEXT UNIQUE).each do |type| +      expected = "ALTER TABLE `people` ADD #{type} INDEX `index_people_on_last_name`  (`last_name`)" +      actual = ActiveRecord::Base.connection.change_table(:people, bulk: true) do |t| +        t.index :last_name, type: type +      end +      assert_equal expected, actual +    end + +    expected = "ALTER TABLE `peaple` ADD  INDEX `index_peaple_on_last_name` USING btree (`last_name`(10)), ALGORITHM = COPY" +    actual = ActiveRecord::Base.connection.change_table(:peaple, bulk: true) do |t| +      t.index :last_name, length: 10, using: :btree, algorithm: :copy +    end +    assert_equal expected, actual +  end +    def test_drop_table      assert_equal "DROP TABLE `people`", drop_table(:people)    end  | 
