| Bug #50096 | CONCAT_WS inside procedure returning wrong data | ||
|---|---|---|---|
| Submitted: | 5 Jan 2010 18:53 | Modified: | 12 Mar 2010 16:29 | 
| Reporter: | Anca Dogaru | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: General | Severity: | S2 (Serious) | 
| Version: | 5.1.41, 6.0.14 | OS: | Linux (centos5 64 bit) | 
| Assigned to: | Gleb Shchepa | CPU Architecture: | Any | 
| Tags: | concat, procedures, regression, session variables | ||
   [5 Jan 2010 18:53]
   Anca Dogaru        
  
 
   [6 Jan 2010 4:35]
   Valeriy Kravchuk        
  Verified just as described. Problem is repeatable also in 6.0.14:
77-52-1-11:6.0-codebase openxs$ bin/mysql -uroot test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 6.0.14-alpha-debug Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> DELIMITER //
mysql> DROP PROCEDURE IF EXISTS test_concat //
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE PROCEDURE test_concat(
    ->   iname varchar(255),
    ->   itimeout tinyint,
    ->   ilifetime mediumint
    -> )
    -> DETERMINISTIC
    -> BEGIN 
    -> SELECT iname;
    -> SELECT itimeout;
    -> SELECT ilifetime;
    -> SET @query = CONCAT_WS(",",quote(iname), itimeout, ilifetime);
    -> SELECT @query;
    -> SELECT CONCAT_WS(",",quote(iname), itimeout, ilifetime);
    -> END //  
Query OK, 0 rows affected (0.36 sec)
mysql> delimiter ;
mysql>  call test_concat( "test1", "8", "1800");
+-------+
| iname |
+-------+
| test1 |
+-------+
1 row in set (0.00 sec)
+----------+
| itimeout |
+----------+
|        8 |
+----------+
1 row in set (0.00 sec)
+-----------+
| ilifetime |
+-----------+
|      1800 |
+-----------+
1 row in set (0.00 sec)
+----------------+
| @query         |
+----------------+
| 'test1',8,'tes |
+----------------+
1 row in set (0.00 sec)
+--------------------------------------------------+
| CONCAT_WS(",",quote(iname), itimeout, ilifetime) |
+--------------------------------------------------+
| 'test1',8,1800                                   |
+--------------------------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
And it is a regression bug, indeed, as older versions work properly:
77-52-1-11:mysql openxs$ bin/mysql -uroot test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.37 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> DELIMITER //
mysql> DROP PROCEDURE IF EXISTS test_concat //
Query OK, 0 rows affected, 1 warning (0.37 sec)
mysql> CREATE PROCEDURE test_concat(
    ->   iname varchar(255),
    ->   itimeout tinyint,
    ->   ilifetime mediumint
    -> )
    -> DETERMINISTIC
    -> BEGIN 
    -> SELECT iname;
    -> SELECT itimeout;
    -> SELECT ilifetime;
    -> SET @query = CONCAT_WS(",",quote(iname), itimeout, ilifetime);
    -> SELECT @query;
    -> SELECT CONCAT_WS(",",quote(iname), itimeout, ilifetime);
    -> END //  
Query OK, 0 rows affected (0.01 sec)
mysql>  call test_concat( "test1", "8", "1800");
    -> //
+-------+
| iname |
+-------+
| test1 | 
+-------+
1 row in set (0.00 sec)
+----------+
| itimeout |
+----------+
|        8 | 
+----------+
1 row in set (0.00 sec)
+-----------+
| ilifetime |
+-----------+
|      1800 | 
+-----------+
1 row in set (0.00 sec)
+----------------+
| @query         |
+----------------+
| 'test1',8,1800 | 
+----------------+
1 row in set (0.00 sec)
+--------------------------------------------------+
| CONCAT_WS(",",quote(iname), itimeout, ilifetime) |
+--------------------------------------------------+
| 'test1',8,1800                                   | 
+--------------------------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
 
   [12 Jan 2010 11:39]
   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/96598 3311 Gleb Shchepa 2010-01-12 Bug #50096: CONCAT_WS inside procedure returning wrong data Selecting of the CONCAT_WS(...<PS parameter>...) result into a user variable may return wrong data. The Item_func_concat_ws::val_str function has been modified to take into account val_str functions (such as Item_sp_variable::val_str) that return a pointer to an internal Item member variable that may reference to a buffer provided. @ mysql-test/r/func_concat.result Added test case for bug #50096. @ mysql-test/t/func_concat.test Added test case for bug #50096. @ sql/item_strfunc.cc Bug #50096: CONCAT_WS inside procedure returning wrong data The Item_func_concat_ws::val_str function has been modified to take into account val_str functions (such as Item_sp_variable::val_str) that return a pointer to an internal Item member variable that may reference to a buffer provided.
   [12 Jan 2010 11:43]
   Gleb Shchepa        
  More detailed explanation of the problem: Item_func_concat_ws::val_str contains a number of memory allocation-saving optimization tricks. After the fix for bug #46815 the control flow has been changed to a branch that is commented as "This is quite uncommon!": one of places where we are trying to concatenate strings inplace. However, that "uncommon" place didn't care about PS parameters, that have another trick in Item_sp_variable::val_str(): they use the intermediate Item_sp_variable::str_value field, where they may store a reference to an external argument's buffer.
   [12 Jan 2010 12:04]
   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/96601 3311 Gleb Shchepa 2010-01-12 Bug #50096: CONCAT_WS inside procedure returning wrong data Selecting of the CONCAT_WS(...<PS parameter>...) result into a user variable may return wrong data. Item_func_concat_ws::val_str contains a number of memory allocation-saving optimization tricks. After the fix for bug 46815 the control flow has been changed to a branch that is commented as "This is quite uncommon!": one of places where we are trying to concatenate strings inplace. However, that "uncommon" place didn't care about PS parameters, that have another trick in Item_sp_variable::val_str(): they use the intermediate Item_sp_variable::str_value field, where they may store a reference to an external The Item_func_concat_ws::val_str function has been modified to take into account val_str functions (such as Item_sp_variable::val_str) that return a pointer to an internal Item member variable that may reference to a buffer provided. @ mysql-test/r/func_concat.result Added test case for bug #50096. @ mysql-test/t/func_concat.test Added test case for bug #50096. @ sql/item_strfunc.cc Bug #50096: CONCAT_WS inside procedure returning wrong data The Item_func_concat_ws::val_str function has been modified to take into account val_str functions (such as Item_sp_variable::val_str) that return a pointer to an internal Item member variable that may reference to a buffer provided.
   [13 Jan 2010 4: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/96693 3312 Gleb Shchepa 2010-01-13 Bug #50096: CONCAT_WS inside procedure returning wrong data Selecting of the CONCAT_WS(...<PS parameter>...) result into a user variable may return wrong data. Item_func_concat_ws::val_str contains a number of memory allocation-saving optimization tricks. After the fix for bug 46815 the control flow has been changed to a branch that is commented as "This is quite uncommon!": one of places where we are trying to concatenate strings inplace. However, that "uncommon" place didn't care about PS parameters, that have another trick in Item_sp_variable::val_str(): they use the intermediate Item_sp_variable::str_value field, where they may store a reference to an external argument's buffer. The Item_func_concat_ws::val_str function has been modified to take into account val_str functions (such as Item_sp_variable::val_str) that return a pointer to an internal Item member variable that may reference to a buffer provided. @ mysql-test/r/func_concat.result Added test case for bug #50096. @ mysql-test/t/func_concat.test Added test case for bug #50096. @ sql/item_strfunc.cc Bug #50096: CONCAT_WS inside procedure returning wrong data The Item_func_concat_ws::val_str function has been modified to take into account val_str functions (such as Item_sp_variable::val_str) that return a pointer to an internal Item member variable that may reference to a buffer provided.
   [15 Jan 2010 9:01]
   Bugs System        
  Pushed into 5.1.43 (revid:joro@sun.com-20100115085139-qkh0i0fpohd9u9p5) (version source revid:martin.hansson@sun.com-20100113113806-5742ed1swr9rtb4b) (merge vers: 5.1.43) (pib:16)
   [22 Jan 2010 1:21]
   Paul DuBois        
  Noted in 5.1.43 changelog. Within a stored routine, selecting the result of CONCAT_WS() with a routine parameter argument into a user variable could return incorrect results. Setting report to NDI pending push to 5.5.x+.
   [1 Feb 2010 17:50]
   Paul DuBois        
  Setting report to Need Merge pending push to 5.5.x+.
   [5 Feb 2010 11:49]
   Bugs System        
  Pushed into mysql-next-mr (revid:alik@sun.com-20100204063540-9czpdmpixi3iw2yb) (version source revid:alik@sun.com-20100119163614-172adculixyu26j5) (pib:16)
   [5 Feb 2010 11:55]
   Bugs System        
  Pushed into 6.0.14-alpha (revid:alik@sun.com-20100205113942-oqovjy0eoqbarn7i) (version source revid:alik@sun.com-20100204064210-ljwanqvrjs83s1gq) (merge vers: 6.0.14-alpha) (pib:16)
   [5 Feb 2010 12:01]
   Bugs System        
  Pushed into 5.5.2-m2 (revid:alik@sun.com-20100203172258-1n5dsotny40yufxw) (version source revid:alexey.kopytov@sun.com-20100115112653-e3a24041ag1cv6v3) (merge vers: 5.5.1-m2) (pib:16)
   [6 Feb 2010 1:16]
   Paul DuBois        
  Noted in 5.5.2, 6.0.14 changelogs. Setting report to Need Merge pending push to Celosia.
   [12 Mar 2010 14:20]
   Bugs System        
  Pushed into 5.1.44-ndb-7.0.14 (revid:jonas@mysql.com-20100312135944-t0z8s1da2orvl66x) (version source revid:jonas@mysql.com-20100312115609-woou0te4a6s4ae9y) (merge vers: 5.1.44-ndb-7.0.14) (pib:16)
   [12 Mar 2010 14:35]
   Bugs System        
  Pushed into 5.1.44-ndb-6.2.19 (revid:jonas@mysql.com-20100312134846-tuqhd9w3tv4xgl3d) (version source revid:jonas@mysql.com-20100312060623-mx6407w2vx76h3by) (merge vers: 5.1.44-ndb-6.2.19) (pib:16)
   [12 Mar 2010 14:51]
   Bugs System        
  Pushed into 5.1.44-ndb-6.3.33 (revid:jonas@mysql.com-20100312135724-xcw8vw2lu3mijrhn) (version source revid:jonas@mysql.com-20100312103652-snkltsd197l7q2yg) (merge vers: 5.1.44-ndb-6.3.33) (pib:16)
   [12 Mar 2010 16:15]
   Paul DuBois        
  Setting report to Need Merge pending push to Celosia.
   [12 Mar 2010 16:29]
   Paul DuBois        
  Fixed in earlier 5.1.x, 5.5.x.
   [2 Apr 2010 6:22]
   Gleb Shchepa        
  Also see similar CONCAT() bug #40625.
