| Bug #6961 | Traditional: assignment of string to numeric column should fail | ||
|---|---|---|---|
| Submitted: | 2 Dec 2004 19:13 | Modified: | 22 May 2005 23:47 |
| Reporter: | Trudy Pelzer | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S3 (Non-critical) |
| Version: | 5.0.3-alpha-debug | OS: | Linux (SuSE 9.1) |
| Assigned to: | Ramil Kalimullin | CPU Architecture: | Any |
[6 Apr 2005 23:18]
Trudy Pelzer
More information on this issue.
The precision math changes seem to have corrected some of the
problem, but the following problem still exists with DECIMAL columns.
mysql> create table t (i int, d decimal, f float);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t (i) values ('1x');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into t (d) values ('1x');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into t (f) values ('1x');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from t;
+------+------+------+
| i | d | f |
+------+------+------+
| 1 | NULL | NULL |
| NULL | 1 | NULL |
| NULL | NULL | 1 |
+------+------+------+
3 rows in set (0.00 sec)
-- As expected; sql_mode='' so the source value gets truncated after the opening digit.
mysql> set sql_mode='traditional';
Query OK, 0 rows affected (0.07 sec)
mysql> insert into t (i) values ('1x');
ERROR 1265 (01000): Data truncated for column 'i' at row 1
mysql> select * from t;
+------+------+------+
| i | d | f |
+------+------+------+
| 1 | NULL | NULL |
| NULL | 1 | NULL |
| NULL | NULL | 1 |
+------+------+------+
3 rows in set (0.01 sec)
-- The correct response.
mysql> insert into t (d) values ('1x');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+-------+------+----------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------+
| Note | 1265 | Data truncated for column 'd' at row 1 |
+-------+------+----------------------------------------+
1 row in set (0.00 sec)
mysql> select * from t;
+------+------+------+
| i | d | f |
+------+------+------+
| 1 | NULL | NULL |
| NULL | 1 | NULL |
| NULL | NULL | 1 |
| NULL | 1 | NULL |
+------+------+------+
4 rows in set (0.00 sec)
-- Not correct. As with the INTEGER column, the INSERT must be rejected
because it is not possible to convert '1x' to a valid number.
mysql> insert into t (f) values ('1x');
ERROR 1265 (01000): Data truncated for column 'f' at row 1
mysql> select * from t;
+------+------+------+
| i | d | f |
+------+------+------+
| 1 | NULL | NULL |
| NULL | 1 | NULL |
| NULL | NULL | 1 |
| NULL | 1 | NULL |
+------+------+------+
4 rows in set (0.00 sec)
-- This is correct.
[13 May 2005 8:21]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/24840
[18 May 2005 18:50]
Michael Widenius
Note that we still allow assignment of a string to a numeric column The issue is that we should only allow a string that can be converted to a number without any loss. (With is the behaviour after this patch)
[19 May 2005 9:53]
Ramil Kalimullin
Fixed in 5.0.7
[19 May 2005 14:27]
Paul DuBois
Noted in 5.0.7 changelog.
[19 May 2005 22:01]
Magnus BlÄudd
Fixed in 5.0.6
[19 May 2005 22:48]
Paul DuBois
Moved changelog entry from 5.0.7 to 5.0.6.

Description: When sql_mode='traditional', all assignments of values with an incorrect data type must fail. But if the assignment is of a math expression or is the result of an explicit CAST, the server accepts the change. How to repeat: mysql> set sql_mode='traditional'; mysql> create table t1 (col1 smallint); mysql> insert into t1 values('a'); ERROR 1366 (HY000): Incorrect integer value: 'a' for column 'col1' at row 1 -- This is the correct response; a string can't be assigned to a numeric column. mysql> insert into t1 values(cast('a' as unsigned integer)); Query OK, 1 row affected (0.00 sec) -- This is the incorrect response; it's no different from the previous example. The INSERT should fail with SQLSTATE HY000. mysql> insert into t1 values('a'+0); Query OK, 1 row affected (0.00 sec) -- This is also incorrect. It isn't possible to add a string to a number, so the INSERT should fail with SQLSTATE HY000. mysql> select * from t1; +------+ | col1 | +------+ | 0 | | 0 | +------+ 2 rows in set (0.00 sec) -- The table should have zero rows.