From: Jorgen Loland Date: November 11 2010 12:06pm Subject: bzr commit into mysql-5.5-bugteam branch (jorgen.loland:3120) Bug#54812 List-Archive: http://lists.mysql.com/commits/123597 X-Bug: 54812 Message-Id: <20101111120650.887C920AF@atum21.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7654773507260533249==" --===============7654773507260533249== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/jl208045/mysql/mysql-5.5-bugteam-54812/ based on revid:svoj@stripped 3120 Jorgen Loland 2010-11-11 Bug#54812: assert in Diagnostics_area::set_ok_status during EXPLAIN Before the patch, send_eof() of some subclasses of select_result (e.g., select_send::send_eof()) could handle being called after an error had occured while others could not. In the bug, an ASSERT triggered because select_dumpvar::send_eof() was not well behaved after an error had occured, but the problem also applied to other subclasses of select_result. This patch uniforms send_eof() of all subclasses of select_result to handle being called after an error has occured. @ mysql-test/r/errors.result Add test for BUG#54812 @ mysql-test/t/errors.test Add test for BUG#54812 @ sql/sql_class.cc Make send_eof() of all subclasses of select_result handle being called after an error has occured. @ sql/sql_insert.cc Make send_eof() of all subclasses of select_result handle being called after an error has occured. @ sql/sql_update.cc Make send_eof() of all subclasses of select_result handle being called after an error has occured. modified: mysql-test/r/errors.result mysql-test/t/errors.test sql/sql_class.cc sql/sql_insert.cc sql/sql_update.cc === modified file 'mysql-test/r/errors.result' --- a/mysql-test/r/errors.result 2010-11-04 12:36:36 +0000 +++ b/mysql-test/r/errors.result 2010-11-11 12:06:45 +0000 @@ -146,3 +146,29 @@ ERROR 22003: BIGINT value is out of rang # # End Bug#57882 # +# Bug#54812: assert in Diagnostics_area::set_ok_status during EXPLAIN +# +CREATE USER nopriv_user@localhost; +connection: default +CREATE TABLE t1 (key1 INT PRIMARY KEY); +CREATE TABLE t2 (key2 INT); +INSERT INTO t1 VALUES (1),(2); +CREATE FUNCTION f() RETURNS INT RETURN 1; +GRANT FILE ON *.* TO 'nopriv_user'@'localhost'; +FLUSH PRIVILEGES; +connection: con1 +SELECT MAX(key1) FROM t1 WHERE f() < 1 INTO OUTFILE 'mytest'; +ERROR 42000: execute command denied to user 'nopriv_user'@'localhost' for routine 'test.f' +INSERT INTO t2 SELECT MAX(key1) FROM t1 WHERE f() < 1; +ERROR 42000: execute command denied to user 'nopriv_user'@'localhost' for routine 'test.f' +SELECT MAX(key1) INTO @dummy FROM t1 WHERE f() < 1; +ERROR 42000: execute command denied to user 'nopriv_user'@'localhost' for routine 'test.f' +CREATE TABLE t3 (i INT) AS SELECT MAX(key1) FROM t1 WHERE f() < 1; +ERROR 42000: execute command denied to user 'nopriv_user'@'localhost' for routine 'test.f' +connection: default +DROP TABLE t1,t2; +DROP FUNCTION f; +DROP USER nopriv_user@localhost; +# +# End Bug#57882 +# === modified file 'mysql-test/t/errors.test' --- a/mysql-test/t/errors.test 2010-11-04 12:36:36 +0000 +++ b/mysql-test/t/errors.test 2010-11-11 12:06:45 +0000 @@ -171,3 +171,47 @@ SELECT UPDATEXML(-73 * -2465717823867977 --echo # --echo # End Bug#57882 --echo # +--echo # Bug#54812: assert in Diagnostics_area::set_ok_status during EXPLAIN +--echo # + +CREATE USER nopriv_user@localhost; + +connection default; +--echo connection: default + +CREATE TABLE t1 (key1 INT PRIMARY KEY); +CREATE TABLE t2 (key2 INT); +INSERT INTO t1 VALUES (1),(2); + +CREATE FUNCTION f() RETURNS INT RETURN 1; + +GRANT FILE ON *.* TO 'nopriv_user'@'localhost'; + +FLUSH PRIVILEGES; + +connect (con1,localhost,nopriv_user,,); +connection con1; +--echo connection: con1 + +--error 1370 +SELECT MAX(key1) FROM t1 WHERE f() < 1 INTO OUTFILE 'mytest'; + +--error 1370 +INSERT INTO t2 SELECT MAX(key1) FROM t1 WHERE f() < 1; + +--error 1370 +SELECT MAX(key1) INTO @dummy FROM t1 WHERE f() < 1; + +--error 1370 +CREATE TABLE t3 (i INT) AS SELECT MAX(key1) FROM t1 WHERE f() < 1; + +connection default; +--echo connection: default + +DROP TABLE t1,t2; +DROP FUNCTION f; +DROP USER nopriv_user@localhost; + +--echo # +--echo # End Bug#57882 +--echo # === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2010-10-23 13:09:27 +0000 +++ b/sql/sql_class.cc 2010-11-11 12:06:45 +0000 @@ -1841,6 +1841,13 @@ void select_to_file::send_error(uint err bool select_to_file::send_eof() { + /* + Don't send EOF if we're in error condition (which implies we've already + sent or are sending an error) + */ + if (thd->is_error()) + return TRUE; + int error= test(end_io_cache(&cache)); if (mysql_file_close(file, MYF(MY_WME))) error= 1; @@ -2881,6 +2888,13 @@ bool select_dumpvar::send_data(Listis_error()) + return TRUE; + if (! row_count) push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_SP_FETCH_NO_DATA, ER(ER_SP_FETCH_NO_DATA)); === modified file 'sql/sql_insert.cc' --- a/sql/sql_insert.cc 2010-10-07 10:01:51 +0000 +++ b/sql/sql_insert.cc 2010-11-11 12:06:45 +0000 @@ -3504,6 +3504,13 @@ bool select_insert::send_eof() DBUG_PRINT("enter", ("trans_table=%d, table_type='%s'", trans_table, table->file->table_type())); + /* + Don't send EOF if we're in error condition (which implies we've already + sent or are sending an error) + */ + if (thd->is_error()) + DBUG_RETURN(TRUE); + error= (thd->locked_tables_mode <= LTM_LOCK_TABLES ? table->file->ha_end_bulk_insert() : 0); table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); @@ -4047,6 +4054,13 @@ void select_create::send_error(uint errc bool select_create::send_eof() { + /* + Don't send EOF if we're in error condition (which implies we've already + sent or are sending an error) + */ + if (thd->is_error()) + return TRUE; + bool tmp=select_insert::send_eof(); if (tmp) abort(); === modified file 'sql/sql_update.cc' --- a/sql/sql_update.cc 2010-10-07 10:01:51 +0000 +++ b/sql/sql_update.cc 2010-11-11 12:06:45 +0000 @@ -2061,6 +2061,13 @@ bool multi_update::send_eof() thd_proc_info(thd, "updating reference tables"); /* + Don't send EOF if we're in error condition (which implies we've already + sent or are sending an error) + */ + if (thd->is_error()) + return TRUE; + + /* Does updates for the last n - 1 tables, returns 0 if ok; error takes into account killed status gained in do_updates() */ --===============7654773507260533249== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jorgen.loland@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jorgen.loland@stripped\ # v1r3u5wue91bxci6 # target_branch: file:///export/home/jl208045/mysql/mysql-5.5-bugteam-\ # 54812/ # testament_sha1: e853a6b8d8ef548ab48d3ffb0b3f680f5de822c3 # timestamp: 2010-11-11 13:06:50 +0100 # base_revision_id: svoj@stripped # # Begin bundle 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 --===============7654773507260533249==--