Bug #40877 multi statement execution fails in 5.1.30
| Submitted: | 20 Nov 2008 9:35 | Modified: | 4 Nov 2010 1:41 |
|---|---|---|---|
| Reporter: | Georg Richter | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S1 (Critical) |
| Version: | 5.0/5.1/6.0 | OS: | Linux (x64) |
| Assigned to: | Georgi Kodinov | CPU Architecture: | Any |
[20 Nov 2008 11:46]
MySQL Verification Team
Thank you for the bug report. Verified on 6.0/5.0 too. C:\temp>bug40877 Client: 5.1.31 Server: 5.1.31-nt-debug-log multi statement error: Cannot delete or update a parent row: a foreign key constraint fails C:\temp>bug60.exe Client: 6.0.9-alpha Server: 6.0.9-alpha-nt-debug-log multi statement error: Cannot delete or update a parent row: a foreign key constraint fails C:\temp>bug50.exe Client: 5.0.74 Server: 5.0.74-nt-log multi statement error:
[13 Oct 2009 15:15]
Georgi Kodinov
There's problems on two levels that prevent multi statements working as they should with this example : 1. The Innodb storage engine assumes the string returned by thd_query() (THD::query actually) is null-terminated. This is true with single statements. But with multi statements it's not true. Innodb should be extended to use char pointer/length instead of null-terminated strings. But it (currently) has no way getting this information out of the server. Which brings us to problem #2 2. The MySQL server has a THD::query_length that contains the length of THD::query. We need to expose this to the Innodb storage engine. This is best done by a new function that will return a LEX_STRING instead of char *. And while at it we may just as well wrap the string pointer and the length into a LEX_STRING internally and provide accessor methods for easy code update. I will use this bug report to track the solution of problem #2. #2 is a prerequisite for the real fix (#1). I will open a new bug for problem #1.
[13 Oct 2009 15:36]
Georgi Kodinov
Problem #2 reported as bug #48024.
[13 Oct 2009 16:20]
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/86705 3156 Georgi Kodinov 2009-10-13 Bug #40877: multi statement execution fails in 5.1.30 Implemented the server infrastructure for the fix: 1. Added a function LEX_STRING *thd_query_string(THD) to return a LEX_STRING structure instead of char *. This is the function that must be called in innodb instead of thd_query() 2. Did some encapsulation in THD : aggregated thd_query and thd_query_length into a LEX_STRING and made accessor and mutator methods for easy code updating. 3. Updated the server code to use the new methods where applicable.
[16 Oct 2009 10:30]
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/87103 3177 Georgi Kodinov 2009-10-16 Bug #40877: multi statement execution fails in 5.1.30 Implemented the server infrastructure for the fix: 1. Added a function LEX_STRING *thd_query_string(THD) to return a LEX_STRING structure instead of char *. This is the function that must be called in innodb instead of thd_query() 2. Did some encapsulation in THD : aggregated thd_query and thd_query_length into a LEX_STRING and made accessor and mutator methods for easy code updating. 3. Updated the server code to use the new methods where applicable.
[16 Oct 2009 13:31]
Georgi Kodinov
Pushed in 5.1-bugteam and merged to mysql-pe
[22 Oct 2009 6:36]
Bugs System
Pushed into 6.0.14-alpha (revid:alik@sun.com-20091022063126-l0qzirh9xyhp0bpc) (version source revid:alik@sun.com-20091019135554-s1pvptt6i750lfhv) (merge vers: 6.0.14-alpha) (pib:13)
[11 Nov 2009 17:03]
Paul DuBois
Noted in 6.0.14 changelog. Multiple-statement execution could fail. Setting report to NDI pending push into 5.1.x, 5.5.x.
[18 Dec 2009 10:37]
Bugs System
Pushed into 5.1.41-ndb-7.1.0 (revid:jonas@mysql.com-20091218102229-64tk47xonu3dv6r6) (version source revid:jonas@mysql.com-20091218095730-26gwjidfsdw45dto) (merge vers: 5.1.41-ndb-7.1.0) (pib:15)
[18 Dec 2009 10:53]
Bugs System
Pushed into 5.1.41-ndb-6.2.19 (revid:jonas@mysql.com-20091218100224-vtzr0fahhsuhjsmt) (version source revid:jonas@mysql.com-20091217101452-qwzyaig50w74xmye) (merge vers: 5.1.41-ndb-6.2.19) (pib:15)
[18 Dec 2009 11:07]
Bugs System
Pushed into 5.1.41-ndb-6.3.31 (revid:jonas@mysql.com-20091218100616-75d9tek96o6ob6k0) (version source revid:jonas@mysql.com-20091217154335-290no45qdins5bwo) (merge vers: 5.1.41-ndb-6.3.31) (pib:15)
[18 Dec 2009 11:22]
Bugs System
Pushed into 5.1.41-ndb-7.0.11 (revid:jonas@mysql.com-20091218101303-ga32mrnr15jsa606) (version source revid:jonas@mysql.com-20091218064304-ezreonykd9f4kelk) (merge vers: 5.1.41-ndb-7.0.11) (pib:15)
[18 Dec 2009 20:34]
Paul DuBois
Setting report to NDI pending push into 5.1.x, 5.5.x.
[26 Mar 2010 16:07]
Paul DuBois
Noted in 5.1.42 changelog. Setting report to Need Merge pending push to Celosia.
[4 Nov 2010 1:41]
Paul DuBois
Noted in 5.5.7 changelog.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.048 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: Multi statement execution fails in 5.1 How to repeat: #include <stdio.h> #include <mysql.h> int main () { MYSQL *mysql = mysql_init(NULL); MYSQL_RES *res; int i, status; char *sql[] = { "SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO", "DROP TABLE IF EXISTS `bank_transactions`", "CREATE TABLE `bank_transactions` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `client_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `client` (`client_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC", "DROP TABLE IF EXISTS `clients`", "CREATE TABLE `clients` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC", "ALTER TABLE `bank_transactions` ADD CONSTRAINT `bank_transactions_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`) ON UPDATE CASCADE"}; char multi_statement[10000]; mysql_real_connect(mysql, "localhost", "root", "", "test", 0, NULL, CLIENT_MULTI_STATEMENTS); printf("Client: %s\nServer: %s\n", mysql_get_client_info(), mysql_get_server_info(mysql)); mysql_query(mysql, "SET AUTOCOMMIT=0"); /* process single statements */ for (i=0; i < 6; i++) { if (mysql_query(mysql, sql[i])) printf("Single statement error: %s\n", mysql_error(mysql)); } /* process multi statement */ sprintf((char *)&multi_statement, "%s;%s;%s;%s;%s;%s", sql[0], sql[1], sql[2], sql[3], sql[4], sql[5]); status = mysql_query(mysql, multi_statement); i= 0; do { if ((res = mysql_store_result(mysql))) { mysql_free_result(res); } status = mysql_next_result(mysql); i++; } while (status == 0); if (mysql_error(mysql)) printf("multi statement error: %s\n", mysql_error(mysql)); } Output: georg@bing:~/work/php/test> ./test Client: 5.1.30 Server: 5.1.30-debug-log multi statement error: Cannot delete or update a parent row: a foreign key constraint fails