From 0c71508759995780c2479d639b023a438fb0cffa Mon Sep 17 00:00:00 2001
From: "elliot@mysql.com" <>
Date: Fri, 17 Jun 2005 11:15:29 -0400
Subject: [PATCH] BUG#10442 Fix replication slave crash when a query with
 multiupdate and subselects is used.

---
 mysql-test/r/rpl_multi_update3.result | 42 +++++++++++++++++++++++++++
 mysql-test/t/rpl_multi_update3.test   | 33 +++++++++++++++++++++
 sql/sql_parse.cc                      | 16 +++++-----
 3 files changed, 83 insertions(+), 8 deletions(-)
 create mode 100644 mysql-test/r/rpl_multi_update3.result
 create mode 100644 mysql-test/t/rpl_multi_update3.test

diff --git a/mysql-test/r/rpl_multi_update3.result b/mysql-test/r/rpl_multi_update3.result
new file mode 100644
index 00000000000..4126ef0b5cb
--- /dev/null
+++ b/mysql-test/r/rpl_multi_update3.result
@@ -0,0 +1,42 @@
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE TABLE t1 (
+a int unsigned not null auto_increment primary key,
+b int unsigned
+) ENGINE=MyISAM;
+CREATE TABLE t2 (
+a int unsigned not null auto_increment primary key,
+b int unsigned
+) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (NULL, 0);
+INSERT INTO t1 SELECT NULL, 0 FROM t1;
+INSERT INTO t2 VALUES (NULL, 0), (NULL,1);
+SELECT * FROM t1 ORDER BY a;
+a	b
+1	0
+2	0
+SELECT * FROM t2 ORDER BY a;
+a	b
+1	0
+2	1
+UPDATE t2, (SELECT a FROM t1) AS t SET t2.b = t.a+5 ;
+SELECT * FROM t1 ORDER BY a;
+a	b
+1	0
+2	0
+SELECT * FROM t2 ORDER BY a;
+a	b
+1	6
+2	6
+SELECT * FROM t1 ORDER BY a;
+a	b
+1	0
+2	0
+SELECT * FROM t2 ORDER BY a;
+a	b
+1	6
+2	6
diff --git a/mysql-test/t/rpl_multi_update3.test b/mysql-test/t/rpl_multi_update3.test
new file mode 100644
index 00000000000..ec6a0c09ae5
--- /dev/null
+++ b/mysql-test/t/rpl_multi_update3.test
@@ -0,0 +1,33 @@
+# Let's verify that multi-update with a subselect does not cause the slave to crash
+# (BUG#10442)
+
+source include/master-slave.inc;
+
+CREATE TABLE t1 (
+ a int unsigned not null auto_increment primary key,
+ b int unsigned
+) ENGINE=MyISAM;
+
+CREATE TABLE t2 (
+ a int unsigned not null auto_increment primary key,
+ b int unsigned
+) ENGINE=MyISAM;
+
+INSERT INTO t1 VALUES (NULL, 0);
+INSERT INTO t1 SELECT NULL, 0 FROM t1;
+
+INSERT INTO t2 VALUES (NULL, 0), (NULL,1);
+
+SELECT * FROM t1 ORDER BY a;
+SELECT * FROM t2 ORDER BY a;
+
+UPDATE t2, (SELECT a FROM t1) AS t SET t2.b = t.a+5 ;
+SELECT * FROM t1 ORDER BY a;
+SELECT * FROM t2 ORDER BY a;
+
+save_master_pos;
+connection slave;
+sync_with_master;
+SELECT * FROM t1 ORDER BY a;
+SELECT * FROM t2 ORDER BY a;
+
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index c107203b548..81fcc30dd08 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1943,6 +1943,14 @@ mysql_execute_command(THD *thd)
   if (tables || &lex->select_lex != lex->all_selects_list)
     mysql_reset_errors(thd);
 
+  /* When subselects or time_zone info is used in a query
+   * we create a new TABLE_LIST containing all referenced tables
+   * and set local variable 'tables' to point to this list. */
+  if ((&lex->select_lex != lex->all_selects_list ||
+       lex->time_zone_tables_used) &&
+      lex->unit.create_total_list(thd, lex, &tables))
+    DBUG_VOID_RETURN;
+
 #ifdef HAVE_REPLICATION
   if (thd->slave_thread)
   {
@@ -1993,14 +2001,6 @@ mysql_execute_command(THD *thd)
   }
 #endif /* !HAVE_REPLICATION */
 
-  /* When subselects or time_zone info is used in a query
-   * we create a new TABLE_LIST containing all referenced tables
-   * and set local variable 'tables' to point to this list. */
-  if ((&lex->select_lex != lex->all_selects_list ||
-       lex->time_zone_tables_used) &&
-      lex->unit.create_total_list(thd, lex, &tables))
-    DBUG_VOID_RETURN;
-
   /*
     When option readonly is set deny operations which change tables.
     Except for the replication thread and the 'super' users.
-- 
2.30.9