Commit 98ff1553 authored by unknown's avatar unknown
Browse files

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.
parent 6de6d3ad
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
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
+33 −0
Original line number Diff line number Diff line
# 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;
+8 −8
Original line number Diff line number Diff line
@@ -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.