Skip to content

Commit d6cf79d

Browse files
committed
fix(sqlite): precision loss in divide
1 parent bb42a6b commit d6cf79d

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

ibis/backends/sql/compilers/sqlite.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,5 +545,13 @@ def visit_DateDelta(self, op, *, left, right, part):
545545
)
546546
return self.f._ibis_date_delta(left, right)
547547

548+
def visit_Divide(self, op, *, left, right):
549+
left = (
550+
sge.cast(left, sge.DataType.Type.FLOAT, copy=False)
551+
if all(arg.dtype.is_integer() for arg in op.args)
552+
else left
553+
)
554+
return self.binop(sge.Div, left, right)
555+
548556

549557
compiler = SQLiteCompiler()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from __future__ import annotations
2+
3+
import pandas as pd
4+
import pandas.testing as tm
5+
6+
import ibis
7+
8+
9+
def test_divide_precision(con):
10+
df = pd.DataFrame({"a": [10, 20, 30], "b": [2, 3, 4], "c": [5, 10, 15]})
11+
12+
t = ibis.memtable(df)
13+
14+
expr = (t.a + t.b) * t.c - t.a / t.b
15+
expected = (df["a"] + df["b"]) * df["c"] - df["a"] / df["b"]
16+
17+
actual = con.execute(expr).squeeze()
18+
19+
tm.assert_series_equal(actual, expected, check_names=False)

0 commit comments

Comments
 (0)