From: Jon Olav Hauglid Date: July 16 2010 9:02am Subject: bzr commit into mysql-5.1-bugteam branch (jon.hauglid:3488) Bug#54734 List-Archive: http://lists.mysql.com/commits/113739 X-Bug: 54734 Message-Id: <201007160902.o6G8OqCO002035@rcsinet13.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3759686968079918116==" --===============3759686968079918116== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.1-bugteam-bug54734/ based on revid:georgi.kodinov@stripped 3488 Jon Olav Hauglid 2010-07-16 Bug #54734 assert in Diagnostics_area::set_ok_status This assert checks that the server does not try to send OK to the client if there has been some error during processing. This to make sure that the error is in fact sent to the client. The problem was that view errors during processing of WHERE conditions in UPDATE statements where not detected by the update code. It therefore tried to send OK to the client, triggering the assert. The bug was only noticeable in debug builds. This patch fixes the problem by making sure that the update code checks for errors during condition processing and acts accordingly. modified: mysql-test/r/update.result mysql-test/t/update.test sql/filesort.cc sql/opt_range.h sql/sql_delete.cc sql/sql_select.cc sql/sql_update.cc === modified file 'mysql-test/r/update.result' --- a/mysql-test/r/update.result 2010-03-10 16:10:05 +0000 +++ b/mysql-test/r/update.result 2010-07-16 09:02:15 +0000 @@ -527,3 +527,17 @@ ERROR HY000: You are using safe update m SET SESSION sql_safe_updates = DEFAULT; DROP TABLE t1; DROP VIEW v1; +# +# Bug#54734 assert in Diagnostics_area::set_ok_status +# +DROP TABLE IF EXISTS t1, not_exists; +DROP FUNCTION IF EXISTS f1; +DROP VIEW IF EXISTS v1; +CREATE TABLE t1 (PRIMARY KEY(pk)) AS SELECT 1 AS pk; +CREATE FUNCTION f1() RETURNS INTEGER RETURN (SELECT 1 FROM not_exists); +CREATE VIEW v1 AS SELECT pk FROM t1 WHERE f1() = 13; +UPDATE v1 SET pk = 7 WHERE pk > 0; +ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +DROP VIEW v1; +DROP FUNCTION f1; +DROP TABLE t1; === modified file 'mysql-test/t/update.test' --- a/mysql-test/t/update.test 2010-03-10 16:10:05 +0000 +++ b/mysql-test/t/update.test 2010-07-16 09:02:15 +0000 @@ -483,3 +483,23 @@ UPDATE IGNORE v1 SET a = 1; SET SESSION sql_safe_updates = DEFAULT; DROP TABLE t1; DROP VIEW v1; + +--echo # +--echo # Bug#54734 assert in Diagnostics_area::set_ok_status +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1, not_exists; +DROP FUNCTION IF EXISTS f1; +DROP VIEW IF EXISTS v1; +--enable_warnings + +CREATE TABLE t1 (PRIMARY KEY(pk)) AS SELECT 1 AS pk; +CREATE FUNCTION f1() RETURNS INTEGER RETURN (SELECT 1 FROM not_exists); +CREATE VIEW v1 AS SELECT pk FROM t1 WHERE f1() = 13; +--error ER_VIEW_INVALID +UPDATE v1 SET pk = 7 WHERE pk > 0; + +DROP VIEW v1; +DROP FUNCTION f1; +DROP TABLE t1; === modified file 'sql/filesort.cc' --- a/sql/filesort.cc 2010-04-12 10:12:20 +0000 +++ b/sql/filesort.cc 2010-07-16 09:02:15 +0000 @@ -514,6 +514,7 @@ static ha_rows find_all_keys(SORTPARAM * volatile THD::killed_state *killed= &thd->killed; handler *file; MY_BITMAP *save_read_set, *save_write_set; + bool skip_record; DBUG_ENTER("find_all_keys"); DBUG_PRINT("info",("using: %s", (select ? select->quick ? "ranges" : "where": @@ -606,7 +607,8 @@ static ha_rows find_all_keys(SORTPARAM * } if (error == 0) param->examined_rows++; - if (error == 0 && (!select || select->skip_record() == 0)) + if (!error && (!select || + (!select->skip_record(thd, &skip_record) && !skip_record))) { if (idx == param->keys) { === modified file 'sql/opt_range.h' --- a/sql/opt_range.h 2010-06-24 13:21:23 +0000 +++ b/sql/opt_range.h 2010-07-16 09:02:15 +0000 @@ -788,7 +788,11 @@ class SQL_SELECT :public Sql_alloc { tmp.set_all(); return test_quick_select(thd, tmp, 0, limit, force_quick_range) < 0; } - inline bool skip_record() { return cond ? cond->val_int() == 0 : 0; } + inline bool skip_record(THD *thd, bool *skip_record) + { + *skip_record= cond ? cond->val_int() == FALSE : FALSE; + return thd->is_error(); + } int test_quick_select(THD *thd, key_map keys, table_map prev_tables, ha_rows limit, bool force_quick_range); }; === modified file 'sql/sql_delete.cc' --- a/sql/sql_delete.cc 2010-06-10 20:45:22 +0000 +++ b/sql/sql_delete.cc 2010-07-16 09:02:15 +0000 @@ -51,6 +51,7 @@ bool mysql_delete(THD *thd, TABLE_LIST * THD::killed_state killed_status= THD::NOT_KILLED; DBUG_ENTER("mysql_delete"); bool save_binlog_row_based; + bool skip_record; THD::enum_binlog_query_type query_type= thd->lex->sql_command == SQLCOM_TRUNCATE ? @@ -307,7 +308,7 @@ bool mysql_delete(THD *thd, TABLE_LIST * { thd->examined_row_count++; // thd->is_error() is tested to disallow delete row on error - if (!(select && select->skip_record())&& ! thd->is_error() ) + if (!select || (!select->skip_record(thd, &skip_record) && !skip_record)) { if (triggers_applicable && === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-07-09 10:39:47 +0000 +++ b/sql/sql_select.cc 2010-07-16 09:02:15 +0000 @@ -11657,38 +11657,30 @@ flush_cached_records(JOIN *join,JOIN_TAB SQL_SELECT *select=join_tab->select; if (rc == NESTED_LOOP_OK) { - bool consider_record= !join_tab->cache.select || - !join_tab->cache.select->skip_record(); - - /* - Check for error: skip_record() can execute code by calling - Item_subselect::val_*. We need to check for errors (if any) - after such call. - */ - if (join->thd->is_error()) + bool skip_record= FALSE; + if (join_tab->cache.select && + join_tab->cache.select->skip_record(join->thd, &skip_record)) { reset_cache_write(&join_tab->cache); return NESTED_LOOP_ERROR; } - if (consider_record) + if (!skip_record) { uint i; reset_cache_read(&join_tab->cache); for (i=(join_tab->cache.records- (skip_last ? 1 : 0)) ; i-- > 0 ;) { read_cached_record(join_tab); - if (!select || !select->skip_record()) + skip_record= FALSE; + if (select && select->skip_record(join->thd, &skip_record)) { - /* - Check for error: skip_record() can execute code by calling - Item_subselect::val_*. We need to check for errors (if any) - after such call. - */ - if (join->thd->is_error()) - rc= NESTED_LOOP_ERROR; - else - rc= (join_tab->next_select)(join,join_tab+1,0); + reset_cache_write(&join_tab->cache); + return NESTED_LOOP_ERROR; + } + if (!skip_record) + { + rc= (join_tab->next_select)(join,join_tab+1,0); if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS) { reset_cache_write(&join_tab->cache); === modified file 'sql/sql_update.cc' --- a/sql/sql_update.cc 2010-06-10 20:45:22 +0000 +++ b/sql/sql_update.cc 2010-07-16 09:02:15 +0000 @@ -473,7 +473,14 @@ int mysql_update(THD *thd, while (!(error=info.read_record(&info)) && !thd->killed) { thd->examined_row_count++; - if (!(select && select->skip_record())) + bool skip_record= FALSE; + if (select && select->skip_record(thd, &skip_record)) + { + error= 1; + table->file->unlock_row(); + break; + } + if (!skip_record) { if (table->file->was_semi_consistent_read()) continue; /* repeat the read of the same row if it still exists */ @@ -580,7 +587,8 @@ int mysql_update(THD *thd, while (!(error=info.read_record(&info)) && !thd->killed) { thd->examined_row_count++; - if (!(select && select->skip_record())) + bool skip_record; + if (!select || (!select->skip_record(thd, &skip_record) && !skip_record)) { if (table->file->was_semi_consistent_read()) continue; /* repeat the read of the same row if it still exists */ --===============3759686968079918116== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.1-bugteam-bug54734/ # testament_sha1: 2c4f672c5e949c236b4716014766495e1030e67d # timestamp: 2010-07-16 11:02:19 +0200 # base_revision_id: georgi.kodinov@stripped\ # k6ursow03ih7f1lb # # Begin bundle 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 IXCfAYzd59B2J4PB/i7kinChIEwqk5A= --===============3759686968079918116==--