From 98ff15531f2c6d4d84c7ed5bac563182625c3eb4 Mon Sep 17 00:00:00 2001 From: unknown 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. sql/sql_parse.cc: BUG#10442 Fix crash on replication slave by making sure that table list is filled out before it 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.