Bug #118941 | Bug Report: DECIMAL(22,2) Column Comparison with -0.001 Excludes 0.00 Row | ||
---|---|---|---|
Submitted: | 5 Sep 8:19 | Modified: | 10 Sep 14:45 |
Reporter: | fan alan | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) |
Version: | 8.0.x, 8.4.x | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[5 Sep 8:19]
fan alan
[5 Sep 9:18]
fan alan
Both the > and >= operators exhibit the same behavior. For example: SELECT * FROM bug_decimal WHERE a >= -0.001; also fails to return the 0.00 row.This indicates the issue is not specific to strict versus non-strict comparison, nor simply a one-time precision truncation of the literal—rather it points to an underlying inconsistency in the DECIMAL comparison logic when the literal has more fractional digits than the column’s scale.
[8 Sep 6:52]
MySQL Verification Team
Hi, This is not a bug. decimal(22,2) -0.001 is 0 so neither of "(0.00), (-0.01), (-0.10)" are > 0
[8 Sep 7:45]
fan alan
However, using the query: SELECT * FROM bug_decimal WHERE a >= -0.001; also fails to return the row where a = 0.00
[8 Sep 7:57]
fan alan
Moreover, this query works correctly on MySQL 5.7, and no other database systems exhibit this issue. It only fails on MySQL 8.0 and later versions.
[9 Sep 11:29]
MySQL Verification Team
Works as expected on 9 mysql> SELECT * -> FROM bug_decimal -> WHERE a >= -0.001; +------+ | a | +------+ | 0.00 | | 1.23 | +------+ 2 rows in set (0.001 sec) mysql> select @@version; +-----------+ | @@version | +-----------+ | 9.4.0 | +-----------+ 1 row in set (0.000 sec) mysql>
[9 Sep 11:36]
MySQL Verification Team
Hi, You are correct. There is a definete weird behavior with 8.4. 9.x works as expected. mysql> SELECT * -> FROM bug_decimal -> WHERE a >= -0.001; +------+ | a | +------+ | 1.23 | +------+ 1 row in set (0.00 sec) mysql> select @@version; +-----------+ | @@version | +-----------+ | 8.4.6 | +-----------+ 1 row in set (0.00 sec) Bug is verified, thank you for your test case and your patience.
[9 Sep 11:58]
MySQL Verification Team
Bug #118967 marked as duplicate of this one
[10 Sep 6:28]
fan alan
Will this bug be fixed in versions 8.0 and 8.4? Also, is it possible to support filtering with > -0.001? In a CASE WHEN statement, matching with > -0.001 is supported, but the result is not entirely consistent with filtering in the WHERE clause. For example: select a,(case when a>-0.001 then true else false end) ca FROM bug_decimal; +-------+-----+ | a | ca | +-------+-----+ | 0.00 | 1 | | 1.23 | 1 | | -0.01 | 0 | | -0.10 | 0 | +-------+-----+
[10 Sep 14:45]
fan alan
"Update the affected versions:8.0.x, 8.4.x