| Bug #54699 | Signed Unsigned Subtraction Out of Range Error | ||
|---|---|---|---|
| Submitted: | 22 Jun 2010 16:14 | Modified: | 22 Jun 2010 17:23 |
| Reporter: | Syed Hashmi | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | MySQL Server: DML | Severity: | S2 (Serious) |
| Version: | 5.1.47 | OS: | Linux |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | Signed Unsigned Subtraction | ||
[22 Jun 2010 16:14]
Syed Hashmi
[22 Jun 2010 17:23]
Valeriy Kravchuk
Actually, I'd say that this is documented in http://dev.mysql.com/doc/refman/5.1/en/cast-functions.html: "MySQL supports arithmetic with both signed and unsigned 64-bit values. If you are using numeric operators (such as + or -) and one of the operands is an unsigned integer, the result is unsigned. You can override this by using the SIGNED and UNSIGNED cast operators to cast the operation to a signed or unsigned 64-bit integer, respectively." Also good workaround exists: mysql> create procedure proc3() BEGIN DECLARE v_Unsigned BIGINT UNSIGNED DEFAULT 3000; DECLARE v_Signed BIGINT DEFAULT NULL; SET v_Signed = cast(v_Unsigned as signed) - 6000; SELECT v_Signed; END;// Query OK, 0 rows affected (0.00 sec) mysql> call proc3();// +----------+ | v_Signed | +----------+ | -3000 | +----------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)
