Skip to content

Commit 652894c

Browse files
committed
Keep literals in insert_all, closes #348
1 parent 3bc8755 commit 652894c

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

lib/ecto/query/planner.ex

+3-2
Original file line numberDiff line numberDiff line change
@@ -926,14 +926,15 @@ defmodule Ecto.Query.Planner do
926926
query
927927
|> normalize_query(operation, adapter, counter)
928928
|> elem(0)
929-
|> normalize_select(keep_literals?(query))
929+
|> normalize_select(keep_literals?(operation, query))
930930
rescue
931931
e ->
932932
# Reraise errors so we ignore the planner inner stacktrace
933933
filter_and_reraise e, __STACKTRACE__
934934
end
935935

936-
defp keep_literals?(%{combinations: combinations}), do: combinations != []
936+
defp keep_literals?(:insert_all, _), do: true
937+
defp keep_literals?(_, %{combinations: combinations}), do: combinations != []
937938

938939
defp normalize_query(query, operation, adapter, counter) do
939940
case operation do

test/ecto/repo_test.exs

+20
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,26 @@ defmodule Ecto.RepoTest do
532532
assert ["one", "two", "ten"] = params
533533
end
534534

535+
test "takes query as datasource with literals" do
536+
import Ecto.Query
537+
538+
threshold = "ten"
539+
540+
query = from s in MySchema,
541+
where: s.x > ^threshold,
542+
select: %{
543+
foo: s.x,
544+
bar: "bar",
545+
baz: nil
546+
}
547+
548+
TestRepo.insert_all(MySchema, query)
549+
550+
assert_received {:insert_all, %{source: "my_schema"}, {%Ecto.Query{} = query, params}}
551+
assert [{{:., _, [{:&, [], [0]}, :x]}, _, []}, "bar", nil] = query.select.fields
552+
assert ["ten"] = params
553+
end
554+
535555
test "raises when a bad query is given as source" do
536556
assert_raise ArgumentError, fn ->
537557
TestRepo.insert_all(MySchema, from(s in MySchema))

0 commit comments

Comments
 (0)