diff --git a/lib/ecto/adapters/clickhouse.ex b/lib/ecto/adapters/clickhouse.ex index 3c4554a..9455d3a 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 35e7f9e..45e40e0 100644 --- a/lib/ecto/adapters/clickhouse/connection.ex +++ b/lib/ecto/adapters/clickhouse/connection.ex @@ -678,6 +678,13 @@ defmodule Ecto.Adapters.ClickHouse.Connection do defp expr({:in, _, [_, {:^, _, [_ix, 0]}]}, _sources, _params, _query), do: "0" + defp expr({:in, _, [left, {:^, _, [ix, len]}]}, sources, params, query) when len > 0 do + array_values = Enum.at(params, ix) + param = build_param(ix, array_values) + + [expr(left, sources, params, query), " IN ", param] + 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/adapters/clickhouse/connection_test.exs b/test/ecto/adapters/clickhouse/connection_test.exs index b23bca6..de7c219 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]) diff --git a/test/ecto_ch_test.exs b/test/ecto_ch_test.exs index 8c0ac7b..9d74af3 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]