Skip to content

Commit 97cd03c

Browse files
allow fragment tuple sources
1 parent 84dd74c commit 97cd03c

File tree

4 files changed

+54
-16
lines changed

4 files changed

+54
-16
lines changed

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

0 commit comments

Comments
 (0)