mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Remove default ENGINE=InnoDB for Mysql2 adapter
Before this commit ENGINE=InnoDB was added by default to Mysql2 adapter +create_table+ if no +options+ option was provided. This default ENGINE was lost as soon as something was passed in at +options+ option, making its goal and propagation inconsistent, as the programmer needed to remember including ENGINE=InnoDB when something was passed in. This commit removes default ENGINE as its use isn't needed anymore for current MySQL and MariaDB versions. It adds compatibility support and tests to ensure that default ENGINE is still present for migrations with version 5.1 and before. It also ensures we still dump the ENGINE option to +schema.rb+ in order to avoid inconsistencies.
This commit is contained in:
parent
9b2180c7de
commit
7ac7f4a188
4 changed files with 87 additions and 4 deletions
|
@ -293,7 +293,7 @@ module ActiveRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_table(table_name, **options) #:nodoc:
|
def create_table(table_name, **options) #:nodoc:
|
||||||
super(table_name, options: "ENGINE=InnoDB", **options)
|
super(table_name, options: "", **options)
|
||||||
end
|
end
|
||||||
|
|
||||||
def bulk_change_table(table_name, operations) #:nodoc:
|
def bulk_change_table(table_name, operations) #:nodoc:
|
||||||
|
|
|
@ -28,6 +28,14 @@ module ActiveRecord
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_table(table_name, options = {})
|
||||||
|
if adapter_name == "Mysql2"
|
||||||
|
super(table_name, options: "ENGINE=InnoDB", **options)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class V5_0 < V5_1
|
class V5_0 < V5_1
|
||||||
|
|
|
@ -68,14 +68,14 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
|
||||||
def (ActiveRecord::Base.connection).data_source_exists?(*); false; end
|
def (ActiveRecord::Base.connection).data_source_exists?(*); false; end
|
||||||
|
|
||||||
%w(SPATIAL FULLTEXT UNIQUE).each do |type|
|
%w(SPATIAL FULLTEXT UNIQUE).each do |type|
|
||||||
expected = "CREATE TABLE `people` (#{type} INDEX `index_people_on_last_name` (`last_name`)) ENGINE=InnoDB"
|
expected = "CREATE TABLE `people` (#{type} INDEX `index_people_on_last_name` (`last_name`)) "
|
||||||
actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t|
|
actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t|
|
||||||
t.index :last_name, type: type
|
t.index :last_name, type: type
|
||||||
end
|
end
|
||||||
assert_equal expected, actual
|
assert_equal expected, actual
|
||||||
end
|
end
|
||||||
|
|
||||||
expected = "CREATE TABLE `people` ( INDEX `index_people_on_last_name` USING btree (`last_name`(10))) ENGINE=InnoDB"
|
expected = "CREATE TABLE `people` ( INDEX `index_people_on_last_name` USING btree (`last_name`(10))) "
|
||||||
actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t|
|
actual = ActiveRecord::Base.connection.create_table(:people, id: false) do |t|
|
||||||
t.index :last_name, length: 10, using: :btree
|
t.index :last_name, length: 10, using: :btree
|
||||||
end
|
end
|
||||||
|
@ -160,7 +160,7 @@ class Mysql2ActiveSchemaTest < ActiveRecord::Mysql2TestCase
|
||||||
ActiveRecord::Base.connection.stubs(:data_source_exists?).with(:temp).returns(false)
|
ActiveRecord::Base.connection.stubs(:data_source_exists?).with(:temp).returns(false)
|
||||||
ActiveRecord::Base.connection.stubs(:index_name_exists?).with(:index_temp_on_zip).returns(false)
|
ActiveRecord::Base.connection.stubs(:index_name_exists?).with(:index_temp_on_zip).returns(false)
|
||||||
|
|
||||||
expected = "CREATE TEMPORARY TABLE `temp` ( INDEX `index_temp_on_zip` (`zip`)) ENGINE=InnoDB AS SELECT id, name, zip FROM a_really_complicated_query"
|
expected = "CREATE TEMPORARY TABLE `temp` ( INDEX `index_temp_on_zip` (`zip`)) AS SELECT id, name, zip FROM a_really_complicated_query"
|
||||||
actual = ActiveRecord::Base.connection.create_table(:temp, temporary: true, as: "SELECT id, name, zip FROM a_really_complicated_query") do |t|
|
actual = ActiveRecord::Base.connection.create_table(:temp, temporary: true, as: "SELECT id, name, zip FROM a_really_complicated_query") do |t|
|
||||||
t.index :zip
|
t.index :zip
|
||||||
end
|
end
|
||||||
|
|
|
@ -42,3 +42,78 @@ class Mysql2TableOptionsTest < ActiveRecord::Mysql2TestCase
|
||||||
assert_match %r{COLLATE=utf8mb4_bin}, options
|
assert_match %r{COLLATE=utf8mb4_bin}, options
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class Mysql2DefaultEngineOptionSchemaDumpTest < ActiveRecord::Mysql2TestCase
|
||||||
|
include SchemaDumpingHelper
|
||||||
|
self.use_transactional_tests = false
|
||||||
|
|
||||||
|
def setup
|
||||||
|
@verbose_was = ActiveRecord::Migration.verbose
|
||||||
|
ActiveRecord::Migration.verbose = false
|
||||||
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
ActiveRecord::Base.connection.drop_table "mysql_table_options", if_exists: true
|
||||||
|
ActiveRecord::Migration.verbose = @verbose_was
|
||||||
|
ActiveRecord::SchemaMigration.delete_all rescue nil
|
||||||
|
end
|
||||||
|
|
||||||
|
test "schema dump includes ENGINE=InnoDB if not provided" do
|
||||||
|
ActiveRecord::Base.connection.create_table "mysql_table_options", force: true
|
||||||
|
|
||||||
|
output = dump_table_schema("mysql_table_options")
|
||||||
|
options = %r{create_table "mysql_table_options", options: "(?<options>.*)"}.match(output)[:options]
|
||||||
|
assert_match %r{ENGINE=InnoDB}, options
|
||||||
|
end
|
||||||
|
|
||||||
|
test "schema dump includes ENGINE=InnoDB in legacy migrations" do
|
||||||
|
migration = Class.new(ActiveRecord::Migration[5.1]) do
|
||||||
|
def migrate(x)
|
||||||
|
create_table "mysql_table_options", force: true
|
||||||
|
end
|
||||||
|
end.new
|
||||||
|
|
||||||
|
ActiveRecord::Migrator.new(:up, [migration]).migrate
|
||||||
|
|
||||||
|
output = dump_table_schema("mysql_table_options")
|
||||||
|
options = %r{create_table "mysql_table_options", options: "(?<options>.*)"}.match(output)[:options]
|
||||||
|
assert_match %r{ENGINE=InnoDB}, options
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Mysql2DefaultEngineOptionSqlOutputTest < ActiveRecord::Mysql2TestCase
|
||||||
|
self.use_transactional_tests = false
|
||||||
|
|
||||||
|
def setup
|
||||||
|
@logger_was = ActiveRecord::Base.logger
|
||||||
|
@log = StringIO.new
|
||||||
|
@verbose_was = ActiveRecord::Migration.verbose
|
||||||
|
ActiveRecord::Base.logger = ActiveSupport::Logger.new(@log)
|
||||||
|
ActiveRecord::Migration.verbose = false
|
||||||
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
ActiveRecord::Base.logger = @logger_was
|
||||||
|
ActiveRecord::Migration.verbose = @verbose_was
|
||||||
|
ActiveRecord::Base.connection.drop_table "mysql_table_options", if_exists: true
|
||||||
|
ActiveRecord::SchemaMigration.delete_all rescue nil
|
||||||
|
end
|
||||||
|
|
||||||
|
test "new migrations do not contain default ENGINE=InnoDB option" do
|
||||||
|
ActiveRecord::Base.connection.create_table "mysql_table_options", force: true
|
||||||
|
|
||||||
|
assert_no_match %r{ENGINE=InnoDB}, @log.string
|
||||||
|
end
|
||||||
|
|
||||||
|
test "legacy migrations contain default ENGINE=InnoDB option" do
|
||||||
|
migration = Class.new(ActiveRecord::Migration[5.1]) do
|
||||||
|
def migrate(x)
|
||||||
|
create_table "mysql_table_options", force: true
|
||||||
|
end
|
||||||
|
end.new
|
||||||
|
|
||||||
|
ActiveRecord::Migrator.new(:up, [migration]).migrate
|
||||||
|
|
||||||
|
assert_match %r{ENGINE=InnoDB}, @log.string
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue