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