From 8c5d40325799a55f662ecffd02925632a04f89ce Mon Sep 17 00:00:00 2001 From: unknown <monty@mashka.mysql.fi> Date: Wed, 12 Mar 2003 07:51:08 +0200 Subject: [PATCH] Fix for replication of INSERT | REPLACE | CREATE ... SELECT sql/sql_select.cc: Fix for repllication of INSERT | REPLACE | CREATE ... SELECT --- sql/sql_parse.cc | 3 +++ sql/sql_select.cc | 13 +++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 6dac0a82d26..8f3a3a9bce2 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1595,6 +1595,7 @@ mysql_execute_command(void) for (table = tables->next ; table ; table=table->next) table->lock_type= lex->lock_option; } + select_lex->options|= SELECT_NO_UNLOCK; thd->offset_limit=select_lex->offset_limit; thd->select_limit=select_lex->select_limit+select_lex->offset_limit; if (thd->select_limit < select_lex->select_limit) @@ -1922,6 +1923,8 @@ mysql_execute_command(void) if ((res=check_table_access(thd, SELECT_ACL, save_next))) goto error; } + /* Don't unlock tables until command is written to binary log */ + select_lex->options|= SELECT_NO_UNLOCK; select_result *result; thd->offset_limit=select_lex->offset_limit; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index ec6b7961267..ffe20095963 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4469,16 +4469,13 @@ do_select(JOIN *join,List<Item> *fields,TABLE *table,Procedure *procedure) error=0; if (!table) // If sending data to client { - //note that the call below may trigger binlog writing for some commands... - if (join->result->send_eof()) - error= 1; // Don't send error /* - ...which must be done before unlocking the read tables (otherwise - another thread may, quickly between unlock and binlog-write, - update the read table and write to the binlog, which will - result in badly ordered binlog events (and replication breaks). + The following will unlock all cursors if the command wasn't an + update command */ - join_free(join); // Unlock all cursors + join_free(join); + if (join->result->send_eof()) + error= 1; // Don't send error } DBUG_PRINT("info",("%ld records output",join->send_records)); } -- 2.30.9