Skip to content

Commit 16607e3

Browse files
Merge pull request rails#49998 from fatkodima/fix-pg-rename_table-with-uuid-pk
Fix renaming primary key index when renaming a PostgreSQL table having uuid primary key
2 parents 10b36be + 7fba608 commit 16607e3

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ def pk_and_sequence_for(table) # :nodoc:
341341
JOIN pg_namespace nsp ON (t.relnamespace = nsp.oid)
342342
WHERE t.oid = #{quote(quote_table_name(table))}::regclass
343343
AND cons.contype = 'p'
344-
AND pg_get_expr(def.adbin, def.adrelid) ~* 'nextval|uuid_generate'
344+
AND pg_get_expr(def.adbin, def.adrelid) ~* 'nextval|uuid_generate|gen_random_uuid'
345345
SQL
346346
end
347347

activerecord/test/cases/adapters/postgresql/rename_table_test.rb

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
class PostgresqlRenameTableTest < ActiveRecord::PostgreSQLTestCase
66
def setup
77
@connection = ActiveRecord::Base.connection
8-
@connection.create_table :before_rename, force: true
98
end
109

1110
def teardown
@@ -14,14 +13,36 @@ def teardown
1413
end
1514

1615
test "renaming a table also renames the primary key index" do
17-
assert_changes(-> { num_indices_named("before_rename_pkey") }, from: 1, to: 0) do
18-
assert_changes(-> { num_indices_named("after_rename_pkey") }, from: 0, to: 1) do
19-
@connection.rename_table :before_rename, :after_rename
20-
end
16+
@connection.create_table :before_rename, force: true
17+
18+
assert_renames_index("before_rename_pkey", "after_rename_pkey") do
19+
@connection.rename_table :before_rename, :after_rename
20+
end
21+
end
22+
23+
test "renaming a table with uuid primary key and uuid_generate_v4() default also renames the primary key index" do
24+
@connection.create_table :before_rename, force: true, id: :uuid, default: -> { "uuid_generate_v4()" }
25+
26+
assert_renames_index("before_rename_pkey", "after_rename_pkey") do
27+
@connection.rename_table :before_rename, :after_rename
28+
end
29+
end
30+
31+
test "renaming a table with uuid primary key and gen_random_uuid() default also renames the primary key index" do
32+
@connection.create_table :before_rename, force: true, id: :uuid, default: -> { "gen_random_uuid()" }
33+
34+
assert_renames_index("before_rename_pkey", "after_rename_pkey") do
35+
@connection.rename_table :before_rename, :after_rename
2136
end
2237
end
2338

2439
private
40+
def assert_renames_index(from, to, &block)
41+
assert_changes(-> { num_indices_named(from) }, from: 1, to: 0) do
42+
assert_changes(-> { num_indices_named(to) }, from: 0, to: 1, &block)
43+
end
44+
end
45+
2546
def num_indices_named(name)
2647
@connection.execute(<<~SQL).values.length
2748
SELECT 1 FROM "pg_index"

0 commit comments

Comments
 (0)