[Commits] 06594835736: MDEV-14572: Assertion `! is_set()' failed in Diagnostics_area::set_eof_status upon EXPLAIN UPDATE in PS

Oleksandr Byelkin sanja at mariadb.com
Tue Apr 30 12:35:52 EEST 2019


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


More information about the commits mailing list