From 53d321a085f8d4756537cd7470d86b09a4d26ee6 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Sat, 22 Nov 2025 13:45:26 -0500 Subject: [PATCH 1/3] poking around --- lib/ecto/adapters/clickhouse.ex | 1 + lib/ecto/adapters/clickhouse/connection.ex | 10 ++++++++++ test/ecto/integration/assoc_test.exs | 3 +++ 3 files changed, 14 insertions(+) diff --git a/lib/ecto/adapters/clickhouse.ex b/lib/ecto/adapters/clickhouse.ex index 3c4554ac..9455d3aa 100644 --- a/lib/ecto/adapters/clickhouse.ex +++ b/lib/ecto/adapters/clickhouse.ex @@ -164,6 +164,7 @@ defmodule Ecto.Adapters.ClickHouse do def dumpers(:uuid, Ecto.UUID), do: [&__MODULE__.hex_uuid/1] def dumpers(:uuid, type), do: [type, &__MODULE__.hex_uuid/1] def dumpers(:binary_id, type), do: [type, &__MODULE__.hex_uuid/1] + def dumpers({:in, sub}, {:in, sub}), do: [{:array, sub}] def dumpers(_primitive, {:parameterized, {Ch, params}}), do: [dumper(params)] def dumpers({:parameterized, {Ch, params}}, type), do: [type, dumper(params)] def dumpers(_primitive, type), do: [type] diff --git a/lib/ecto/adapters/clickhouse/connection.ex b/lib/ecto/adapters/clickhouse/connection.ex index 35e7f9e3..874e4eb5 100644 --- a/lib/ecto/adapters/clickhouse/connection.ex +++ b/lib/ecto/adapters/clickhouse/connection.ex @@ -678,6 +678,16 @@ defmodule Ecto.Adapters.ClickHouse.Connection do defp expr({:in, _, [_, {:^, _, [_ix, 0]}]}, _sources, _params, _query), do: "0" + # Handle IN with pinned array parameter - use single array param instead of expanding + defp expr({:in, _, [left, {:^, _, [ix, len]}]}, sources, params, query) when len > 0 do + # Collect all the individual params into a single array + array_values = Enum.map(ix..(ix + len - 1), &Enum.at(params, &1)) + p = build_param(ix, array_values) + binding() |> dbg + + [expr(left, sources, params, query), " IN ", p] + end + defp expr({:in, _, [left, right]}, sources, params, query) do [expr(left, sources, params, query), " IN ", expr(right, sources, params, query)] end diff --git a/test/ecto/integration/assoc_test.exs b/test/ecto/integration/assoc_test.exs index 54ed93b6..46a68e13 100644 --- a/test/ecto/integration/assoc_test.exs +++ b/test/ecto/integration/assoc_test.exs @@ -5,6 +5,7 @@ defmodule Ecto.Integration.AssocTest do alias Ecto.Integration.{Post, Comment, Permalink} test "has_many assoc" do + Logger.configure(level: :debug) p1 = TestRepo.insert!(%Post{title: "1"}) p2 = TestRepo.insert!(%Post{title: "2"}) @@ -16,6 +17,8 @@ defmodule Ecto.Integration.AssocTest do assert c1.id == cid1 assert c2.id == cid2 + TestRepo.to_sql(:all, Ecto.assoc([p1, p2], :comments)) |> dbg + [c1, c2, c3] = TestRepo.all(Ecto.assoc([p1, p2], :comments)) |> Enum.sort_by(& &1.id) assert c1.id == cid1 assert c2.id == cid2 From 35f88a9634d624f3db6a210abffb37a9ad4ee54c Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Sat, 22 Nov 2025 14:54:01 -0500 Subject: [PATCH 2/3] basic query building --- lib/ecto/adapters/clickhouse/connection.ex | 9 +++------ test/ecto/adapters/clickhouse/connection_test.exs | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/ecto/adapters/clickhouse/connection.ex b/lib/ecto/adapters/clickhouse/connection.ex index 874e4eb5..45e40e06 100644 --- a/lib/ecto/adapters/clickhouse/connection.ex +++ b/lib/ecto/adapters/clickhouse/connection.ex @@ -678,14 +678,11 @@ defmodule Ecto.Adapters.ClickHouse.Connection do defp expr({:in, _, [_, {:^, _, [_ix, 0]}]}, _sources, _params, _query), do: "0" - # Handle IN with pinned array parameter - use single array param instead of expanding defp expr({:in, _, [left, {:^, _, [ix, len]}]}, sources, params, query) when len > 0 do - # Collect all the individual params into a single array - array_values = Enum.map(ix..(ix + len - 1), &Enum.at(params, &1)) - p = build_param(ix, array_values) - binding() |> dbg + array_values = Enum.at(params, ix) + param = build_param(ix, array_values) - [expr(left, sources, params, query), " IN ", p] + [expr(left, sources, params, query), " IN ", param] end defp expr({:in, _, [left, right]}, sources, params, query) do diff --git a/test/ecto/adapters/clickhouse/connection_test.exs b/test/ecto/adapters/clickhouse/connection_test.exs index b23bca67..de7c2199 100644 --- a/test/ecto/adapters/clickhouse/connection_test.exs +++ b/test/ecto/adapters/clickhouse/connection_test.exs @@ -1019,7 +1019,7 @@ defmodule Ecto.Adapters.ClickHouse.ConnectionTest do assert all(query) == ~s[SELECT 0 FROM "schema" AS s0] query = Schema |> select([e], 1 in ^[1, 2, 3]) - assert all(query) == ~s[SELECT 1 IN ({$0:Int64},{$1:Int64},{$2:Int64}) FROM "schema" AS s0] + assert all(query) == ~s[SELECT 1 IN {$0:Array(Int64)} FROM "schema" AS s0] query = Schema |> select([e], 1 in [1, ^2, 3]) assert all(query) == ~s[SELECT 1 IN (1,{$0:Int64},3) FROM "schema" AS s0] @@ -1027,7 +1027,7 @@ defmodule Ecto.Adapters.ClickHouse.ConnectionTest do query = Schema |> select([e], e.x == ^0 or e.x in ^[1, 2, 3] or e.x == ^4) assert all(query) == - ~s[SELECT (s0."x" = {$0:Int64}) OR (s0."x" IN ({$1:Int64},{$2:Int64},{$3:Int64})) OR (s0."x" = {$4:Int64}) FROM "schema" AS s0] + ~s[SELECT (s0."x" = {$0:Int64}) OR (s0."x" IN {$1:Array(Int64)}) OR (s0."x" = {$2:Int64}) FROM "schema" AS s0] query = Schema |> select([e], e in [1, 2, 3]) From 85cbee25cfcff38624d99ca1e40902a4383bf516 Mon Sep 17 00:00:00 2001 From: Ben Wilson Date: Sat, 22 Nov 2025 14:56:27 -0500 Subject: [PATCH 3/3] fix tests and remove debugging --- test/ecto/integration/assoc_test.exs | 3 --- test/ecto_ch_test.exs | 11 +++++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/test/ecto/integration/assoc_test.exs b/test/ecto/integration/assoc_test.exs index 46a68e13..54ed93b6 100644 --- a/test/ecto/integration/assoc_test.exs +++ b/test/ecto/integration/assoc_test.exs @@ -5,7 +5,6 @@ defmodule Ecto.Integration.AssocTest do alias Ecto.Integration.{Post, Comment, Permalink} test "has_many assoc" do - Logger.configure(level: :debug) p1 = TestRepo.insert!(%Post{title: "1"}) p2 = TestRepo.insert!(%Post{title: "2"}) @@ -17,8 +16,6 @@ defmodule Ecto.Integration.AssocTest do assert c1.id == cid1 assert c2.id == cid2 - TestRepo.to_sql(:all, Ecto.assoc([p1, p2], :comments)) |> dbg - [c1, c2, c3] = TestRepo.all(Ecto.assoc([p1, p2], :comments)) |> Enum.sort_by(& &1.id) assert c1.id == cid1 assert c2.id == cid2 diff --git a/test/ecto_ch_test.exs b/test/ecto_ch_test.exs index 8c0ac7bf..9d74af31 100644 --- a/test/ecto_ch_test.exs +++ b/test/ecto_ch_test.exs @@ -75,15 +75,14 @@ defmodule EctoCh.Test do countIf(e0."type" != 'pageview') \ FROM "events" AS e0 \ WHERE (\ - e0."domain" IN ({$0:String},{$1:String})) AND \ - (e0."tags" = {$2:Array(String)}) AND \ - (toDate(e0."inserted_at") >= {$3:Date}) AND \ - (toDate(e0."inserted_at") <= {$4:Date}\ + e0."domain" IN {$0:Array(String)}) AND \ + (e0."tags" = {$1:Array(String)}) AND \ + (toDate(e0."inserted_at") >= {$2:Date}) AND \ + (toDate(e0."inserted_at") <= {$3:Date}\ )\ """, [ - "dummy.site", - "dummy2.site", + ["dummy.site", "dummy2.site"], ["1", "2", "3"], ~D[2020-10-10], ~D[2021-01-01]