diff --git a/lib/ecto/adapters/clickhouse/connection.ex b/lib/ecto/adapters/clickhouse/connection.ex index 35e7f9e..fbb27f5 100644 --- a/lib/ecto/adapters/clickhouse/connection.ex +++ b/lib/ecto/adapters/clickhouse/connection.ex @@ -1101,7 +1101,7 @@ defmodule Ecto.Adapters.ClickHouse.Connection do defp ecto_to_db({:parameterized, {Ch, type}}, _query), do: Ch.Types.encode(type) defp ecto_to_db({:array, type}, query), do: ["Array(", ecto_to_db(type, query), ?)] - defp ecto_to_db(type, _query) when type in [:uuid, :string, :date, :boolean] do + defp ecto_to_db(type, _query) when type in [:uuid, :string, :date, :time, :boolean] do Ch.Types.encode(type) end diff --git a/lib/ecto/adapters/clickhouse/migration.ex b/lib/ecto/adapters/clickhouse/migration.ex index 38eb1ba..b1c643c 100644 --- a/lib/ecto/adapters/clickhouse/migration.ex +++ b/lib/ecto/adapters/clickhouse/migration.ex @@ -434,10 +434,6 @@ defmodule Ecto.Adapters.ClickHouse.Migration do raise ArgumentError, "type :numeric is not supported" end - defp column_type(:time) do - raise ArgumentError, "type :time is not supported" - end - defp column_type(:map) do raise ArgumentError, ~s[type :map is ambiguous, use a literal (e.g. :JSON or :"Map(String, UInt8)") instead] diff --git a/lib/ecto/adapters/clickhouse/schema.ex b/lib/ecto/adapters/clickhouse/schema.ex index af6217a..43e54f3 100644 --- a/lib/ecto/adapters/clickhouse/schema.ex +++ b/lib/ecto/adapters/clickhouse/schema.ex @@ -264,7 +264,7 @@ defmodule Ecto.Adapters.ClickHouse.Schema do defp remap_type({:parameterized, {Ch, t}}, _original, _schema, _field), do: t defp remap_type(t, _original, _schema, _field) - when t in [:string, :date, :uuid, :boolean], + when t in [:string, :date, :time, :uuid, :boolean], do: t defp remap_type(dt, _original, _schema, _field) @@ -275,6 +275,8 @@ defmodule Ecto.Adapters.ClickHouse.Schema do when usec in [:naive_datetime_usec, :utc_datetime_usec], do: {:datetime64, _precision = 6} + defp remap_type(:time_usec, _original, _schema, _field), do: {:time64, _precision = 6} + # TODO remove defp remap_type(t, _original, _schema, _field) when t in [:binary, :binary_id], @@ -291,11 +293,6 @@ defmodule Ecto.Adapters.ClickHouse.Schema do defp remap_type(:integer, _original, Ecto.Migration.SchemaMigration, :version), do: :i64 - defp remap_type(time, _original, _schema, _field) when time in [:time, :time_usec] do - raise ArgumentError, - "`#{inspect(time)}` type is not supported as there is no `Time` type in ClickHouse." - end - defp remap_type(other, original, schema, field) do ch_type = ch_type_hint(original) diff --git a/test/ecto/adapters/clickhouse/connection_test.exs b/test/ecto/adapters/clickhouse/connection_test.exs index b23bca6..abbe86d 100644 --- a/test/ecto/adapters/clickhouse/connection_test.exs +++ b/test/ecto/adapters/clickhouse/connection_test.exs @@ -962,13 +962,13 @@ defmodule Ecto.Adapters.ClickHouse.ConnectionTest do assert all(query) == ~s[SELECT CAST(s0."x" + 1 AS UInt16) FROM "schema" AS s0] end - test "tagged unknown type" do + @tag :time + test "tagged as time" do query = from e in "events", select: type(e.count + 1, :time) + assert all(query) == ~s[SELECT CAST(e0."count" + CAST(1 AS Time) AS Time) FROM "events" AS e0] + end - assert_raise Ecto.QueryError, - ~r/unknown or ambiguous \(for ClickHouse\) Ecto type :time in query/, - fn -> all(query) end - + test "tagged unknown type" do query = from e in "events", select: type(e.count + 1, :decimal) assert_raise Ecto.QueryError, @@ -2626,9 +2626,9 @@ defmodule Ecto.Adapters.ClickHouse.ConnectionTest do {:create, table(:posts), [{:add, :published_at, :time, []}, {:add, :submitted_at, :time, []}]} - assert_raise ArgumentError, "type :time is not supported", fn -> - execute_ddl(create) - end + assert execute_ddl(create) == [ + ~s[CREATE TABLE "posts" ("published_at" time,"submitted_at" time) ENGINE=TinyLog] + ] end test "create table with utc_datetime columns" do