| Bug #45780 | CONCAT(CASE(numeric)) returns wrong length | ||
|---|---|---|---|
| Submitted: | 26 Jun 2009 8:44 | Modified: | 7 Jul 2009 15:22 |
| Reporter: | Alexander Barkov | Email Updates: | |
| Status: | Patch pending | Impact on me: | |
| Category: | MySQL Server: Data Types | Severity: | S3 (Non-critical) |
| Version: | 5.1.35 | OS: | Any |
| Assigned to: | Assigned Account | CPU Architecture: | Any |
[26 Jun 2009 8:44]
Alexander Barkov
[27 Jun 2009 0:24]
MySQL Verification Team
Hi, Are you able to repeat the test case with current source server? c:\dbs>c:\dbs\5.1\bin\mysql -uroot --port=3510 --prompt="mysql 5.1 >" Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.37-Win X64-log Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql 5.1 >use d1 Database changed mysql 5.1 >select version(); +--------------------+ | version() | +--------------------+ | 5.1.37-Win X64-log | +--------------------+ 1 row in set (0.00 sec) mysql 5.1 >create table t1 as select concat(case when 1 then 2 else 3 end) as c1; ERROR 1406 (22001): Data too long for column 'c1' at row 1 Thanks in advance.
[29 Jun 2009 6:33]
Alexander Barkov
Hi Miguel,
yes, I was able to reproduce it with the latest 5.1.37-bugteam
mysql> drop table t1;
Query OK, 0 rows affected (0.00 sec)
mysql> select version();
+--------------+
| version() |
+--------------+
| 5.1.37-debug |
+--------------+
1 row in set (0.00 sec)
mysql> create table t1 as select concat(case when 1 then 2 else 3 end)
-> as c1;
Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 1
mysql> show warnings;
+---------+------+-----------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------+
| Warning | 1265 | Data truncated for column 'c1' at row 1 |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)
mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` binary(0) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
[1 Jul 2009 15:18]
MySQL Verification Team
Thank you for the bug report.
mysql 5.1 >create table t1 as select concat(case when 1 then 2 else 3 end) as c1;
Query OK, 1 row affected, 1 warning (0.22 sec)
Records: 1 Duplicates: 0 Warnings: 1
mysql 5.1 >show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c1` binary(0) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql 5.1 >
[7 Jul 2009 15:22]
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/78156 3007 Alexey Botchkov 2009-07-07 Bug#45780 CONCAT(CASE(numeric)) returns wrong length it's more natural to calculate the precision of the result with the functions like Item::decimal_precision() or Item::decimal_int_part() than with the indirect methods from the max_length per-file comments: mysql-test/r/func_concat.result Bug#45780 CONCAT(CASE(numeric)) returns wrong length test result mysql-test/t/func_concat.test Bug#45780 CONCAT(CASE(numeric)) returns wrong length test case sql/item_cmpfunc.cc Bug#45780 CONCAT(CASE(numeric)) returns wrong length use Item::decimal_int_part() to calculate the precision of the result
[8 Jul 2009 11:12]
Alexander Barkov
http://lists.mysql.com/commits/78156 is Ok to push.
