From 67895da179ddda6b4056ef127473fc0a0ecfc318 Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Fri, 20 Jun 2025 19:42:05 +0200 Subject: [PATCH 1/2] implement support for count(_, :distinct) --- lib/ecto/adapters/sqlite3/connection.ex | 4 ++++ test/ecto/adapters/sqlite3/connection/aggregates_test.exs | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/ecto/adapters/sqlite3/connection.ex b/lib/ecto/adapters/sqlite3/connection.ex index c2e27ec..fd6dd67 100644 --- a/lib/ecto/adapters/sqlite3/connection.ex +++ b/lib/ecto/adapters/sqlite3/connection.ex @@ -1437,6 +1437,10 @@ defmodule Ecto.Adapters.SQLite3.Connection do defp expr({:count, _, []}, _sources, _query), do: "count(*)" + defp expr({:count, _, [expr, :distinct]}, sources, query) do + ["count(distinct ", expr(expr, sources, query), ")"] + end + defp expr({:count, _, [{:&, _, [_]}]}, _sources, query) do raise Ecto.QueryError, query: query, diff --git a/test/ecto/adapters/sqlite3/connection/aggregates_test.exs b/test/ecto/adapters/sqlite3/connection/aggregates_test.exs index 2aa1a11..e8daa98 100644 --- a/test/ecto/adapters/sqlite3/connection/aggregates_test.exs +++ b/test/ecto/adapters/sqlite3/connection/aggregates_test.exs @@ -28,13 +28,13 @@ defmodule Ecto.Adapters.SQLite3.Connection.AggregatesTest do end end - test "raises when trying to distinct count" do - assert_raise Ecto.QueryError, fn -> + test "distinct counts" do + query = Schema |> select([r], count(r.x, :distinct)) |> plan() - |> all() - end + + assert ~s{SELECT count(distinct s0."x") FROM "schema" AS s0} == all(query) end test "allows naked count" do From 64ba71ade3f200fc4f06a7db46fe6e727889b35a Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Fri, 20 Jun 2025 22:22:53 +0200 Subject: [PATCH 2/2] enable count distinct integration tests --- integration_test/test_helper.exs | 3 --- 1 file changed, 3 deletions(-) diff --git a/integration_test/test_helper.exs b/integration_test/test_helper.exs index 1805346..a5dd7b9 100644 --- a/integration_test/test_helper.exs +++ b/integration_test/test_helper.exs @@ -124,9 +124,6 @@ excludes = [ :selected_as_with_order_by_expression, :selected_as_with_having, - # Distinct with options not supported - :distinct_count, - # SQLite does not support anything except a single column in DISTINCT :multicolumn_distinct,