integer math errors with large numbers and no errors or warnings given
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
MariaDB |
Won't Fix
|
Undecided
|
Unassigned |
Bug Description
mysql> select version();
+------
| version() |
+------
| 5.1.39-
+------
1 row in set (0.00 sec)
mysql> SELECT 4294967296 * 4294967296;
+------
| 4294967296 * 4294967296 |
+------
| 0 |
+------
1 row in set (0.00 sec)
mysql> show warnings;
Empty set (0.00 sec)
mysql> SELECT 3037000500 * 3037000500;
+------
| 3037000500 * 3037000500 |
+------
| -92233720367093
+------
1 row in set (0.00 sec)
mysql> show warnings;
Empty set (0.00 sec)
mysql> SELECT 4294967296 * 4294967297;
+------
| 4294967296 * 4294967297 |
+------
| 4294967296 |
+------
1 row in set (0.00 sec)
mysql> show warnings;
Empty set (0.00 sec)
mysql> SELECT 4294967296 * 4294967298;
+------
| 4294967296 * 4294967298 |
+------
| 8589934592 |
+------
1 row in set (0.00 sec)
mysql> show warnings;
Empty set (0.00 sec)
mysql> SELECT 4294967296.0 * 4294967298.0;
+------
| 4294967296.0 * 4294967298.0 |
+------
| 184467440822994
+------
1 row in set (0.08 sec)
mysql> show warnings;
Empty set (0.00 sec)
mysql> quit;
Bye
archivist@
Linux cnc 2.6.24-16-rtai #1 Tue Sep 30 22:54:33 EEST 2008 i686 GNU/Linux
adding a .0 to the large number gets it to use float/double maths, the integer maths does not seem to check its range or overflow conditions correctly thus giving incorrect results.
# Bug#xxxxx: Reproducible MariaDB server integer math fault
#
# this returns 0 incorrectly it appears to be the left side * 0
--exec $MYSQL test -e "SELECT 4294967296 * 4294967296\g" 2>&1
#
# this gives an incorrect negative number
--exec $MYSQL test -e "SELECT 3037000500 * 3037000500\g" 2>&1
#
# this returns 4294967296 the number on the left times 1
--exec $MYSQL test -e "SELECT 4294967296 * 4294967297\g" 2>&1
#
# this returns 8589934592 the number on the left times 2
--exec $MYSQL test -e "SELECT 4294967296 * 4294967298\g" 2>&1
#
# this seems to be correct it has cast to a float/double
--exec $MYSQL test -e "SELECT 4294967296.0 * 4294967298.0;\g" 2>&1
The issue is that you are using integer arithmetic, which is described at: dev.mysql. com/doc/ refman/ 5.1/en/ arithmetic- functions. html
http://
Not much we can do with this, as we are trying to be compatible with MySQL.
We should however consider to find a way to create a warning in cases when you get overflow.
I will create a worklog entry for this.