From: Martin Hansson Date: September 7 2010 8:01am Subject: bzr push into mysql-5.1-bugteam branch (martin.hansson:3499 to 3500) Bug#54543 List-Archive: http://lists.mysql.com/commits/117674 X-Bug: 54543 Message-Id: <20100907080131.0292E13FAC6@scott> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5309391304345178711==" --===============5309391304345178711== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3500 Martin Hansson 2010-09-07 Bug#54543: update ignore with incorrect subquery leads to assertion failure: inited==INDEX When an error occurs while sending the data in a temporary table there was no cleanup performed. This caused a failed assertion in the case when different access methods were used for populating the table vs. retrieving the data from the table if IGNORE was specified and sql_safe_updates = 0. In this case execution continues, but the handler expects to continue with the access method used for row retrieval. Fixed by doing the cleanup even if errors occur. modified: mysql-test/r/multi_update.result mysql-test/t/multi_update.test sql/sql_select.cc 3499 Dmitry Shulga 2010-09-07 Fixed bug #47485 - mysql_store_result returns a not NULL result set for a prepared statement. @ include/mysql.h enumerator MYSQL_STATUS_STATEMENT_GET_RESULT was added into mysql_status enum. @ include/mysql.h.pp enumerator MYSQL_STATUS_STATEMENT_GET_RESULT was added into mysql_status enum. @ libmysql/libmysql.c Introduce a separate mysql state to distinguish the situation when we have a binary result set pending on the server from the situation when the result set is in text protocol. execute() modified: if mysql->status == MYSQL_STATUS_GET_RESULT before return then set it to value MYSQL_STATUS_STATEMENT_GET_RESULT. stmt_read_row_unbuffered() and mysql_stmt_store_result() were modified: added checking for mysql->status against MYSQL_STATUS_STATEMENT_GET_RESULT value instead of MYSQL_STATUS_GET_RESULT. @ tests/mysql_client_test.c added test_bug47485() modified: include/mysql.h include/mysql.h.pp libmysql/libmysql.c tests/mysql_client_test.c === modified file 'mysql-test/r/multi_update.result' --- a/mysql-test/r/multi_update.result 2010-05-24 13:54:08 +0000 +++ b/mysql-test/r/multi_update.result 2010-09-07 07:58:05 +0000 @@ -639,4 +639,24 @@ SET SESSION sql_safe_updates = 1; UPDATE IGNORE t1, t1 t1a SET t1.a = 1 WHERE t1a.a = 1; ERROR HY000: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column DROP TABLE t1; +# +# Bug#54543: update ignore with incorrect subquery leads to assertion +# failure: inited==INDEX +# +SET SESSION sql_safe_updates = 0; +CREATE TABLE t1 ( a INT ); +INSERT INTO t1 VALUES (1), (2); +CREATE TABLE t2 ( a INT ); +INSERT INTO t2 VALUES (1), (2); +CREATE TABLE t3 ( a INT ); +INSERT INTO t3 VALUES (1), (2); +# Should not crash +UPDATE IGNORE +( SELECT ( SELECT COUNT(*) FROM t1 GROUP BY a, @v ) a FROM t2 ) x, t3 +SET t3.a = 0; +Warnings: +Error 1242 Subquery returns more than 1 row +Error 1242 Subquery returns more than 1 row +DROP TABLE t1, t2, t3; +SET SESSION sql_safe_updates = DEFAULT; end of tests === modified file 'mysql-test/t/multi_update.test' --- a/mysql-test/t/multi_update.test 2010-05-24 13:54:08 +0000 +++ b/mysql-test/t/multi_update.test 2010-09-07 07:58:05 +0000 @@ -651,5 +651,26 @@ SET SESSION sql_safe_updates = 1; UPDATE IGNORE t1, t1 t1a SET t1.a = 1 WHERE t1a.a = 1; DROP TABLE t1; +--echo # +--echo # Bug#54543: update ignore with incorrect subquery leads to assertion +--echo # failure: inited==INDEX +--echo # +SET SESSION sql_safe_updates = 0; +CREATE TABLE t1 ( a INT ); +INSERT INTO t1 VALUES (1), (2); + +CREATE TABLE t2 ( a INT ); +INSERT INTO t2 VALUES (1), (2); + +CREATE TABLE t3 ( a INT ); +INSERT INTO t3 VALUES (1), (2); + +--echo # Should not crash +UPDATE IGNORE + ( SELECT ( SELECT COUNT(*) FROM t1 GROUP BY a, @v ) a FROM t2 ) x, t3 +SET t3.a = 0; + +DROP TABLE t1, t2, t3; +SET SESSION sql_safe_updates = DEFAULT; --echo end of tests === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-08-26 09:31:04 +0000 +++ b/sql/sql_select.cc 2010-09-07 07:58:05 +0000 @@ -11157,22 +11157,20 @@ do_select(JOIN *join,List *fields, if (error == NESTED_LOOP_NO_MORE_ROWS) error= NESTED_LOOP_OK; + if (table == NULL) // If sending data to client + /* + The following will unlock all cursors if the command wasn't an + update command + */ + join->join_free(); // Unlock all cursors if (error == NESTED_LOOP_OK) { /* Sic: this branch works even if rc != 0, e.g. when send_data above returns an error. */ - if (!table) // If sending data to client - { - /* - The following will unlock all cursors if the command wasn't an - update command - */ - join->join_free(); // Unlock all cursors - if (join->result->send_eof()) - rc= 1; // Don't send error - } + if (table == NULL && join->result->send_eof()) // If sending data to client + rc= 1; // Don't send error DBUG_PRINT("info",("%ld records output", (long) join->send_records)); } else --===============5309391304345178711== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/martin.hansson@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: martin.hansson@stripped\ # bdwvuzoxl1jrzlfz # target_branch: file:///data0/martin/bzr/bug54543/5.1bt-commit/ # testament_sha1: 670ce42ce4a00875eb5e4b6eb9c3155a26a674f6 # timestamp: 2010-09-07 10:01:30 +0200 # base_revision_id: dmitry.shulga@stripped\ # gp49vt60m5uqcel5 # # Begin bundle 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 HiXYCNuk5Gw/8XckU4UJBZwYl3A= --===============5309391304345178711==--