From f0d1ac25c349f09f2512d75f4e12f39d3a7729c3 Mon Sep 17 00:00:00 2001
From: unknown <holyfoot/hf@mysql.com/hfmain.(none)>
Date: Thu, 23 Aug 2007 23:34:48 +0500
Subject: [PATCH] Bug #28430 Failure in replication of innodb partitioned
 tables on row/mixed format.

In the ha_partition::position() we didn't calculate the number
of the partition of the record. We used m_last_part value instead,
relying on that it is set in other place like previous call of a method
like ::write_row(). In replication we don't call any of these befor
position(). Delete_rows_log_event::do_exec_row calls find_and_fetch_row.
In case of InnoDB-based PARTITION table, we have HA_PRIMARY_KEY_REQUIRED_FOR_POSITION
enabled, so use position() / rnd_pos() calls to fetch the record.

Fixed by adding partition_id calculation to the ha_partition::position()


sql/ha_partition.h:
   Bug #28430 Failure in replication of innodb partitioned tables on row/mixed format.
  column_bitmaps_signal interface added
sql/ha_partition.cc:
  Bug #28430 Failure in replication of innodb partitioned tables on row/mixed format.
  Calculate the number of the partition in ha_partition::position().
  ha_partition::column_bitmaps_signal() implemented
mysql-test/r/partition_pruning.result:
  Bug #28430 Failure in replication of innodb partitioned tables on row/mixed format.
  test result fixed
---
 mysql-test/r/partition_pruning.result |  4 ++--
 sql/ha_partition.cc                   | 14 +++++++++++++-
 sql/ha_partition.h                    |  1 +
 3 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/mysql-test/r/partition_pruning.result b/mysql-test/r/partition_pruning.result
index 9595676016c..776e6f3a15a 100644
--- a/mysql-test/r/partition_pruning.result
+++ b/mysql-test/r/partition_pruning.result
@@ -631,7 +631,7 @@ flush status;
 delete from t2 where b > 5;
 show status like 'Handler_read_rnd_next';
 Variable_name	Value
-Handler_read_rnd_next	1215
+Handler_read_rnd_next	1115
 show status like 'Handler_read_key';
 Variable_name	Value
 Handler_read_key	0
@@ -645,7 +645,7 @@ flush status;
 delete from t2 where b < 5 or b > 3;
 show status like 'Handler_read_rnd_next';
 Variable_name	Value
-Handler_read_rnd_next	1215
+Handler_read_rnd_next	1115
 show status like 'Handler_read_key';
 Variable_name	Value
 Handler_read_key	0
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc
index 2c28d5087d4..91eaf66e4e3 100644
--- a/sql/ha_partition.cc
+++ b/sql/ha_partition.cc
@@ -3235,9 +3235,14 @@ end_dont_reset_start_part:
 
 void ha_partition::position(const uchar *record)
 {
-  handler *file= m_file[m_last_part];
+  handler *file;
   DBUG_ENTER("ha_partition::position");
 
+  if (unlikely(get_part_for_delete(record, m_rec0, m_part_info, &m_last_part)))
+    m_last_part= 0;
+
+  file= m_file[m_last_part];
+
   file->position(record);
   int2store(ref, m_last_part);
   memcpy((ref + PARTITION_BYTES_IN_POS), file->ref,
@@ -5587,6 +5592,13 @@ int ha_partition::indexes_are_disabled(void)
 }
 
 
+void ha_partition::column_bitmaps_signal()
+{
+    handler::column_bitmaps_signal();
+    bitmap_union(table->read_set, &m_part_info->full_part_field_set);
+}
+
+
 /****************************************************************************
                 MODULE Partition Share
 ****************************************************************************/
diff --git a/sql/ha_partition.h b/sql/ha_partition.h
index 895f001fa6a..c3145b7c14c 100644
--- a/sql/ha_partition.h
+++ b/sql/ha_partition.h
@@ -449,6 +449,7 @@ private:
   int handle_ordered_next(uchar * buf, bool next_same);
   int handle_ordered_prev(uchar * buf);
   void return_top_record(uchar * buf);
+  void column_bitmaps_signal();
 public:
   /*
     -------------------------------------------------------------------------