summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/t/rpl_get_lock.test7
-rw-r--r--sql/sql_parse.cc21
2 files changed, 20 insertions, 8 deletions
diff --git a/mysql-test/t/rpl_get_lock.test b/mysql-test/t/rpl_get_lock.test
index 8bbeeade468..3c33103e4c7 100644
--- a/mysql-test/t/rpl_get_lock.test
+++ b/mysql-test/t/rpl_get_lock.test
@@ -1,17 +1,16 @@
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;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index dd627017ead..48b48dc77a7 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -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
- // rules have been given and the table list says the query should not be
- // replicated
+ 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) {