Skip to content

Commit 43bc08d

Browse files
authored
Support :prefix on index rename (#573)
1 parent c4ec3d6 commit 43bc08d

3 files changed

Lines changed: 40 additions & 33 deletions

File tree

lib/ecto/adapters/postgres/connection.ex

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ if Code.ensure_loaded?(Postgrex) do
230230

231231
[
232232
"INSERT INTO ",
233-
quote_table(prefix, table),
233+
quote_name(prefix, table),
234234
insert_as(on_conflict),
235235
values,
236236
on_conflict(on_conflict, header) | returning(returning)
@@ -332,7 +332,7 @@ if Code.ensure_loaded?(Postgrex) do
332332

333333
[
334334
"UPDATE ",
335-
quote_table(prefix, table),
335+
quote_name(prefix, table),
336336
" SET ",
337337
fields,
338338
" WHERE ",
@@ -351,7 +351,7 @@ if Code.ensure_loaded?(Postgrex) do
351351
{[quote_name(field), " = $" | Integer.to_string(acc)], acc + 1}
352352
end)
353353

354-
["DELETE FROM ", quote_table(prefix, table), " WHERE ", filters | returning(returning)]
354+
["DELETE FROM ", quote_name(prefix, table), " WHERE ", filters | returning(returning)]
355355
end
356356

357357
@impl true
@@ -1136,7 +1136,7 @@ if Code.ensure_loaded?(Postgrex) do
11361136

11371137
{table, schema, prefix} ->
11381138
name = as_prefix ++ [create_alias(table) | Integer.to_string(pos)]
1139-
{quote_table(prefix, table), name, schema}
1139+
{quote_name(prefix, table), name, schema}
11401140

11411141
%Ecto.SubQuery{} ->
11421142
{nil, as_prefix ++ [?s | Integer.to_string(pos)], nil}
@@ -1160,7 +1160,7 @@ if Code.ensure_loaded?(Postgrex) do
11601160

11611161
@impl true
11621162
def execute_ddl({command, %Table{} = table, columns}) when command in @creates do
1163-
table_name = quote_table(table.prefix, table.name)
1163+
table_name = quote_name(table.prefix, table.name)
11641164

11651165
query = [
11661166
"CREATE TABLE ",
@@ -1184,14 +1184,14 @@ if Code.ensure_loaded?(Postgrex) do
11841184
[
11851185
"DROP TABLE ",
11861186
if_do(command == :drop_if_exists, "IF EXISTS "),
1187-
quote_table(table.prefix, table.name),
1187+
quote_name(table.prefix, table.name),
11881188
drop_mode(mode)
11891189
]
11901190
]
11911191
end
11921192

11931193
def execute_ddl({:alter, %Table{} = table, changes}) do
1194-
table_name = quote_table(table.prefix, table.name)
1194+
table_name = quote_name(table.prefix, table.name)
11951195

11961196
query = [
11971197
"ALTER TABLE ",
@@ -1227,7 +1227,7 @@ if Code.ensure_loaded?(Postgrex) do
12271227
quote_name(index.name),
12281228
" ON ",
12291229
if_do(index.only, "ONLY "),
1230-
quote_table(index.prefix, index.table),
1230+
quote_name(index.prefix, index.table),
12311231
if_do(index.using, [" USING ", to_string(index.using)]),
12321232
?\s,
12331233
?(,
@@ -1239,7 +1239,7 @@ if Code.ensure_loaded?(Postgrex) do
12391239
]
12401240
]
12411241

1242-
queries ++ comments_on("INDEX", quote_table(index.prefix, index.name), index.comment)
1242+
queries ++ comments_on("INDEX", quote_name(index.prefix, index.name), index.comment)
12431243
end
12441244

12451245
def execute_ddl({command, %Index{} = index, mode}) when command in @drops do
@@ -1248,23 +1248,30 @@ if Code.ensure_loaded?(Postgrex) do
12481248
"DROP INDEX ",
12491249
if_do(index.concurrently, "CONCURRENTLY "),
12501250
if_do(command == :drop_if_exists, "IF EXISTS "),
1251-
quote_table(index.prefix, index.name),
1251+
quote_name(index.prefix, index.name),
12521252
drop_mode(mode)
12531253
]
12541254
]
12551255
end
12561256

12571257
def execute_ddl({:rename, %Index{} = current_index, new_name}) do
1258-
[["ALTER INDEX ", quote_name(current_index.name), " RENAME TO ", quote_name(new_name)]]
1258+
[
1259+
[
1260+
"ALTER INDEX ",
1261+
quote_name(current_index.prefix, current_index.name),
1262+
" RENAME TO ",
1263+
quote_name(new_name)
1264+
]
1265+
]
12591266
end
12601267

12611268
def execute_ddl({:rename, %Table{} = current_table, %Table{} = new_table}) do
12621269
[
12631270
[
12641271
"ALTER TABLE ",
1265-
quote_table(current_table.prefix, current_table.name),
1272+
quote_name(current_table.prefix, current_table.name),
12661273
" RENAME TO ",
1267-
quote_table(nil, new_table.name)
1274+
quote_name(nil, new_table.name)
12681275
]
12691276
]
12701277
end
@@ -1273,7 +1280,7 @@ if Code.ensure_loaded?(Postgrex) do
12731280
[
12741281
[
12751282
"ALTER TABLE ",
1276-
quote_table(table.prefix, table.name),
1283+
quote_name(table.prefix, table.name),
12771284
" RENAME ",
12781285
quote_name(current_column),
12791286
" TO ",
@@ -1283,7 +1290,7 @@ if Code.ensure_loaded?(Postgrex) do
12831290
end
12841291

12851292
def execute_ddl({:create, %Constraint{} = constraint}) do
1286-
table_name = quote_table(constraint.prefix, constraint.table)
1293+
table_name = quote_name(constraint.prefix, constraint.table)
12871294
queries = [["ALTER TABLE ", table_name, " ADD ", new_constraint_expr(constraint)]]
12881295

12891296
queries ++ comments_on("CONSTRAINT", constraint.name, constraint.comment, table_name)
@@ -1293,7 +1300,7 @@ if Code.ensure_loaded?(Postgrex) do
12931300
[
12941301
[
12951302
"ALTER TABLE ",
1296-
quote_table(constraint.prefix, constraint.table),
1303+
quote_name(constraint.prefix, constraint.table),
12971304
" DROP CONSTRAINT ",
12981305
if_do(command == :drop_if_exists, "IF EXISTS "),
12991306
quote_name(constraint.name),
@@ -1672,7 +1679,7 @@ if Code.ensure_loaded?(Postgrex) do
16721679
"FOREIGN KEY (",
16731680
quote_names(current_columns),
16741681
") REFERENCES ",
1675-
quote_table(ref.prefix || table.prefix, ref.table),
1682+
quote_name(ref.prefix || table.prefix, ref.table),
16761683
?(,
16771684
quote_names(reference_columns),
16781685
?),
@@ -1762,27 +1769,17 @@ if Code.ensure_loaded?(Postgrex) do
17621769
Enum.map_intersperse(names, ?,, &quote_name/1)
17631770
end
17641771

1772+
defp quote_name(nil, name), do: quote_name(name)
1773+
1774+
defp quote_name(prefix, name), do: [quote_name(prefix), ?., quote_name(name)]
1775+
17651776
defp quote_name(name) when is_atom(name) do
17661777
quote_name(Atom.to_string(name))
17671778
end
17681779

17691780
defp quote_name(name) when is_binary(name) do
17701781
if String.contains?(name, "\"") do
1771-
error!(nil, "bad literal/field/table name #{inspect(name)} (\" is not permitted)")
1772-
end
1773-
1774-
[?", name, ?"]
1775-
end
1776-
1777-
defp quote_table(nil, name), do: quote_table(name)
1778-
defp quote_table(prefix, name), do: [quote_table(prefix), ?., quote_table(name)]
1779-
1780-
defp quote_table(name) when is_atom(name),
1781-
do: quote_table(Atom.to_string(name))
1782-
1783-
defp quote_table(name) do
1784-
if String.contains?(name, "\"") do
1785-
error!(nil, "bad table name #{inspect(name)}")
1782+
error!(nil, "bad literal/field/index/table name #{inspect(name)} (\" is not permitted)")
17861783
end
17871784

17881785
[?", name, ?"]

lib/ecto/migration/runner.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ defmodule Ecto.Migration.Runner do
460460
do: "drop index if exists #{quote_name(index.prefix, index.name)}#{drop_mode(mode)}"
461461

462462
defp command({:rename, %Index{} = index_current, new_name}),
463-
do: "rename index #{quote_name(index_current.name)} to #{new_name}"
463+
do: "rename index #{quote_name(index_current.prefix, index_current.name)} to #{new_name}"
464464

465465
defp command({:rename, %Table{} = current_table, %Table{} = new_table}),
466466
do:

test/ecto/adapters/postgres_test.exs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2726,6 +2726,16 @@ defmodule Ecto.Adapters.PostgresTest do
27262726
]
27272727
end
27282728

2729+
test "rename index with prefix" do
2730+
rename =
2731+
{:rename, index(:people, [:name], name: "persons_name_index", prefix: :foo),
2732+
"people_name_index"}
2733+
2734+
assert execute_ddl(rename) == [
2735+
~s|ALTER INDEX "foo"."persons_name_index" RENAME TO "people_name_index"|
2736+
]
2737+
end
2738+
27292739
test "create check constraint" do
27302740
create = {:create, constraint(:products, "price_must_be_positive", check: "price > 0")}
27312741

0 commit comments

Comments
 (0)