Commit a0752a9e authored by Mattias Jonsson's avatar Mattias Jonsson

merge

parents 07e1cdc1 6433a553
...@@ -27,7 +27,6 @@ AC_DEFUN([MY_MAINTAINER_MODE_WARNINGS], [ ...@@ -27,7 +27,6 @@ AC_DEFUN([MY_MAINTAINER_MODE_WARNINGS], [
AC_MSG_CHECKING([whether to use C warning options ${C_WARNINGS}]) AC_MSG_CHECKING([whether to use C warning options ${C_WARNINGS}])
AC_LANG_PUSH(C) AC_LANG_PUSH(C)
CFLAGS="$CFLAGS ${C_WARNINGS}" CFLAGS="$CFLAGS ${C_WARNINGS}"
AC_LANG_WERROR
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [myac_c_warning_flags=yes], AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [myac_c_warning_flags=yes],
[myac_c_warning_flags=no]) [myac_c_warning_flags=no])
AC_LANG_POP() AC_LANG_POP()
...@@ -41,7 +40,6 @@ AC_DEFUN([MY_MAINTAINER_MODE_WARNINGS], [ ...@@ -41,7 +40,6 @@ AC_DEFUN([MY_MAINTAINER_MODE_WARNINGS], [
AC_MSG_CHECKING([whether to use C++ warning options ${CXX_WARNINGS}]) AC_MSG_CHECKING([whether to use C++ warning options ${CXX_WARNINGS}])
AC_LANG_PUSH(C++) AC_LANG_PUSH(C++)
CXXFLAGS="$CXXFLAGS ${CXX_WARNINGS}" CXXFLAGS="$CXXFLAGS ${CXX_WARNINGS}"
AC_LANG_WERROR
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [myac_cxx_warning_flags=yes], AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [myac_cxx_warning_flags=yes],
[myac_cxx_warning_flags=no]) [myac_cxx_warning_flags=no])
AC_LANG_POP() AC_LANG_POP()
......
...@@ -4370,6 +4370,58 @@ int ha_partition::index_read_last_map(uchar *buf, const uchar *key, ...@@ -4370,6 +4370,58 @@ int ha_partition::index_read_last_map(uchar *buf, const uchar *key,
} }
/*
Optimization of the default implementation to take advantage of dynamic
partition pruning.
*/
int ha_partition::index_read_idx_map(uchar *buf, uint index,
const uchar *key,
key_part_map keypart_map,
enum ha_rkey_function find_flag)
{
int error= HA_ERR_KEY_NOT_FOUND;
DBUG_ENTER("ha_partition::index_read_idx_map");
if (find_flag == HA_READ_KEY_EXACT)
{
uint part;
m_start_key.key= key;
m_start_key.keypart_map= keypart_map;
m_start_key.flag= find_flag;
m_start_key.length= calculate_key_len(table, index, m_start_key.key,
m_start_key.keypart_map);
get_partition_set(table, buf, index, &m_start_key, &m_part_spec);
/* How can it be more than one partition with the current use? */
DBUG_ASSERT(m_part_spec.start_part == m_part_spec.end_part);
for (part= m_part_spec.start_part; part <= m_part_spec.end_part; part++)
{
if (bitmap_is_set(&(m_part_info->used_partitions), part))
{
error= m_file[part]->index_read_idx_map(buf, index, key,
keypart_map, find_flag);
if (error != HA_ERR_KEY_NOT_FOUND &&
error != HA_ERR_END_OF_FILE)
break;
}
}
}
else
{
/*
If not only used with READ_EXACT, we should investigate if possible
to optimize for other find_flag's as well.
*/
DBUG_ASSERT(0);
/* fall back on the default implementation */
error= handler::index_read_idx_map(buf, index, key, keypart_map, find_flag);
}
DBUG_RETURN(error);
}
/* /*
Read next record in a forward index scan Read next record in a forward index scan
......
...@@ -36,8 +36,7 @@ enum partition_keywords ...@@ -36,8 +36,7 @@ enum partition_keywords
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:
...@@ -431,6 +430,15 @@ class ha_partition :public handler ...@@ -431,6 +430,15 @@ class ha_partition :public handler
virtual int index_init(uint idx, bool sorted); virtual int index_init(uint idx, bool sorted);
virtual int index_end(); virtual int index_end();
/**
@breif
Positions an index cursor to the index specified in the hanlde. Fetches the
row if available. If the key value is null, begin at first key of the
index.
*/
virtual int index_read_idx_map(uchar *buf, uint index, const uchar *key,
key_part_map keypart_map,
enum ha_rkey_function find_flag);
/* /*
These methods are used to jump to next or previous entry in the index These methods are used to jump to next or previous entry in the index
scan. There are also methods to jump to first and last entry. scan. There are also methods to jump to first and last entry.
...@@ -749,9 +757,6 @@ class ha_partition :public handler ...@@ -749,9 +757,6 @@ class ha_partition :public handler
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
......
...@@ -100,7 +100,10 @@ ...@@ -100,7 +100,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)
...@@ -1537,10 +1540,9 @@ class handler :public Sql_alloc ...@@ -1537,10 +1540,9 @@ class handler :public Sql_alloc
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)
{ {
...@@ -1558,6 +1560,12 @@ class handler :public Sql_alloc ...@@ -1558,6 +1560,12 @@ class handler :public Sql_alloc
{ 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_STATS *stat_info, virtual void get_dynamic_partition_info(PARTITION_STATS *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