Skip to content

Commit ec4558a

Browse files
authored
Merge pull request rails#50837 from fatkodima/fix-rename_table-for-indexes-7-0
Ensure pre-7.1 migrations use legacy index names when using `rename_table`
2 parents 1d13a7c + 2c66b2a commit ec4558a

File tree

7 files changed

+45
-7
lines changed

7 files changed

+45
-7
lines changed

activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,11 @@ def rename_index(table_name, old_name, new_name)
971971
def index_name(table_name, options) # :nodoc:
972972
if Hash === options
973973
if options[:column]
974-
generate_index_name(table_name, options[:column])
974+
if options[:_uses_legacy_index_name]
975+
"index_#{table_name}_on_#{Array(options[:column]) * '_and_'}"
976+
else
977+
generate_index_name(table_name, options[:column])
978+
end
975979
elsif options[:name]
976980
options[:name]
977981
else
@@ -1645,11 +1649,11 @@ def index_name_for_remove(table_name, column_name, options)
16451649
end
16461650
end
16471651

1648-
def rename_table_indexes(table_name, new_name)
1652+
def rename_table_indexes(table_name, new_name, **options)
16491653
indexes(new_name).each do |index|
1650-
generated_index_name = index_name(table_name, column: index.columns)
1654+
generated_index_name = index_name(table_name, column: index.columns, **options)
16511655
if generated_index_name == index.name
1652-
rename_index new_name, generated_index_name, index_name(new_name, column: index.columns)
1656+
rename_index new_name, generated_index_name, index_name(new_name, column: index.columns, **options)
16531657
end
16541658
end
16551659
end

activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ def rename_table(table_name, new_name, **options)
340340
schema_cache.clear_data_source_cache!(table_name.to_s)
341341
schema_cache.clear_data_source_cache!(new_name.to_s)
342342
execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}"
343-
rename_table_indexes(table_name, new_name)
343+
rename_table_indexes(table_name, new_name, **options)
344344
end
345345

346346
# Drops a table from the database.

activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ def rename_table(table_name, new_name, **options)
400400
execute "ALTER TABLE #{seq.quoted} RENAME TO #{quote_table_name(new_seq)}"
401401
end
402402
end
403-
rename_table_indexes(table_name, new_name)
403+
rename_table_indexes(table_name, new_name, **options)
404404
end
405405

406406
def add_column(table_name, column_name, type, **options) # :nodoc:

activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ def rename_table(table_name, new_name, **options)
291291
schema_cache.clear_data_source_cache!(table_name.to_s)
292292
schema_cache.clear_data_source_cache!(new_name.to_s)
293293
exec_query "ALTER TABLE #{quote_table_name(table_name)} RENAME TO #{quote_table_name(new_name)}"
294-
rename_table_indexes(table_name, new_name)
294+
rename_table_indexes(table_name, new_name, **options)
295295
end
296296

297297
def add_column(table_name, column_name, type, **options) # :nodoc:

activerecord/lib/active_record/migration/compatibility.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ def create_table(table_name, **options)
119119

120120
def rename_table(table_name, new_name, **options)
121121
options[:_uses_legacy_table_name] = true
122+
options[:_uses_legacy_index_name] = true
122123
super
123124
end
124125

activerecord/test/cases/migration/compatibility_test.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,27 @@ def migrate(x)
420420
connection.drop_table :more_testings rescue nil
421421
end
422422

423+
def test_rename_table_errors_on_too_long_index_name_7_0
424+
long_table_name = "a" * connection.table_name_length
425+
426+
migration = Class.new(ActiveRecord::Migration[7.0]) {
427+
def migrate(x)
428+
add_index :testings, :foo
429+
long_table_name = "a" * connection.table_name_length
430+
rename_table :testings, long_table_name
431+
end
432+
}.new
433+
434+
error = assert_raises(StandardError) do
435+
ActiveRecord::Migrator.new(:up, [migration], @schema_migration, @internal_metadata).migrate
436+
end
437+
438+
assert_match(/index_#{long_table_name}_on_foo/i, error.message)
439+
assert_match(/is too long/i, error.message)
440+
ensure
441+
connection.drop_table long_table_name, if_exists: true
442+
end
443+
423444
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)
424445
def test_change_table_collation_not_unset_7_0
425446
migration = Class.new(ActiveRecord::Migration[7.0]) {

activerecord/test/cases/migration/rename_table_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,18 @@ def test_rename_table_with_an_index
7979
assert_equal "index_octopi_on_url", index.name
8080
end
8181

82+
def test_rename_table_with_long_table_name_and_index
83+
long_name = "a" * connection.table_name_length
84+
85+
add_index :test_models, :url
86+
rename_table :test_models, long_name
87+
88+
index = connection.indexes(long_name).first
89+
assert_includes index.columns, "url"
90+
ensure
91+
rename_table long_name, :test_models
92+
end
93+
8294
def test_rename_table_does_not_rename_custom_named_index
8395
add_index :test_models, :url, name: "special_url_idx"
8496

0 commit comments

Comments
 (0)