Bug #32282 TEXT silently truncates when value is exactly 65536 bytes
Submitted: 12 Nov 2007 15:12 Modified: 18 Dec 2007 5:49
Reporter: Roland Bouman
Status: Closed
Category:Server: Types Severity:S3 (Non-critical)
Version:5.0, 5.1.22 rc OS:Linux (kubuntu feisty)
Assigned to: Gleb Shchepa Target Version:
Triage: D2 (Serious)

[12 Nov 2007 15:12] Roland Bouman
Description:
TEXT is supposed to be able to store 65535 bytes at a maximum. It truncates the value if
it exceeds that amount and gives a warning.

However,there is a strange corner case when the length is exactly 65536 bytes, in which
case the value is *silently truncated* to the actual maximum of 65535 bytes.

How to repeat:
mysql> create table t(
    ->     c text charset ascii
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql>
mysql> insert into t (c) values (repeat('1',65537));
Query OK, 1 row affected, 1 warning (0.01 sec)

Warning (Code 1265): Data truncated for column 'c' at row 1
mysql>
mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'c' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> insert into t (c) values (repeat('2',65536));
Query OK, 1 row affected (0.01 sec)

mysql>
mysql> show warnings;
Empty set (0.00 sec)

mysql>
mysql> insert into t (c) values (repeat('3',65535));
Query OK, 1 row affected (0.03 sec)

mysql>
mysql> show warnings;
Empty set (0.00 sec)

mysql>
mysql> select length(c), char_length(c)
    -> from t;
+-----------+----------------+
| length(c) | char_length(c) |
+-----------+----------------+
|     65535 |          65535 |
|     65535 |          65535 |
|     65535 |          65535 |
+-----------+----------------+
3 rows in set (0.00 sec)

Suggested fix:
Please don't truncate and give a proper warning (or error depedning on sql_mode)
[12 Nov 2007 17:07] Valeriy Kravchuk
Thank you for a bug report. Verified just as described.
[12 Nov 2007 17:15] Hartmut Holzgraefe
mysqltest test case

Attachment: bug32282.tgz (application/x-gtar, text), 880 bytes.

[12 Nov 2007 22:09] 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/commits/37617

ChangeSet@1.2570, 2007-11-13 01:10:30+04:00, gshchepa@gleb.loc +3 -0
  Fixed bug #32282: TEXT silently truncates when value is exactly 65536
  bytes length.
  
  The server has been modified to report warnings on truncation to
  65536 bytes as usual.
[13 Nov 2007 0:24] 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/commits/37625

ChangeSet@1.2570, 2007-11-13 03:26:03+04:00, gshchepa@gleb.loc +3 -0
  Fixed bug #32282: TEXT silently truncates when value is exactly 65536
  bytes length.
  
  The server has been modified to report warnings on truncation to
  65536 bytes as usual.
  
  Byte length of the input string was used in the
  Field_blob::store method instead of the maximal number
  of characters (see the well_formed_copy_nchars function call).
[19 Nov 2007 18:25] 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/commits/38086

ChangeSet@1.2570, 2007-11-19 21:25:36+04:00, gshchepa@gleb.loc +3 -0
  Fixed bug #32282: TEXT silently truncates when value is exactly 65536
  bytes length.
  
  The server has been modified to report warnings on truncation to
  65536 bytes as usual.
[14 Dec 2007 9:14] Bugs System
Pushed into 5.0.54
[14 Dec 2007 9:17] Bugs System
Pushed into 5.1.23-rc
[14 Dec 2007 9:21] Bugs System
Pushed into 6.0.5-alpha
[18 Dec 2007 5:49] Paul DuBois
Noted in 5.0.54, 5.1.23, 6.0.5 changelogs.
[18 Dec 2007 5:50] Paul DuBois
Sorry, forgot changelog text:

Assigning a 65,536-byte string to a TEXT column (which can hold a
maximum of 65,535 bytes) resulted in truncation without a warning.
Now a truncation warning is generated.