From 2db0622cff43f9c27835705322301b165dde09e2 Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Sat, 1 Jan 2022 14:08:04 -0500 Subject: [PATCH 01/11] :prepare option for postgres --- lib/ecto/adapters/postgres/connection.ex | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/ecto/adapters/postgres/connection.ex b/lib/ecto/adapters/postgres/connection.ex index 0ea2fc76..d8214d14 100644 --- a/lib/ecto/adapters/postgres/connection.ex +++ b/lib/ecto/adapters/postgres/connection.ex @@ -67,6 +67,8 @@ if Code.ensure_loaded?(Postgrex) do @impl true def prepare_execute(conn, name, sql, params, opts) do + name = prepared_name(name, opts[:prepare]) + case Postgrex.prepare_execute(conn, name, sql, params, opts) do {:error, %Postgrex.Error{postgres: %{pg_code: "22P02", message: message}} = error} -> context = """ @@ -86,6 +88,9 @@ if Code.ensure_loaded?(Postgrex) do end + defp prepared_name(_, :unnamed), do: "" + defp prepared_name(name, _), do: name + @impl true def query(conn, sql, params, opts) do Postgrex.query(conn, sql, params, opts) From ee8e00badf526c977c7ba02b6e5d53ff26e23f79 Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Sat, 1 Jan 2022 15:37:16 -0500 Subject: [PATCH 02/11] in case :prepare option conflicts with postgrex in future --- lib/ecto/adapters/postgres/connection.ex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ecto/adapters/postgres/connection.ex b/lib/ecto/adapters/postgres/connection.ex index d8214d14..beaa63c7 100644 --- a/lib/ecto/adapters/postgres/connection.ex +++ b/lib/ecto/adapters/postgres/connection.ex @@ -67,9 +67,9 @@ if Code.ensure_loaded?(Postgrex) do @impl true def prepare_execute(conn, name, sql, params, opts) do - name = prepared_name(name, opts[:prepare]) + {prepare, opts} = Keyword.pop(opts, :prepare) - case Postgrex.prepare_execute(conn, name, sql, params, opts) do + case Postgrex.prepare_execute(conn, prepare_name(name, prepare), sql, params, opts) do {:error, %Postgrex.Error{postgres: %{pg_code: "22P02", message: message}} = error} -> context = """ . If you are trying to query a JSON field, the parameter must be interpolated. Instead of @@ -88,8 +88,8 @@ if Code.ensure_loaded?(Postgrex) do end - defp prepared_name(_, :unnamed), do: "" - defp prepared_name(name, _), do: name + defp prepare_name(_, :unnamed), do: "" + defp prepare_name(name, _), do: name @impl true def query(conn, sql, params, opts) do From 42cc2b72b7a3eaee12f37efb85cf7a7f968febfa Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Sun, 2 Jan 2022 20:52:54 -0500 Subject: [PATCH 03/11] review comments --- lib/ecto/adapters/postgres.ex | 21 +++++++++++++++ lib/ecto/adapters/postgres/connection.ex | 7 +---- lib/ecto/adapters/sql.ex | 33 +++++++++++++++++++----- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/lib/ecto/adapters/postgres.ex b/lib/ecto/adapters/postgres.ex index 7555e374..c833375f 100644 --- a/lib/ecto/adapters/postgres.ex +++ b/lib/ecto/adapters/postgres.ex @@ -106,6 +106,7 @@ defmodule Ecto.Adapters.Postgres do @behaviour Ecto.Adapter.Structure @default_maintenance_database "postgres" + @default_prepare_opt :named @doc """ All Ecto extensions for Postgrex. @@ -121,6 +122,26 @@ defmodule Ecto.Adapters.Postgres do def dumpers(:binary_id, type), do: [type, Ecto.UUID] def dumpers(_, type), do: [type] + ## Query API + + @impl Ecto.Adapter.Queryable + def execute(adapter_meta, query_meta, query, params, opts) do + prepare = Keyword.get(opts, :prepare, @default_prepare_opt) + + unless valid_prepare?(prepare) do + raise ArgumentError, + "expected option `:prepare` to be either `:named` or `:unnamed`, got: #{inspect(prepare)}" + end + + Ecto.Adapters.SQL.execute(adapter_meta, query_meta, query, params, put_use_cache(opts, prepare)) + end + + defp valid_prepare?(prepare) when prepare in [:named, :unnamed], do: true + defp valid_prepare?(_), do: false + + defp put_use_cache(opts, :named), do: Keyword.put(opts, :use_cache, true) + defp put_use_cache(opts, :unnamed), do: Keyword.put(opts, :use_cache, false) + ## Storage API @impl true diff --git a/lib/ecto/adapters/postgres/connection.ex b/lib/ecto/adapters/postgres/connection.ex index beaa63c7..0ea2fc76 100644 --- a/lib/ecto/adapters/postgres/connection.ex +++ b/lib/ecto/adapters/postgres/connection.ex @@ -67,9 +67,7 @@ if Code.ensure_loaded?(Postgrex) do @impl true def prepare_execute(conn, name, sql, params, opts) do - {prepare, opts} = Keyword.pop(opts, :prepare) - - case Postgrex.prepare_execute(conn, prepare_name(name, prepare), sql, params, opts) do + case Postgrex.prepare_execute(conn, name, sql, params, opts) do {:error, %Postgrex.Error{postgres: %{pg_code: "22P02", message: message}} = error} -> context = """ . If you are trying to query a JSON field, the parameter must be interpolated. Instead of @@ -88,9 +86,6 @@ if Code.ensure_loaded?(Postgrex) do end - defp prepare_name(_, :unnamed), do: "" - defp prepare_name(name, _), do: name - @impl true def query(conn, sql, params, opts) do Postgrex.query(conn, sql, params, opts) diff --git a/lib/ecto/adapters/sql.ex b/lib/ecto/adapters/sql.ex index 3d9c039b..c2dd9f1e 100644 --- a/lib/ecto/adapters/sql.ex +++ b/lib/ecto/adapters/sql.ex @@ -129,6 +129,7 @@ defmodule Ecto.Adapters.SQL do @impl true def execute(adapter_meta, query_meta, query, params, opts) do + opts = Keyword.put(opts, :use_cache, true) Ecto.Adapters.SQL.execute(adapter_meta, query_meta, query, params, opts) end @@ -690,25 +691,39 @@ defmodule Ecto.Adapters.SQL do @doc false def execute(adapter_meta, query_meta, prepared, params, opts) do + {use_cache?, opts} = Keyword.pop(opts, :use_cache) + %{num_rows: num, rows: rows} = - execute!(adapter_meta, prepared, params, put_source(opts, query_meta)) + execute!(use_cache?, adapter_meta, prepared, params, put_source(opts, query_meta)) {num, rows} end - defp execute!(adapter_meta, {:cache, update, {id, prepared}}, params, opts) do - name = "ecto_" <> Integer.to_string(id) + defp execute!(use_cache?, adapter_meta, {:cache, update, {id, prepared}}, params, opts) do + name = prepare_name(use_cache?, id) case sql_call(adapter_meta, :prepare_execute, [name, prepared], params, opts) do {:ok, query, result} -> - update.({id, query}) + maybe_update_cache(use_cache?, update, {id, query}) + result + {:error, err} -> + raise_sql_call_error err + end + end + + defp execute!(false = use_cache?, adapter_meta, {:cached, _update, _reset, {id, cached}}, params, opts) do + name = prepare_name(use_cache?, id) + prepared = String.Chars.to_string(cached) + + case sql_call(adapter_meta, :prepare_execute, [name, prepared], params, opts) do + {:ok, _query, result} -> result {:error, err} -> raise_sql_call_error err end end - defp execute!(adapter_meta, {:cached, update, reset, {id, cached}}, params, opts) do + defp execute!(true = _use_cache?, adapter_meta, {:cached, update, reset, {id, cached}}, params, opts) do case sql_call(adapter_meta, :execute, [cached], params, opts) do {:ok, query, result} -> update.({id, query}) @@ -723,13 +738,19 @@ defmodule Ecto.Adapters.SQL do end end - defp execute!(adapter_meta, {:nocache, {_id, prepared}}, params, opts) do + defp execute!(_use_cache?, adapter_meta, {:nocache, {_id, prepared}}, params, opts) do case sql_call(adapter_meta, :query, [prepared], params, opts) do {:ok, res} -> res {:error, err} -> raise_sql_call_error err end end + defp prepare_name(true = _use_cache?, id), do: "ecto_" <> Integer.to_string(id) + defp prepare_name(false = _use_cache?, _id), do: "" + + defp maybe_update_cache(true = _use_cache?, update, value), do: update.(value) + defp maybe_update_cache(false = _use_cache?, _update, _value), do: :noop + @doc false def stream(adapter_meta, query_meta, prepared, params, opts) do do_stream(adapter_meta, prepared, params, put_source(opts, query_meta)) From b7f5f5763d2b3149341f618b4050d28c113f55b5 Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Sun, 2 Jan 2022 21:43:36 -0500 Subject: [PATCH 04/11] some cleanup --- lib/ecto/adapters/postgres/connection.ex | 2 ++ lib/ecto/adapters/sql.ex | 12 +++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/ecto/adapters/postgres/connection.ex b/lib/ecto/adapters/postgres/connection.ex index 0ea2fc76..5e741a76 100644 --- a/lib/ecto/adapters/postgres/connection.ex +++ b/lib/ecto/adapters/postgres/connection.ex @@ -67,6 +67,8 @@ if Code.ensure_loaded?(Postgrex) do @impl true def prepare_execute(conn, name, sql, params, opts) do + name = if opts[:use_cache?], do: name, else: "" + case Postgrex.prepare_execute(conn, name, sql, params, opts) do {:error, %Postgrex.Error{postgres: %{pg_code: "22P02", message: message}} = error} -> context = """ diff --git a/lib/ecto/adapters/sql.ex b/lib/ecto/adapters/sql.ex index c2dd9f1e..967cc72a 100644 --- a/lib/ecto/adapters/sql.ex +++ b/lib/ecto/adapters/sql.ex @@ -129,7 +129,6 @@ defmodule Ecto.Adapters.SQL do @impl true def execute(adapter_meta, query_meta, query, params, opts) do - opts = Keyword.put(opts, :use_cache, true) Ecto.Adapters.SQL.execute(adapter_meta, query_meta, query, params, opts) end @@ -691,7 +690,7 @@ defmodule Ecto.Adapters.SQL do @doc false def execute(adapter_meta, query_meta, prepared, params, opts) do - {use_cache?, opts} = Keyword.pop(opts, :use_cache) + use_cache? = Keyword.get(opts, :use_cache, true) %{num_rows: num, rows: rows} = execute!(use_cache?, adapter_meta, prepared, params, put_source(opts, query_meta)) @@ -700,7 +699,7 @@ defmodule Ecto.Adapters.SQL do end defp execute!(use_cache?, adapter_meta, {:cache, update, {id, prepared}}, params, opts) do - name = prepare_name(use_cache?, id) + name = prepare_name(id) case sql_call(adapter_meta, :prepare_execute, [name, prepared], params, opts) do {:ok, query, result} -> @@ -711,8 +710,8 @@ defmodule Ecto.Adapters.SQL do end end - defp execute!(false = use_cache?, adapter_meta, {:cached, _update, _reset, {id, cached}}, params, opts) do - name = prepare_name(use_cache?, id) + defp execute!(false = _use_cache?, adapter_meta, {:cached, _update, _reset, {id, cached}}, params, opts) do + name = prepare_name(id) prepared = String.Chars.to_string(cached) case sql_call(adapter_meta, :prepare_execute, [name, prepared], params, opts) do @@ -745,8 +744,7 @@ defmodule Ecto.Adapters.SQL do end end - defp prepare_name(true = _use_cache?, id), do: "ecto_" <> Integer.to_string(id) - defp prepare_name(false = _use_cache?, _id), do: "" + defp prepare_name(id), do: "ecto_" <> Integer.to_string(id) defp maybe_update_cache(true = _use_cache?, update, value), do: update.(value) defp maybe_update_cache(false = _use_cache?, _update, _value), do: :noop From 7f3d736a3fc6dc6151329865cf2b4d034ac0170c Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Sun, 2 Jan 2022 23:33:46 -0500 Subject: [PATCH 05/11] fix key name --- lib/ecto/adapters/postgres/connection.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ecto/adapters/postgres/connection.ex b/lib/ecto/adapters/postgres/connection.ex index 5e741a76..360ef1e5 100644 --- a/lib/ecto/adapters/postgres/connection.ex +++ b/lib/ecto/adapters/postgres/connection.ex @@ -67,7 +67,7 @@ if Code.ensure_loaded?(Postgrex) do @impl true def prepare_execute(conn, name, sql, params, opts) do - name = if opts[:use_cache?], do: name, else: "" + name = if opts[:use_cache], do: name, else: "" case Postgrex.prepare_execute(conn, name, sql, params, opts) do {:error, %Postgrex.Error{postgres: %{pg_code: "22P02", message: message}} = error} -> From ee2524ce12003ff43d38ac0ee8ee40484ca7b44a Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Mon, 3 Jan 2022 09:33:38 -0500 Subject: [PATCH 06/11] no use_cache --- lib/ecto/adapters/postgres.ex | 12 +++++++----- lib/ecto/adapters/postgres/connection.ex | 2 +- lib/ecto/adapters/sql.ex | 18 +++++++++--------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/lib/ecto/adapters/postgres.ex b/lib/ecto/adapters/postgres.ex index c833375f..7bd77636 100644 --- a/lib/ecto/adapters/postgres.ex +++ b/lib/ecto/adapters/postgres.ex @@ -21,6 +21,10 @@ defmodule Ecto.Adapters.Postgres do config :your_app, YourApp.Repo, ... + The `:prepare` option may be specified per operation: + + YourApp.Repo.all(Queryable, prepare: :unnamed) + ### Connection options * `:hostname` - Server hostname @@ -126,22 +130,20 @@ defmodule Ecto.Adapters.Postgres do @impl Ecto.Adapter.Queryable def execute(adapter_meta, query_meta, query, params, opts) do - prepare = Keyword.get(opts, :prepare, @default_prepare_opt) + opts = Keyword.put_new(opts, :prepare, @default_prepare_opt) + prepare = opts[:prepare] unless valid_prepare?(prepare) do raise ArgumentError, "expected option `:prepare` to be either `:named` or `:unnamed`, got: #{inspect(prepare)}" end - Ecto.Adapters.SQL.execute(adapter_meta, query_meta, query, params, put_use_cache(opts, prepare)) + Ecto.Adapters.SQL.execute(adapter_meta, query_meta, query, params, opts) end defp valid_prepare?(prepare) when prepare in [:named, :unnamed], do: true defp valid_prepare?(_), do: false - defp put_use_cache(opts, :named), do: Keyword.put(opts, :use_cache, true) - defp put_use_cache(opts, :unnamed), do: Keyword.put(opts, :use_cache, false) - ## Storage API @impl true diff --git a/lib/ecto/adapters/postgres/connection.ex b/lib/ecto/adapters/postgres/connection.ex index 360ef1e5..17789b41 100644 --- a/lib/ecto/adapters/postgres/connection.ex +++ b/lib/ecto/adapters/postgres/connection.ex @@ -67,7 +67,7 @@ if Code.ensure_loaded?(Postgrex) do @impl true def prepare_execute(conn, name, sql, params, opts) do - name = if opts[:use_cache], do: name, else: "" + name = if opts[:prepare] == :named, do: name, else: "" case Postgrex.prepare_execute(conn, name, sql, params, opts) do {:error, %Postgrex.Error{postgres: %{pg_code: "22P02", message: message}} = error} -> diff --git a/lib/ecto/adapters/sql.ex b/lib/ecto/adapters/sql.ex index 967cc72a..c62c29a5 100644 --- a/lib/ecto/adapters/sql.ex +++ b/lib/ecto/adapters/sql.ex @@ -690,27 +690,27 @@ defmodule Ecto.Adapters.SQL do @doc false def execute(adapter_meta, query_meta, prepared, params, opts) do - use_cache? = Keyword.get(opts, :use_cache, true) + prepare = Keyword.get(opts, :prepare, :named) %{num_rows: num, rows: rows} = - execute!(use_cache?, adapter_meta, prepared, params, put_source(opts, query_meta)) + execute!(prepare, adapter_meta, prepared, params, put_source(opts, query_meta)) {num, rows} end - defp execute!(use_cache?, adapter_meta, {:cache, update, {id, prepared}}, params, opts) do + defp execute!(prepare, adapter_meta, {:cache, update, {id, prepared}}, params, opts) do name = prepare_name(id) case sql_call(adapter_meta, :prepare_execute, [name, prepared], params, opts) do {:ok, query, result} -> - maybe_update_cache(use_cache?, update, {id, query}) + maybe_update_cache(prepare, update, {id, query}) result {:error, err} -> raise_sql_call_error err end end - defp execute!(false = _use_cache?, adapter_meta, {:cached, _update, _reset, {id, cached}}, params, opts) do + defp execute!(:unnamed = _prepare, adapter_meta, {:cached, _update, _reset, {id, cached}}, params, opts) do name = prepare_name(id) prepared = String.Chars.to_string(cached) @@ -722,7 +722,7 @@ defmodule Ecto.Adapters.SQL do end end - defp execute!(true = _use_cache?, adapter_meta, {:cached, update, reset, {id, cached}}, params, opts) do + defp execute!(:named = _prepare, adapter_meta, {:cached, update, reset, {id, cached}}, params, opts) do case sql_call(adapter_meta, :execute, [cached], params, opts) do {:ok, query, result} -> update.({id, query}) @@ -737,7 +737,7 @@ defmodule Ecto.Adapters.SQL do end end - defp execute!(_use_cache?, adapter_meta, {:nocache, {_id, prepared}}, params, opts) do + defp execute!(_prepare, adapter_meta, {:nocache, {_id, prepared}}, params, opts) do case sql_call(adapter_meta, :query, [prepared], params, opts) do {:ok, res} -> res {:error, err} -> raise_sql_call_error err @@ -746,8 +746,8 @@ defmodule Ecto.Adapters.SQL do defp prepare_name(id), do: "ecto_" <> Integer.to_string(id) - defp maybe_update_cache(true = _use_cache?, update, value), do: update.(value) - defp maybe_update_cache(false = _use_cache?, _update, _value), do: :noop + defp maybe_update_cache(:named = _prepare, update, value), do: update.(value) + defp maybe_update_cache(:unnamed = _prepare, _update, _value), do: :noop @doc false def stream(adapter_meta, query_meta, prepared, params, opts) do From da5d3f65e1aff473c1b64b66dc7fca2c4632fac4 Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Mon, 3 Jan 2022 09:39:04 -0500 Subject: [PATCH 07/11] integration test --- integration_test/pg/prepare_test.exs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 integration_test/pg/prepare_test.exs diff --git a/integration_test/pg/prepare_test.exs b/integration_test/pg/prepare_test.exs new file mode 100644 index 00000000..3e9ee56f --- /dev/null +++ b/integration_test/pg/prepare_test.exs @@ -0,0 +1,14 @@ +defmodule Ecto.Integration.CopyTest do + use Ecto.Integration.Case, async: true + + alias Ecto.Integration.TestRepo + alias Ecto.Integration.Post + + test "prepare option" do + one = TestRepo.insert!(%Post{title: "one"}) + two = TestRepo.insert!(%Post{title: "two"}) + + assert TestRepo.all(Post, prepare: :unnamed) == [one, two] + assert TestRepo.all(Post, prepare: :named) == [one, two] + end +end From d9c74c705ca15f08844aa04607016518f57d643c Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Mon, 3 Jan 2022 09:39:32 -0500 Subject: [PATCH 08/11] rename integration test --- integration_test/pg/prepare_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_test/pg/prepare_test.exs b/integration_test/pg/prepare_test.exs index 3e9ee56f..d2e5f39a 100644 --- a/integration_test/pg/prepare_test.exs +++ b/integration_test/pg/prepare_test.exs @@ -1,4 +1,4 @@ -defmodule Ecto.Integration.CopyTest do +defmodule Ecto.Integration.PrepareTest do use Ecto.Integration.Case, async: true alias Ecto.Integration.TestRepo From 624dbb17ea64bd0bc6a8f5483a8c95d49478291f Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Mon, 3 Jan 2022 10:58:05 -0500 Subject: [PATCH 09/11] fix prepare passing --- lib/ecto/adapters/postgres.ex | 5 ++--- lib/ecto/adapters/sql.ex | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/ecto/adapters/postgres.ex b/lib/ecto/adapters/postgres.ex index 7bd77636..d0665606 100644 --- a/lib/ecto/adapters/postgres.ex +++ b/lib/ecto/adapters/postgres.ex @@ -130,15 +130,14 @@ defmodule Ecto.Adapters.Postgres do @impl Ecto.Adapter.Queryable def execute(adapter_meta, query_meta, query, params, opts) do - opts = Keyword.put_new(opts, :prepare, @default_prepare_opt) - prepare = opts[:prepare] + prepare = Keyword.get(opts, :prepare, @default_prepare_opt) unless valid_prepare?(prepare) do raise ArgumentError, "expected option `:prepare` to be either `:named` or `:unnamed`, got: #{inspect(prepare)}" end - Ecto.Adapters.SQL.execute(adapter_meta, query_meta, query, params, opts) + Ecto.Adapters.SQL.execute(prepare, adapter_meta, query_meta, query, params, opts) end defp valid_prepare?(prepare) when prepare in [:named, :unnamed], do: true diff --git a/lib/ecto/adapters/sql.ex b/lib/ecto/adapters/sql.ex index c62c29a5..4d68e8fc 100644 --- a/lib/ecto/adapters/sql.ex +++ b/lib/ecto/adapters/sql.ex @@ -129,7 +129,7 @@ defmodule Ecto.Adapters.SQL do @impl true def execute(adapter_meta, query_meta, query, params, opts) do - Ecto.Adapters.SQL.execute(adapter_meta, query_meta, query, params, opts) + Ecto.Adapters.SQL.execute(:named, adapter_meta, query_meta, query, params, opts) end @impl true @@ -689,9 +689,7 @@ defmodule Ecto.Adapters.SQL do end @doc false - def execute(adapter_meta, query_meta, prepared, params, opts) do - prepare = Keyword.get(opts, :prepare, :named) - + def execute(prepare, adapter_meta, query_meta, prepared, params, opts) do %{num_rows: num, rows: rows} = execute!(prepare, adapter_meta, prepared, params, put_source(opts, query_meta)) From 755504e8c67b8ee0a9be07c64873d7d462835652 Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Tue, 4 Jan 2022 00:06:23 -0500 Subject: [PATCH 10/11] improve integration test --- integration_test/pg/prepare_test.exs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/integration_test/pg/prepare_test.exs b/integration_test/pg/prepare_test.exs index d2e5f39a..ea502053 100644 --- a/integration_test/pg/prepare_test.exs +++ b/integration_test/pg/prepare_test.exs @@ -8,6 +8,11 @@ defmodule Ecto.Integration.PrepareTest do one = TestRepo.insert!(%Post{title: "one"}) two = TestRepo.insert!(%Post{title: "two"}) + # Uncached + assert TestRepo.all(Post, prepare: :unnamed) == [one, two] + assert TestRepo.all(Post, prepare: :named) == [one, two] + + # Cached assert TestRepo.all(Post, prepare: :unnamed) == [one, two] assert TestRepo.all(Post, prepare: :named) == [one, two] end From ab63412e056bbe7e7c90cf0b1757006de8a35819 Mon Sep 17 00:00:00 2001 From: Greg Rychlewski Date: Tue, 4 Jan 2022 09:21:30 -0500 Subject: [PATCH 11/11] move unnammed name out of connection --- lib/ecto/adapters/postgres/connection.ex | 2 -- lib/ecto/adapters/sql.ex | 9 +++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/ecto/adapters/postgres/connection.ex b/lib/ecto/adapters/postgres/connection.ex index 17789b41..0ea2fc76 100644 --- a/lib/ecto/adapters/postgres/connection.ex +++ b/lib/ecto/adapters/postgres/connection.ex @@ -67,8 +67,6 @@ if Code.ensure_loaded?(Postgrex) do @impl true def prepare_execute(conn, name, sql, params, opts) do - name = if opts[:prepare] == :named, do: name, else: "" - case Postgrex.prepare_execute(conn, name, sql, params, opts) do {:error, %Postgrex.Error{postgres: %{pg_code: "22P02", message: message}} = error} -> context = """ diff --git a/lib/ecto/adapters/sql.ex b/lib/ecto/adapters/sql.ex index 4d68e8fc..a6a396ac 100644 --- a/lib/ecto/adapters/sql.ex +++ b/lib/ecto/adapters/sql.ex @@ -697,7 +697,7 @@ defmodule Ecto.Adapters.SQL do end defp execute!(prepare, adapter_meta, {:cache, update, {id, prepared}}, params, opts) do - name = prepare_name(id) + name = prepare_name(prepare, id) case sql_call(adapter_meta, :prepare_execute, [name, prepared], params, opts) do {:ok, query, result} -> @@ -708,8 +708,8 @@ defmodule Ecto.Adapters.SQL do end end - defp execute!(:unnamed = _prepare, adapter_meta, {:cached, _update, _reset, {id, cached}}, params, opts) do - name = prepare_name(id) + defp execute!(:unnamed = prepare, adapter_meta, {:cached, _update, _reset, {id, cached}}, params, opts) do + name = prepare_name(prepare, id) prepared = String.Chars.to_string(cached) case sql_call(adapter_meta, :prepare_execute, [name, prepared], params, opts) do @@ -742,7 +742,8 @@ defmodule Ecto.Adapters.SQL do end end - defp prepare_name(id), do: "ecto_" <> Integer.to_string(id) + defp prepare_name(:named, id), do: "ecto_" <> Integer.to_string(id) + defp prepare_name(:unnamed, _id), do: "" defp maybe_update_cache(:named = _prepare, update, value), do: update.(value) defp maybe_update_cache(:unnamed = _prepare, _update, _value), do: :noop