Commit 7b672bc9 authored by sasha@mysql.sashanet.com's avatar sasha@mysql.sashanet.com
Browse files

make replication work correctly if the master logs SELECT RELEASE_LOCK()

instead of DO RELEASE_LOCK()
parent 862cbdfe
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
source include/master-slave.inc;
connection master;
create table t1(n int);
create table t2(n int);
insert into t1 values(get_lock("lock",2));
dirty_close master;
connection master1;
select get_lock("lock",2);
select release_lock("lock");
let $1=20000;
let $1=2000;
while ($1)
{
  select get_lock("lock",2);
  select release_lock("lock");
  do get_lock("lock",2);
  do release_lock("lock");
  dec $1;
}
save_master_pos;
+17 −4
Original line number Diff line number Diff line
@@ -1071,10 +1071,23 @@ mysql_execute_command(void)
  TABLE_LIST *tables=(TABLE_LIST*) lex->table_list.first;
  DBUG_ENTER("mysql_execute_command");

  if(table_rules_on && thd->slave_thread && tables && !tables_ok(thd,tables))
    DBUG_VOID_RETURN; // skip if we are in the slave thread, some table
  if (thd->slave_thread)
  {
    // skip if we are in the slave thread, some table
    // rules have been given and the table list says the query should not be
    // replicated
    if(table_rules_on && tables && !tables_ok(thd,tables))
      DBUG_VOID_RETURN;
    // this is a workaround to deal with the shortcoming
    // in 3.23.44-3.23.46 masters
    // in RELEASE_LOCK() logging. We re-write SELECT RELEASE_LOCK() as
    // DO RELEASE_LOCK()
    if (lex->sql_command == SQLCOM_SELECT)
    {
      lex->sql_command = SQLCOM_DO;
      lex->insert_list = &lex->item_list;
    }
  }
  
  thread_safe_increment(com_stat[lex->sql_command],&LOCK_thread_count);
  switch (lex->sql_command) {