From 386f47fe786cf5a3e746d4e778200f020b39dc03 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Sun, 5 Apr 2026 18:06:34 -0400 Subject: [PATCH 1/4] chore: accept a `counter` option in `prepare_query/3` --- lib/ecto/adapter/queryable.ex | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/ecto/adapter/queryable.ex b/lib/ecto/adapter/queryable.ex index 8350801232..d99e62f93c 100644 --- a/lib/ecto/adapter/queryable.ex +++ b/lib/ecto/adapter/queryable.ex @@ -104,13 +104,20 @@ defmodule Ecto.Adapter.Queryable do def prepare_query(operation, repo_name_or_pid, queryable, opts \\ []) do %{adapter: adapter, cache: cache} = Ecto.Repo.Registry.lookup(repo_name_or_pid) - query_cache? = Keyword.get(opts, :query_cache, true) + counter = Keyword.get(opts, :counter, 0) + + query_cache? = + if counter != 0 do + false + else + Keyword.get(opts, :query_cache, true) + end {_meta, prepared, _cast_params, dump_params} = queryable |> Ecto.Queryable.to_query() |> Ecto.Query.Planner.ensure_select(operation == :all) - |> Ecto.Query.Planner.query(operation, cache, adapter, 0, query_cache?) + |> Ecto.Query.Planner.query(operation, cache, adapter, counter, query_cache?) {prepared, dump_params} end From a1ec0b800f24fd5b67b80df8442b21bd3509f391 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Mon, 6 Apr 2026 21:27:20 -0400 Subject: [PATCH 2/4] chore: PR feedabck, include index in query cache key --- lib/ecto/adapter/queryable.ex | 8 +------- lib/ecto/query/planner.ex | 9 ++++++++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/ecto/adapter/queryable.ex b/lib/ecto/adapter/queryable.ex index d99e62f93c..760e4a6a7a 100644 --- a/lib/ecto/adapter/queryable.ex +++ b/lib/ecto/adapter/queryable.ex @@ -105,13 +105,7 @@ defmodule Ecto.Adapter.Queryable do %{adapter: adapter, cache: cache} = Ecto.Repo.Registry.lookup(repo_name_or_pid) counter = Keyword.get(opts, :counter, 0) - - query_cache? = - if counter != 0 do - false - else - Keyword.get(opts, :query_cache, true) - end + query_cache? = Keyword.get(opts, :query_cache, true) {_meta, prepared, _cast_params, dump_params} = queryable diff --git a/lib/ecto/query/planner.ex b/lib/ecto/query/planner.ex index fd7cd6b79f..23e0c1acc5 100644 --- a/lib/ecto/query/planner.ex +++ b/lib/ecto/query/planner.ex @@ -136,7 +136,14 @@ defmodule Ecto.Query.Planner do def query(query, operation, cache, adapter, counter, query_cache?) do {query, params, key} = plan(query, operation, adapter) {cast_params, dump_params} = Enum.unzip(params) - key = if query_cache?, do: key, else: :nocache + + key = + cond do + not query_cache? -> :nocache + counter != 0 -> {key, counter} + true -> key + end + query_with_cache(key, query, operation, cache, adapter, counter, cast_params, dump_params) end From 06cf74b17927d12e0a68e5ff5127d7cc0112ecf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 7 Apr 2026 18:40:29 +0200 Subject: [PATCH 3/4] Apply suggestion from @josevalim --- lib/ecto/query/planner.ex | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/ecto/query/planner.ex b/lib/ecto/query/planner.ex index 23e0c1acc5..83d7b52f30 100644 --- a/lib/ecto/query/planner.ex +++ b/lib/ecto/query/planner.ex @@ -136,14 +136,7 @@ defmodule Ecto.Query.Planner do def query(query, operation, cache, adapter, counter, query_cache?) do {query, params, key} = plan(query, operation, adapter) {cast_params, dump_params} = Enum.unzip(params) - - key = - cond do - not query_cache? -> :nocache - counter != 0 -> {key, counter} - true -> key - end - + key = if query_cache?, do: [key | counter], else: :nocache query_with_cache(key, query, operation, cache, adapter, counter, cast_params, dump_params) end From 8e8b2156869f8ed72b27934e17de292b1dfcfc64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 7 Apr 2026 19:06:48 +0200 Subject: [PATCH 4/4] Apply suggestion from @josevalim --- lib/ecto/query/planner.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ecto/query/planner.ex b/lib/ecto/query/planner.ex index 83d7b52f30..fcf2dc7ae4 100644 --- a/lib/ecto/query/planner.ex +++ b/lib/ecto/query/planner.ex @@ -136,7 +136,7 @@ defmodule Ecto.Query.Planner do def query(query, operation, cache, adapter, counter, query_cache?) do {query, params, key} = plan(query, operation, adapter) {cast_params, dump_params} = Enum.unzip(params) - key = if query_cache?, do: [key | counter], else: :nocache + key = if query_cache?, do: {key, counter}, else: :nocache query_with_cache(key, query, operation, cache, adapter, counter, cast_params, dump_params) end