Commit 70b02d3a authored by Mattias Jonsson's avatar Mattias Jonsson

Bug#52517: Regression in ROW level replication performance with partitions

In bug-28430 HA_PRIMARY_KEY_REQUIRED_FOR_POSITION
was disabled in the partitioning engine in the first patch,
That bug was later fixed a second time, but that flag
was not removed.

No need to disable this flag, as it leads to bad
choise in row replication.

sql/ha_partition.h:
  Not disabling HA_PRIMARY_KEY_REQUIRED_FOR_POSITION flag.
  Updated comment (has nothing to do with hidden key.
sql/handler.h:
  Updated comments to about HA_PRIMARY_KEY_REQUIRED_FOR_POSITION.
parent d72a4710
...@@ -53,8 +53,7 @@ typedef struct st_ha_data_partition ...@@ -53,8 +53,7 @@ typedef struct st_ha_data_partition
HA_CAN_FULLTEXT | \ HA_CAN_FULLTEXT | \
HA_DUPLICATE_POS | \ HA_DUPLICATE_POS | \
HA_CAN_SQL_HANDLER | \ HA_CAN_SQL_HANDLER | \
HA_CAN_INSERT_DELAYED | \ HA_CAN_INSERT_DELAYED)
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION)
class ha_partition :public handler class ha_partition :public handler
{ {
private: private:
...@@ -766,9 +765,6 @@ public: ...@@ -766,9 +765,6 @@ public:
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION: HA_PRIMARY_KEY_REQUIRED_FOR_POSITION:
Does the storage engine need a PK for position? Does the storage engine need a PK for position?
Used with hidden primary key in InnoDB.
Hidden primary keys cannot be supported by partitioning, since the
partitioning expressions columns must be a part of the primary key.
(InnoDB) (InnoDB)
HA_FILE_BASED is always set for partition handler since we use a HA_FILE_BASED is always set for partition handler since we use a
......
...@@ -93,7 +93,10 @@ ...@@ -93,7 +93,10 @@
#define HA_PRIMARY_KEY_IN_READ_INDEX (1 << 15) #define HA_PRIMARY_KEY_IN_READ_INDEX (1 << 15)
/* /*
If HA_PRIMARY_KEY_REQUIRED_FOR_POSITION is set, it means that to position() If HA_PRIMARY_KEY_REQUIRED_FOR_POSITION is set, it means that to position()
uses a primary key. Without primary key, we can't call position(). uses a primary key given by the record argument.
Without primary key, we can't call position().
If not set, the position is returned as the current rows position
regardless of what argument is given.
*/ */
#define HA_PRIMARY_KEY_REQUIRED_FOR_POSITION (1 << 16) #define HA_PRIMARY_KEY_REQUIRED_FOR_POSITION (1 << 16)
#define HA_CAN_RTREEKEYS (1 << 17) #define HA_CAN_RTREEKEYS (1 << 17)
...@@ -1446,10 +1449,9 @@ public: ...@@ -1446,10 +1449,9 @@ public:
virtual int rnd_next(uchar *buf)=0; virtual int rnd_next(uchar *buf)=0;
virtual int rnd_pos(uchar * buf, uchar *pos)=0; virtual int rnd_pos(uchar * buf, uchar *pos)=0;
/** /**
One has to use this method when to find This function only works for handlers having
random position by record as the plain HA_PRIMARY_KEY_REQUIRED_FOR_POSITION set.
position() call doesn't work for some It will return the row with the PK given in the record argument.
handlers for random position.
*/ */
virtual int rnd_pos_by_record(uchar *record) virtual int rnd_pos_by_record(uchar *record)
{ {
...@@ -1467,6 +1469,12 @@ public: ...@@ -1467,6 +1469,12 @@ public:
{ return HA_ERR_WRONG_COMMAND; } { return HA_ERR_WRONG_COMMAND; }
virtual ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key) virtual ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key)
{ return (ha_rows) 10; } { return (ha_rows) 10; }
/*
If HA_PRIMARY_KEY_REQUIRED_FOR_POSITION is set, then it sets ref
(reference to the row, aka position, with the primary key given in
the record).
Otherwise it set ref to the current row.
*/
virtual void position(const uchar *record)=0; virtual void position(const uchar *record)=0;
virtual int info(uint)=0; // see my_base.h for full description virtual int info(uint)=0; // see my_base.h for full description
virtual void get_dynamic_partition_info(PARTITION_INFO *stat_info, virtual void get_dynamic_partition_info(PARTITION_INFO *stat_info,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment