From fcb0e53b758c13893fe110b57e4d026cf92acab2 Mon Sep 17 00:00:00 2001
From: "dli@dev3-164.dev.cn.tlan" <>
Date: Fri, 22 Dec 2006 09:59:27 +0800
Subject: [PATCH] ndb - fixed for BUG#19896 Last_Errno: 4294967295, Error in
 Write_rows event: (error number 4 billion ?)

fixed to use int instead of uint32 type to return last_slave_errno.
---
 sql/log_event.cc | 23 ++++++++++++++++++++---
 sql/protocol.h   |  2 ++
 sql/slave.cc     |  2 +-
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/sql/log_event.cc b/sql/log_event.cc
index faff2cae48..8813b24378 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -5485,9 +5485,26 @@ int Rows_log_event::exec_event(st_relay_log_info *rli)
     {
       if (!need_reopen)
       {
-        slave_print_msg(ERROR_LEVEL, rli, error,
-                        "Error in %s event: when locking tables",
-                        get_type_str());
+        if (thd->query_error || thd->is_fatal_error)
+        {
+          /*
+            Error reporting borrowed from Query_log_event with many excessive
+            simplifications (we don't honour --slave-skip-errors)
+          */
+          uint actual_error= thd->net.last_errno;
+          slave_print_msg(ERROR_LEVEL, rli, actual_error,
+                          "Error '%s' in %s event: when locking tables",
+                          (actual_error ? thd->net.last_error :
+                           "unexpected success or fatal error"),
+                          get_type_str());
+          thd->is_fatal_error= 1;
+        }
+        else
+        {
+          slave_print_msg(ERROR_LEVEL, rli, error,
+                         "Error in %s event: when locking tables",
+                         get_type_str());
+        }
         rli->clear_tables_to_lock();
         DBUG_RETURN(error);
       }
diff --git a/sql/protocol.h b/sql/protocol.h
index 85c22724b7..f9305c2c89 100644
--- a/sql/protocol.h
+++ b/sql/protocol.h
@@ -59,6 +59,8 @@ public:
   String *storage_packet() { return packet; }
   inline void free() { packet->free(); }
   virtual bool write();
+  inline  bool store(int from)
+  { return store_long((longlong) from); }
   inline  bool store(uint32 from)
   { return store_long((longlong) from); }
   inline  bool store(longlong from)
diff --git a/sql/slave.cc b/sql/slave.cc
index 5d871a6434..5b33874739 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -2237,7 +2237,7 @@ bool show_master_info(THD* thd, MASTER_INFO* mi)
     rpl_filter->get_wild_ignore_table(&tmp);
     protocol->store(&tmp);
 
-    protocol->store((uint32) mi->rli.last_slave_errno);
+    protocol->store(mi->rli.last_slave_errno);
     protocol->store(mi->rli.last_slave_error, &my_charset_bin);
     protocol->store((uint32) mi->rli.slave_skip_counter);
     protocol->store((ulonglong) mi->rli.group_master_log_pos);
-- 
2.30.9