Skip to content

Commit 6345716

Browse files
allow string names in field/2 (#596)
1 parent 8012355 commit 6345716

File tree

8 files changed

+40
-9
lines changed

8 files changed

+40
-9
lines changed

lib/ecto/adapters/myxql/connection.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,14 +671,14 @@ if Code.ensure_loaded?(MyXQL) do
671671
end
672672

673673
defp expr({{:., _, [{:parent_as, _, [as]}, field]}, _, []}, _sources, query)
674-
when is_atom(field) do
674+
when is_atom(field) or is_binary(field) do
675675
{ix, sources} = get_parent_sources_ix(query, as)
676676
{_, name, _} = elem(sources, ix)
677677
[name, ?. | quote_name(field)]
678678
end
679679

680680
defp expr({{:., _, [{:&, _, [idx]}, field]}, _, []}, sources, _query)
681-
when is_atom(field) do
681+
when is_atom(field) or is_binary(field) do
682682
{_, name, _} = elem(sources, idx)
683683
[name, ?. | quote_name(field)]
684684
end

lib/ecto/adapters/postgres/connection.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -916,12 +916,13 @@ if Code.ensure_loaded?(Postgrex) do
916916
end
917917

918918
defp expr({{:., _, [{:parent_as, _, [as]}, field]}, _, []}, _sources, query)
919-
when is_atom(field) do
919+
when is_atom(field) or is_binary(field) do
920920
{ix, sources} = get_parent_sources_ix(query, as)
921921
quote_qualified_name(field, sources, ix)
922922
end
923923

924-
defp expr({{:., _, [{:&, _, [idx]}, field]}, _, []}, sources, _query) when is_atom(field) do
924+
defp expr({{:., _, [{:&, _, [idx]}, field]}, _, []}, sources, _query)
925+
when is_atom(field) or is_binary(field) do
925926
quote_qualified_name(field, sources, idx)
926927
end
927928

lib/ecto/adapters/tds/connection.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ if Code.ensure_loaded?(Tds) do
733733
end
734734

735735
defp expr({{:., _, [{:parent_as, _, [as]}, field]}, _, []}, _sources, query)
736-
when is_atom(field) do
736+
when is_atom(field) or is_binary(field) do
737737
{ix, sources} = get_parent_sources_ix(query, as)
738738
{_, name, _} = elem(sources, ix)
739739
[name, ?. | quote_name(field)]

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ defmodule EctoSQL.MixProject do
7676
if path = System.get_env("ECTO_PATH") do
7777
{:ecto, path: path}
7878
else
79-
{:ecto, "~> 3.12"}
79+
{:ecto, github: "elixir-ecto/ecto"}
8080
end
8181
end
8282

mix.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
%{
22
"benchee": {:hex, :benchee, "1.2.0", "afd2f0caec06ce3a70d9c91c514c0b58114636db9d83c2dc6bfd416656618353", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}, {:statistex, "~> 1.0", [hex: :statistex, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "ee729e53217898b8fd30aaad3cce61973dab61574ae6f48229fe7ff42d5e4457"},
33
"db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"},
4-
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
4+
"decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"},
55
"deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
66
"earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"},
7-
"ecto": {:hex, :ecto, "3.12.0", "9014a3ccac7f91e680b9d237d461ebe3d4e16d62ca8e355d540e2c6afdc28309", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "41e781a76e131093af8e1edf68b1319bf320878faff58da41ffa4b10fc6ff678"},
7+
"ecto": {:git, "https://github.com/elixir-ecto/ecto.git", "4990abda4c504133f89deed469582785166208f5", []},
88
"ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"},
99
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
1010
"makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"},
@@ -15,5 +15,5 @@
1515
"postgrex": {:hex, :postgrex, "0.19.0", "f7d50e50cb42e0a185f5b9a6095125a9ab7e4abccfbe2ab820ab9aa92b71dbab", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "dba2d2a0a8637defbf2307e8629cb2526388ba7348f67d04ec77a5d6a72ecfae"},
1616
"statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"},
1717
"tds": {:hex, :tds, "2.3.4", "534749dd9ef61af960fcafa9cbb7186d6d7b9f92ea0133fb25da07b121c8295c", [:mix], [{:db_connection, "~> 2.0", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "bb9a53d4688a85fd566f342f76b50d39adfc4b410062886ef908365ead24ba3f"},
18-
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
18+
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
1919
}

test/ecto/adapters/myxql_test.exs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,6 +1627,16 @@ defmodule Ecto.Adapters.MyXQLTest do
16271627
end)
16281628
end
16291629

1630+
test "field/2 with string name" do
1631+
query = from(s in "schema", select: field(s, "x")) |> plan(:all) |> all()
1632+
assert query == ~s{SELECT s0.`x` FROM `schema` AS s0}
1633+
1634+
query =
1635+
from(s in "schema", as: :schema, select: field(as(:schema), "x")) |> plan(:all) |> all()
1636+
1637+
assert query == ~s{SELECT s0.`x` FROM `schema` AS s0}
1638+
end
1639+
16301640
# DDL
16311641

16321642
import Ecto.Migration,

test/ecto/adapters/postgres_test.exs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2033,6 +2033,16 @@ defmodule Ecto.Adapters.PostgresTest do
20332033
end)
20342034
end
20352035

2036+
test "field/2 with string name" do
2037+
query = from(s in "schema", select: field(s, "x")) |> plan(:all) |> all()
2038+
assert query == ~s{SELECT s0."x" FROM "schema" AS s0}
2039+
2040+
query =
2041+
from(s in "schema", as: :schema, select: field(as(:schema), "x")) |> plan(:all) |> all()
2042+
2043+
assert query == ~s{SELECT s0."x" FROM "schema" AS s0}
2044+
end
2045+
20362046
# DDL
20372047

20382048
alias Ecto.Migration.Reference

test/ecto/adapters/tds_test.exs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,6 +1397,16 @@ defmodule Ecto.Adapters.TdsTest do
13971397
end)
13981398
end
13991399

1400+
test "field/2 with string name" do
1401+
query = from(s in "schema", select: field(s, "x")) |> plan(:all) |> all()
1402+
assert query == ~s{SELECT s0.[x] FROM [schema] AS s0}
1403+
1404+
query =
1405+
from(s in "schema", as: :schema, select: field(as(:schema), "x")) |> plan(:all) |> all()
1406+
1407+
assert query == ~s{SELECT s0.[x] FROM [schema] AS s0}
1408+
end
1409+
14001410
## DDL
14011411

14021412
import Ecto.Migration,

0 commit comments

Comments
 (0)