diff --git a/integration_test/cases/repo.exs b/integration_test/cases/repo.exs index 9a1bdc0d69..e0abe00748 100644 --- a/integration_test/cases/repo.exs +++ b/integration_test/cases/repo.exs @@ -1538,14 +1538,14 @@ defmodule Ecto.Integration.RepoTest do |> select_merge([_l, p], map(p, ^~w(title posted)a)) |> TestRepo.all() - # left join record is not present - assert [%{url: "Q", title: "Z", posted: nil}] = + # left join record is not present, we consider it the same as being present with nils + assert [%{url: "Q", title: nil, posted: nil}] = Permalink |> join(:left, [l], p in Post, on: l.post_id == p.id and p.public == true) |> select([l, p], merge(l, map(p, ^~w(title posted)a))) |> TestRepo.all() - assert [%{url: "Q", title: "Z", posted: nil}] = + assert [%{url: "Q", title: nil, posted: nil}] = Permalink |> join(:left, [l], p in Post, on: l.post_id == p.id and p.public == true) |> select_merge([_l, p], map(p, ^~w(title posted)a)) diff --git a/lib/ecto/repo/queryable.ex b/lib/ecto/repo/queryable.ex index 8e4ced5c29..f9d5afd043 100644 --- a/lib/ecto/repo/queryable.ex +++ b/lib/ecto/repo/queryable.ex @@ -310,7 +310,7 @@ defmodule Ecto.Repo.Queryable do defp process(row, {:merge, left, right}, from, adapter) do {left, row} = process(row, left, from, adapter) - {right, row} = process(row, right, from, adapter) + {right, row} = process_merge(row, right, from, adapter) data = case {left, right} do @@ -427,6 +427,15 @@ defmodule Ecto.Repo.Queryable do end) end + defp process_merge(row, {:source, {source, schema}, prefix, types}, _from, adapter) do + struct = Ecto.Schema.Loader.load_struct(schema, prefix, source) + struct_load!(types, row, [], false, struct, adapter) + end + + defp process_merge(row, process, from, adapter) do + process(row, process, from, adapter) + end + @compile {:inline, load!: 5} defp load!(type, value, field, struct, adapter) do case Ecto.Type.adapter_load(adapter, type, value) do