Skip to content

Commit f7615de

Browse files
Allow select merging maps with all nil values (#4601)
1 parent 4f19ff0 commit f7615de

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

Diff for: integration_test/cases/repo.exs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1538,14 +1538,14 @@ defmodule Ecto.Integration.RepoTest do
15381538
|> select_merge([_l, p], map(p, ^~w(title posted)a))
15391539
|> TestRepo.all()
15401540

1541-
# left join record is not present
1542-
assert [%{url: "Q", title: "Z", posted: nil}] =
1541+
# left join record is not present, we consider it the same as being present with nils
1542+
assert [%{url: "Q", title: nil, posted: nil}] =
15431543
Permalink
15441544
|> join(:left, [l], p in Post, on: l.post_id == p.id and p.public == true)
15451545
|> select([l, p], merge(l, map(p, ^~w(title posted)a)))
15461546
|> TestRepo.all()
15471547

1548-
assert [%{url: "Q", title: "Z", posted: nil}] =
1548+
assert [%{url: "Q", title: nil, posted: nil}] =
15491549
Permalink
15501550
|> join(:left, [l], p in Post, on: l.post_id == p.id and p.public == true)
15511551
|> select_merge([_l, p], map(p, ^~w(title posted)a))

Diff for: lib/ecto/repo/queryable.ex

+10-1
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ defmodule Ecto.Repo.Queryable do
310310

311311
defp process(row, {:merge, left, right}, from, adapter) do
312312
{left, row} = process(row, left, from, adapter)
313-
{right, row} = process(row, right, from, adapter)
313+
{right, row} = process_merge(row, right, from, adapter)
314314

315315
data =
316316
case {left, right} do
@@ -427,6 +427,15 @@ defmodule Ecto.Repo.Queryable do
427427
end)
428428
end
429429

430+
defp process_merge(row, {:source, {source, schema}, prefix, types}, _from, adapter) do
431+
struct = Ecto.Schema.Loader.load_struct(schema, prefix, source)
432+
struct_load!(types, row, [], false, struct, adapter)
433+
end
434+
435+
defp process_merge(row, process, from, adapter) do
436+
process(row, process, from, adapter)
437+
end
438+
430439
@compile {:inline, load!: 5}
431440
defp load!(type, value, field, struct, adapter) do
432441
case Ecto.Type.adapter_load(adapter, type, value) do

0 commit comments

Comments
 (0)