From d54b32a9d14fa4831cbd66668c7ca3ee5cd82f2c Mon Sep 17 00:00:00 2001 From: Jesse Williams Date: Tue, 2 Jun 2026 09:05:13 -0700 Subject: [PATCH 1/2] fix: use mutate repo for queries with locks --- lib/ash_sql.ex | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/lib/ash_sql.ex b/lib/ash_sql.ex index a5992e8..f4c8bf6 100644 --- a/lib/ash_sql.ex +++ b/lib/ash_sql.ex @@ -4,22 +4,32 @@ defmodule AshSql do @moduledoc false - def dynamic_repo(resource, sql_behaviour, %{ - __ash_bindings__: %{context: %{data_layer: %{repo: repo}}} - }) do - repo || sql_behaviour.repo(resource, :read) + def dynamic_repo( + resource, + sql_behaviour, + %{ + __ash_bindings__: %{context: %{data_layer: %{repo: repo}}} + } = query + ) do + repo || sql_behaviour.repo(resource, repo_type(query)) end - def dynamic_repo(resource, sql_behaviour, %struct{context: %{data_layer: %{repo: repo}}}) do - type = struct_to_repo_type(struct) - - repo || sql_behaviour.repo(resource, type) + def dynamic_repo( + resource, + sql_behaviour, + %struct{context: %{data_layer: %{repo: repo}}} = query + ) do + repo || sql_behaviour.repo(resource, repo_type(query)) end - def dynamic_repo(resource, sql_behaviour, %struct{}) do - sql_behaviour.repo(resource, struct_to_repo_type(struct)) + def dynamic_repo(resource, sql_behaviour, query) do + sql_behaviour.repo(resource, repo_type(query)) end + defp repo_type(%{lock: lock}) when not is_nil(lock), do: :mutate + defp repo_type(%struct{}), do: struct_to_repo_type(struct) + defp repo_type(_), do: :read + def repo_opts(_repo, sql_behaviour, timeout, tenant, resource) do if Ash.Resource.Info.multitenancy_strategy(resource) == :context do [prefix: tenant] From 4e2cd2e2b707ee4864ab89d0c4d2ceccc3daa373 Mon Sep 17 00:00:00 2001 From: Jesse Williams Date: Wed, 3 Jun 2026 08:13:49 -0700 Subject: [PATCH 2/2] fix warning --- lib/ash_sql.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ash_sql.ex b/lib/ash_sql.ex index f4c8bf6..c6a7bff 100644 --- a/lib/ash_sql.ex +++ b/lib/ash_sql.ex @@ -17,7 +17,7 @@ defmodule AshSql do def dynamic_repo( resource, sql_behaviour, - %struct{context: %{data_layer: %{repo: repo}}} = query + %_{context: %{data_layer: %{repo: repo}}} = query ) do repo || sql_behaviour.repo(resource, repo_type(query)) end