Skip to content

Commit 8acafac

Browse files
Allow fragment tuple sources in adapters (#691)
1 parent 84dd74c commit 8acafac

File tree

7 files changed

+65
-20
lines changed

7 files changed

+65
-20
lines changed

integration_test/pg/storage_test.exs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ defmodule Ecto.Integration.StorageTest do
130130
{:ok, _} = Postgres.structure_load(tmp_path(), params())
131131

132132
{:ok, _} = Postgres.structure_dump(tmp_path(), [dump_path: dump_path] ++ params())
133-
assert dump == File.read!(dump_path)
133+
assert redact_hashes(dump) == redact_hashes(File.read!(dump_path))
134134
after
135135
drop_database()
136136
end
@@ -248,11 +248,18 @@ defmodule Ecto.Integration.StorageTest do
248248
num = @base_migration + System.unique_integer([:positive])
249249
:ok = Ecto.Migrator.up(PoolRepo, num, Migration, log: false)
250250

251-
assert {"--\n-- PostgreSQL database dump\n--\n\n--" <> _rest, 0} =
251+
assert {"--\n-- PostgreSQL database dump\n--\n\n" <> _rest, 0} =
252252
Postgres.dump_cmd(
253253
["--data-only", "--table", "schema_migrations"],
254254
[],
255255
PoolRepo.config()
256256
)
257257
end
258+
259+
defp redact_hashes(dump_output) do
260+
dump_output
261+
|> String.replace(~r/\\restrict\s+\S+/, "\\restrict <REDACTED>")
262+
|> String.replace(~r/\\unrestrict\s+\S+/, "\\unrestrict <REDACTED>")
263+
|> String.trim()
264+
end
258265
end

integration_test/sql/sql.exs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@ defmodule Ecto.Integration.SQLTest do
77
alias Ecto.Integration.Post
88
alias Ecto.Integration.CorruptedPk
99
alias Ecto.Integration.Tag
10-
import Ecto.Query, only: [from: 2]
10+
import Ecto.Query, only: [from: 2, from: 1]
11+
12+
test "fragment tuple sources" do
13+
query = from f in {fragment("select 1 as num"), Barebone}
14+
assert %Barebone{num: 1} = TestRepo.one(query)
15+
end
1116

1217
test "fragmented types" do
1318
datetime = ~N[2014-01-16 20:26:51]

lib/ecto/adapters/myxql/connection.ex

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -735,11 +735,11 @@ if Code.ensure_loaded?(MyXQL) do
735735
end
736736

737737
defp expr({:fragment, _, parts}, sources, query) do
738-
Enum.map(parts, fn
739-
{:raw, part} -> part
740-
{:expr, expr} -> expr(expr, sources, query)
741-
end)
742-
|> parens_for_select
738+
fragment_expr(parts, sources, query)
739+
end
740+
741+
defp expr({{:fragment, _, parts}, schema}, sources, query) when is_atom(schema) do
742+
fragment_expr(parts, sources, query)
743743
end
744744

745745
defp expr({:values, _, [types, _idx, num_rows]}, _, query) do
@@ -911,6 +911,14 @@ if Code.ensure_loaded?(MyXQL) do
911911
end)
912912
end
913913

914+
defp fragment_expr(parts, sources, query) do
915+
Enum.map(parts, fn
916+
{:raw, part} -> part
917+
{:expr, expr} -> expr(expr, sources, query)
918+
end)
919+
|> parens_for_select()
920+
end
921+
914922
defp interval(count, "millisecond", sources, query) do
915923
["INTERVAL (", expr(count, sources, query) | " * 1000) microsecond"]
916924
end
@@ -949,6 +957,9 @@ if Code.ensure_loaded?(MyXQL) do
949957
{:fragment, _, _} ->
950958
{nil, as_prefix ++ [?f | Integer.to_string(pos)], nil}
951959

960+
{{:fragment, _, _}, schema, _} ->
961+
{nil, as_prefix ++ [?f | Integer.to_string(pos)], schema}
962+
952963
{:values, _, _} ->
953964
{nil, as_prefix ++ [?v | Integer.to_string(pos)], nil}
954965

lib/ecto/adapters/postgres/connection.ex

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -974,11 +974,11 @@ if Code.ensure_loaded?(Postgrex) do
974974
end
975975

976976
defp expr({:fragment, _, parts}, sources, query) do
977-
Enum.map(parts, fn
978-
{:raw, part} -> part
979-
{:expr, expr} -> expr(expr, sources, query)
980-
end)
981-
|> parens_for_select
977+
fragment_expr(parts, sources, query)
978+
end
979+
980+
defp expr({{:fragment, _, parts}, schema}, sources, query) when is_atom(schema) do
981+
fragment_expr(parts, sources, query)
982982
end
983983

984984
defp expr({:values, _, [types, idx, num_rows]}, _, _query) do
@@ -1162,6 +1162,14 @@ if Code.ensure_loaded?(Postgrex) do
11621162
end)
11631163
end
11641164

1165+
defp fragment_expr(parts, sources, query) do
1166+
Enum.map(parts, fn
1167+
{:raw, part} -> part
1168+
{:expr, expr} -> expr(expr, sources, query)
1169+
end)
1170+
|> parens_for_select()
1171+
end
1172+
11651173
defp type_unless_typed(%Ecto.Query.Tagged{}, _type), do: []
11661174
defp type_unless_typed(_, type), do: [?:, ?: | type]
11671175

@@ -1226,6 +1234,9 @@ if Code.ensure_loaded?(Postgrex) do
12261234
{:fragment, _, _} ->
12271235
{nil, as_prefix ++ [?f | Integer.to_string(pos)], nil}
12281236

1237+
{{:fragment, _, _}, schema, _} ->
1238+
{nil, as_prefix ++ [?f | Integer.to_string(pos)], schema}
1239+
12291240
{:values, _, _} ->
12301241
{nil, as_prefix ++ [?v | Integer.to_string(pos)], nil}
12311242

lib/ecto/adapters/tds/connection.ex

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -815,11 +815,11 @@ if Code.ensure_loaded?(Tds) do
815815
end
816816

817817
defp expr({:fragment, _, parts}, sources, query) do
818-
Enum.map(parts, fn
819-
{:raw, part} -> part
820-
{:expr, expr} -> expr(expr, sources, query)
821-
end)
822-
|> parens_for_select
818+
fragment_expr(parts, sources, query)
819+
end
820+
821+
defp expr({{:fragment, _, parts}, schema}, sources, query) when is_atom(schema) do
822+
fragment_expr(parts, sources, query)
823823
end
824824

825825
defp expr({:values, _, [types, idx, num_rows]}, _, _query) do
@@ -1007,6 +1007,14 @@ if Code.ensure_loaded?(Tds) do
10071007
end)
10081008
end
10091009

1010+
defp fragment_expr(parts, sources, query) do
1011+
Enum.map(parts, fn
1012+
{:raw, part} -> part
1013+
{:expr, expr} -> expr(expr, sources, query)
1014+
end)
1015+
|> parens_for_select()
1016+
end
1017+
10101018
defp op_to_binary({op, _, [_, _]} = expr, sources, query) when op in @binary_ops do
10111019
paren_expr(expr, sources, query)
10121020
end
@@ -1070,6 +1078,9 @@ if Code.ensure_loaded?(Tds) do
10701078
{:fragment, _, _} ->
10711079
{nil, as_prefix ++ [?f | Integer.to_string(pos)], nil}
10721080

1081+
{{:fragment, _, _}, schema, _} ->
1082+
{nil, as_prefix ++ [?f | Integer.to_string(pos)], schema}
1083+
10731084
{:values, _, _} ->
10741085
{nil, as_prefix ++ [?v | Integer.to_string(pos)], nil}
10751086

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ defmodule EctoSQL.MixProject do
7676
if path = System.get_env("ECTO_PATH") do
7777
{:ecto, path: path}
7878
else
79-
{:ecto, "~> 3.13.0"}
79+
{:ecto, git: "https://github.com/elixir-ecto/ecto.git", branch: "master"}
8080
end
8181
end
8282

mix.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"},
55
"deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
66
"earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"},
7-
"ecto": {:hex, :ecto, "3.13.0", "7528ef4f3a4cdcfebeb7eb6545806c8109529b385a69f701fc3d77b5b8bde6e7", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "061f095f1cc097f71f743b500affc792d6869df22b1946a73ab5495eb9b4a280"},
7+
"ecto": {:git, "https://github.com/elixir-ecto/ecto.git", "3ab6a20b255fe2cee1fd9f6ae160c6fde772dce7", [branch: "master"]},
88
"ex_doc": {:hex, :ex_doc, "0.38.2", "504d25eef296b4dec3b8e33e810bc8b5344d565998cd83914ffe1b8503737c02", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "732f2d972e42c116a70802f9898c51b54916e542cc50968ac6980512ec90f42b"},
99
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
1010
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},

0 commit comments

Comments
 (0)