From bd67160c63a2962b67f63499fe94150aefbc13e4 Mon Sep 17 00:00:00 2001 From: Christopher Grainger Date: Sun, 3 May 2026 08:55:31 +1000 Subject: [PATCH] fix: encode temporal list values --- lib/dux/query_builder.ex | 4 ++++ test/dux/verb_test.exs | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/dux/query_builder.ex b/lib/dux/query_builder.ex index 3fa1d9e..dbf23ea 100644 --- a/lib/dux/query_builder.ex +++ b/lib/dux/query_builder.ex @@ -459,6 +459,10 @@ defmodule Dux.QueryBuilder do defp encode_value(v) when is_float(v), do: Float.to_string(v) defp encode_value(true), do: "true" defp encode_value(false), do: "false" + defp encode_value(%Date{} = v), do: "DATE '#{Date.to_iso8601(v)}'" + defp encode_value(%Time{} = v), do: "TIME '#{Time.to_iso8601(v)}'" + defp encode_value(%NaiveDateTime{} = v), do: "TIMESTAMP '#{NaiveDateTime.to_iso8601(v)}'" + defp encode_value(%DateTime{} = v), do: "TIMESTAMPTZ '#{DateTime.to_iso8601(v)}'" defp encode_value(v) when is_binary(v) do "'#{escape_sql_string(v)}'" diff --git a/test/dux/verb_test.exs b/test/dux/verb_test.exs index b93df51..4e0e116 100644 --- a/test/dux/verb_test.exs +++ b/test/dux/verb_test.exs @@ -422,6 +422,23 @@ defmodule Dux.VerbTest do assert result == 10 end + + test "handles temporal values in small lists" do + result = + Dux.from_list([ + %{ + "date" => ~D[2001-01-01], + "time" => ~T[12:34:56], + "datetime" => ~N[2001-01-01 00:00:00] + } + ]) + |> Dux.to_rows() + + assert [row] = result + assert row["date"] == ~D[2001-01-01] + assert Time.compare(row["time"], ~T[12:34:56]) == :eq + assert NaiveDateTime.compare(row["datetime"], ~N[2001-01-01 00:00:00]) == :eq + end end describe "compute/1" do