Skip to content

Commit 4013ecb

Browse files
authored
Add ability to pass cache_statement per operation (#352)
Previously ecto_sql used pre-defined cache_statement value for all types of queries. This commit adds ability to use user specified cache statement as it could improve performance in certain situations like multiple `insert_all` queries with fixed size batch and so on. Besides this the commit adds length of parameters to the default cache_statement name. In other way set of queries like this: App.Repo.insert(%MyModel{name: "test_1", field_id: nil}) App.Repo.insert(%MyModel{name: "test_2", field_id: "test"}) App.Repo.insert(%MyModel{name: "test_3", field_id: nil}) will lead to situation when the previous prepared statement will be closed when next query from the set will be executed and new one will be created because `nil` values are not get into resulted query.
1 parent 92a4a5c commit 4013ecb

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

lib/ecto/adapters/myxql.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,11 @@ defmodule Ecto.Adapters.MyXQL do
256256
key = primary_key!(schema_meta, returning)
257257
{fields, values} = :lists.unzip(params)
258258
sql = @conn.insert(prefix, source, fields, [fields], on_conflict, [], [])
259-
opts = [{:cache_statement, "ecto_insert_#{source}"} | opts]
259+
opts = if is_nil(Keyword.get(opts, :cache_statement)) do
260+
[{:cache_statement, "ecto_insert_#{source}_#{length(fields)}"} | opts]
261+
else
262+
opts
263+
end
260264

261265
case Ecto.Adapters.SQL.query(adapter_meta, sql, values ++ query_params, opts) do
262266
{:ok, %{num_rows: 1, last_insert_id: last_insert_id}} ->

lib/ecto/adapters/sql.ex

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,11 @@ defmodule Ecto.Adapters.SQL do
656656

657657
sql = conn.insert(prefix, source, header, rows, on_conflict, returning, placeholders)
658658

659-
opts = [{:cache_statement, "ecto_insert_all_#{source}"} | opts]
659+
opts = if is_nil(Keyword.get(opts, :cache_statement)) do
660+
[{:cache_statement, "ecto_insert_all_#{source}"} | opts]
661+
else
662+
opts
663+
end
660664

661665
all_params = placeholders ++ Enum.reverse(params, conflict_params)
662666
%{num_rows: num, rows: rows} =
@@ -789,9 +793,13 @@ defmodule Ecto.Adapters.SQL do
789793

790794
@doc false
791795
def struct(adapter_meta, conn, sql, operation, source, params, values, on_conflict, returning, opts) do
792-
cache_statement = "ecto_#{operation}_#{source}"
796+
opts = if is_nil(Keyword.get(opts, :cache_statement)) do
797+
[{:cache_statement, "ecto_#{operation}_#{source}_#{length(params)}"} | opts]
798+
else
799+
opts
800+
end
793801

794-
case query(adapter_meta, sql, values, [cache_statement: cache_statement] ++ opts) do
802+
case query(adapter_meta, sql, values, opts) do
795803
{:ok, %{rows: nil, num_rows: 1}} ->
796804
{:ok, []}
797805

0 commit comments

Comments
 (0)