From 9cc8bd0d84f88968e82f4492f5a7dc3f71dfd03e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicen=C8=9Biu=20Ciorbaru?= Date: Mon, 18 May 2015 01:35:47 +0000 Subject: MDEV-8063: Unconditional ANALYZE DELETE does not delete rows When detecting a statement that can make use of ha_delete_all_rows(), we refrained from running the statement when being presented with the analyze or explain prefix. --- mysql-test/r/analyze_stmt.result | 19 +++++++++++++++++++ mysql-test/t/analyze_stmt.test | 15 +++++++++++++++ sql/sql_delete.cc | 6 ++---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/analyze_stmt.result b/mysql-test/r/analyze_stmt.result index 50063324faf..c3c98593210 100644 --- a/mysql-test/r/analyze_stmt.result +++ b/mysql-test/r/analyze_stmt.result @@ -315,3 +315,22 @@ id select_type table type possible_keys key key_len ref rows r_rows filtered r_f 1 SIMPLE t1 ALL NULL NULL NULL NULL 10 10.00 100.00 100.00 Using where 1 SIMPLE t2 ref a a 5 test.t1.a 2 0.20 100.00 100.00 Using index drop table t1,t2; +# +# MDEV-8063: Unconditional ANALYZE DELETE does not delete rows +# +create table t1 (i int); +insert into t1 values (1),(2); +analyze delete from t1; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL 2 NULL NULL NULL Deleting all rows +select * from t1; +i +insert into t1 values (1),(2); +explain delete from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL 2 Deleting all rows +select * from t1; +i +1 +2 +drop table t1; diff --git a/mysql-test/t/analyze_stmt.test b/mysql-test/t/analyze_stmt.test index 0355b4e4e0f..d02139fe0c8 100644 --- a/mysql-test/t/analyze_stmt.test +++ b/mysql-test/t/analyze_stmt.test @@ -258,3 +258,18 @@ insert into t2 values (0),(1); analyze select * from t1 straight_join t2 force index(a) where t2.a=t1.a; drop table t1,t2; + +--echo # +--echo # MDEV-8063: Unconditional ANALYZE DELETE does not delete rows +--echo # + +create table t1 (i int); +insert into t1 values (1),(2); +analyze delete from t1; +select * from t1; + +insert into t1 values (1),(2); +explain delete from t1; +select * from t1; + +drop table t1; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 213013b889c..d7c5d94c2cb 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -347,7 +347,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, DBUG_PRINT("debug", ("Trying to use delete_all_rows()")); query_plan.set_delete_all_rows(maybe_deleted); - if (thd->lex->describe || thd->lex->analyze_stmt) + if (thd->lex->describe) goto produce_explain_and_leave; if (!(error=table->file->ha_delete_all_rows())) @@ -359,6 +359,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, query_type= THD::STMT_QUERY_TYPE; error= -1; deleted= maybe_deleted; + query_plan.save_explain_delete_data(thd->mem_root, thd); goto cleanup; } if (error != HA_ERR_WRONG_COMMAND) @@ -699,10 +700,7 @@ cleanup: (thd->lex->ignore && !thd->is_error() && !thd->is_fatal_error)) { if (thd->lex->analyze_stmt) - { - error= 0; goto send_nothing_and_leave; - } if (with_select) result->send_eof(); -- cgit v1.2.1