Skip to content

Commit b0d839b

Browse files
authored
Handle atom list sigils in select (#3804)
Atom list sigils were being escaped as literals instead of going into select_expr.take.
1 parent e848bc7 commit b0d839b

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

lib/ecto/query/builder/select.ex

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ defmodule Ecto.Query.Builder.Select do
3434
def escape(other, vars, env) do
3535
cond do
3636
take?(other) ->
37-
{{:{}, [], [:&, [], [0]]}, {[], %{0 => {:any, other}}}}
37+
{{:{}, [], [:&, [], [0]]}, {[], %{0 => {:any, Macro.expand(other, env)}}}}
3838

3939
maybe_take?(other) ->
4040
Builder.error! """
@@ -156,6 +156,11 @@ defmodule Ecto.Query.Builder.Select do
156156
end
157157
end
158158

159+
# atom list sigils
160+
defp take?({name, _, [_, modifiers]}) when name in ~w(sigil_w sigil_W)a do
161+
?a in modifiers
162+
end
163+
159164
defp take?(fields) do
160165
is_list(fields) and Enum.all?(fields, fn
161166
{k, v} when is_atom(k) -> take?(List.wrap(v))

test/ecto/query/builder/select_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ defmodule Ecto.Query.Builder.SelectTest do
5959
fields = ~w[field]a
6060
assert select("q", [q], map(q, ~w[field]a)).select.take == %{0 => {:map, fields}}
6161
assert select("q", [q], struct(q, @fields)).select.take == %{0 => {:struct, fields}}
62+
assert select("q", [q], ~w[field]a).select.take == %{0 => {:any, fields}}
6263
end
6364

6465
test "raises on single atom" do

0 commit comments

Comments
 (0)