Skip to content

Commit 3934a9a

Browse files
committed
Handle special double cases
1 parent d6484a6 commit 3934a9a

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

c_src/value_to_term.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,19 @@ bool nif::value_to_term(ErlNifEnv* env, const duckdb::Value& value, ERL_NIF_TERM
4949
}
5050
case duckdb::LogicalTypeId::DOUBLE: {
5151
auto a_double = value.GetValueUnsafe<double>();
52-
sink = enif_make_double(env, a_double);
52+
53+
// Handle special floating-point cases
54+
if (std::isinf(a_double)) {
55+
if (a_double > 0) {
56+
sink = make_atom(env, "infinity"); // Positive infinity
57+
} else {
58+
sink = make_atom(env, "-infinity"); // Negative infinity
59+
}
60+
} else if (std::isnan(a_double)) {
61+
sink = make_atom(env, "nan"); // Handle NaN
62+
} else {
63+
sink = enif_make_double(env, a_double); // Regular double handling
64+
}
5365
return true;
5466
}
5567
case duckdb::LogicalTypeId::DECIMAL: {

test/fetch_test.exs

+11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@ defmodule Duckdbex.FetchTest do
2525
assert [] == Duckdbex.fetch_chunk(result_ref)
2626
end
2727

28+
test "divide by zero does not crash", %{conn: conn} do
29+
{:ok, result_ref} = Duckdbex.query(conn, "SELECT 0/0")
30+
assert [[:nan]] == Duckdbex.fetch_all(result_ref)
31+
32+
{:ok, result_ref} = Duckdbex.query(conn, "SELECT 1/0")
33+
assert [[:infinity]] == Duckdbex.fetch_all(result_ref)
34+
35+
{:ok, result_ref} = Duckdbex.query(conn, "SELECT -1/0")
36+
assert [[:"-infinity"]] == Duckdbex.fetch_all(result_ref)
37+
end
38+
2839
test "fetch_all", %{conn: conn} do
2940
{:ok, _} =
3041
Duckdbex.query(conn, """

0 commit comments

Comments
 (0)