integer math errors with large numbers and no errors or warnings given

Bug #482846 reported by archivist
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
MariaDB
Won't Fix
Undecided
Unassigned

Bug Description

mysql> select version();
+-----------------------------+
| version() |
+-----------------------------+
| 5.1.39-maria-beta-debug-log |
+-----------------------------+
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 |
+-------------------------+
| -9223372036709301616 |
+-------------------------+
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 |
+-----------------------------+
| 18446744082299486208.00 |
+-----------------------------+
1 row in set (0.08 sec)

mysql> show warnings;
Empty set (0.00 sec)

mysql> quit;
Bye
archivist@cnc:~/archivist-cnc/archivist-cnc/build/mysql-test$ uname -a
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

Revision history for this message
Michael Widenius (monty) wrote :

The issue is that you are using integer arithmetic, which is described at:
http://dev.mysql.com/doc/refman/5.1/en/arithmetic-functions.html

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.

Changed in maria:
status: New → Won't Fix
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.