revision-id: 065948357369fa88ce1698b0720811965707e99e (mariadb-10.1.38-154-g06594835736) parent(s): a8793a2c02f805a4a1c4dbd1416b594169b77541 author: Oleksandr Byelkin committer: Oleksandr Byelkin timestamp: 2019-04-30 11:35:52 +0200 message: MDEV-14572: Assertion `! is_set()' failed in Diagnostics_area::set_eof_status upon EXPLAIN UPDATE in PS Restore EXPAIN flag in SELECT_LEX before execution multi-update by flag in LEX (the same but in other way made before INSERT/DELETE/SELECT) Without it, mysql_update() didn't know that there will be EXPLAIN result set and was sending OK at the end of the update, which conflicted with the EOF sent later by EXPLAIN. --- mysql-test/r/ps.result | 17 +++++++++++++++++ mysql-test/t/ps.test | 16 ++++++++++++++++ sql/sql_parse.cc | 10 ++++++++++ 3 files changed, 43 insertions(+) diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index b509a2122b0..0d305b37bd3 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -4397,5 +4397,22 @@ END; 1 1 # +# MDEV-14572: Assertion `! is_set()' failed in +# Diagnostics_area::set_eof_status upon EXPLAIN UPDATE in PS +# +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (b INT); +PREPARE stmt FROM 'EXPLAIN UPDATE t1, t2 SET a = 1'; +EXECUTE stmt; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found +1 SIMPLE t2 system NULL NULL NULL NULL 0 const row not found +EXECUTE stmt; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 system NULL NULL NULL NULL 0 const row not found +1 SIMPLE t2 system NULL NULL NULL NULL 0 const row not found +deallocate prepare stmt; +DROP TABLE t1, t2; +# # End of 10.1 tests # diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index e1e8dfeeb17..60567033d8f 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -3927,6 +3927,22 @@ END; / DELIMITER ;/ +--echo # +--echo # MDEV-14572: Assertion `! is_set()' failed in +--echo # Diagnostics_area::set_eof_status upon EXPLAIN UPDATE in PS +--echo # + +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (b INT); + +#EXPLAIN UPDATE t1, t2 SET a = 1; +PREPARE stmt FROM 'EXPLAIN UPDATE t1, t2 SET a = 1'; +EXECUTE stmt; +EXECUTE stmt; +deallocate prepare stmt; + +# Cleanup +DROP TABLE t1, t2; --echo # --echo # End of 10.1 tests diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 3f9d9190d76..73b820cf87c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3800,6 +3800,16 @@ mysql_execute_command(THD *thd) else res= 0; + /* + We can not use mysql_explain_union() because of parameters of + mysql_select in mysql_multi_update so just set the option if needed + */ + if (thd->lex->describe) + { + select_lex->set_explain_type(FALSE); + select_lex->options|= SELECT_DESCRIBE; + } + res= mysql_multi_update_prepare(thd); #ifdef HAVE_REPLICATION