List:Commits« Previous MessageNext Message »
From:Mattias Jonsson Date:July 9 2010 1:03pm
Subject:bzr commit into mysql-trunk branch (mattias.jonsson:3109)
View as plain text  
#At file:///Users/mattiasj/mysql-bzr/topush-trunk-merge/ based on revid:georgi.kodinov@stripped

 3109 Mattias Jonsson	2010-07-09 [merge]
      merge

    modified:
      config/ac-macros/maintainer.m4
      sql/ha_partition.cc
      sql/ha_partition.h
      sql/handler.h
=== modified file 'config/ac-macros/maintainer.m4'
--- a/config/ac-macros/maintainer.m4	2010-07-09 11:37:51 +0000
+++ b/config/ac-macros/maintainer.m4	2010-07-09 12:51:21 +0000
@@ -27,7 +27,6 @@ AC_DEFUN([MY_MAINTAINER_MODE_WARNINGS], 
     AC_MSG_CHECKING([whether to use C warning options ${C_WARNINGS}])
     AC_LANG_PUSH(C)
     CFLAGS="$CFLAGS ${C_WARNINGS}"
-    AC_LANG_WERROR
     AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [myac_c_warning_flags=yes],
                       [myac_c_warning_flags=no])
     AC_LANG_POP()
@@ -41,7 +40,6 @@ AC_DEFUN([MY_MAINTAINER_MODE_WARNINGS], 
     AC_MSG_CHECKING([whether to use C++ warning options ${CXX_WARNINGS}])
     AC_LANG_PUSH(C++)
     CXXFLAGS="$CXXFLAGS ${CXX_WARNINGS}"
-    AC_LANG_WERROR
     AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [myac_cxx_warning_flags=yes],
                       [myac_cxx_warning_flags=no])
     AC_LANG_POP()

=== modified file 'sql/ha_partition.cc'
--- a/sql/ha_partition.cc	2010-06-17 13:31:51 +0000
+++ b/sql/ha_partition.cc	2010-07-09 13:02:27 +0000
@@ -4371,6 +4371,58 @@ int ha_partition::index_read_last_map(uc
 
 
 /*
+  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
 
   SYNOPSIS

=== modified file 'sql/ha_partition.h'
--- a/sql/ha_partition.h	2010-05-24 12:51:59 +0000
+++ b/sql/ha_partition.h	2010-07-09 13:02:27 +0000
@@ -36,8 +36,7 @@ enum partition_keywords
                                         HA_CAN_FULLTEXT | \
                                         HA_DUPLICATE_POS | \
                                         HA_CAN_SQL_HANDLER | \
-                                        HA_CAN_INSERT_DELAYED | \
-                                        HA_PRIMARY_KEY_REQUIRED_FOR_POSITION)
+                                        HA_CAN_INSERT_DELAYED)
 class ha_partition :public handler
 {
 private:
@@ -431,6 +430,15 @@ public:
   virtual int index_init(uint idx, bool sorted);
   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
     scan. There are also methods to jump to first and last entry.
@@ -749,9 +757,6 @@ public:
 
     HA_PRIMARY_KEY_REQUIRED_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)
 
     HA_FILE_BASED is always set for partition handler since we use a

=== modified file 'sql/handler.h'
--- a/sql/handler.h	2010-06-11 01:30:49 +0000
+++ b/sql/handler.h	2010-07-09 13:02:27 +0000
@@ -100,7 +100,10 @@
 #define HA_PRIMARY_KEY_IN_READ_INDEX (1 << 15)
 /*
   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_CAN_RTREEKEYS       (1 << 17)
@@ -1537,10 +1540,9 @@ public:
   virtual int rnd_next(uchar *buf)=0;
   virtual int rnd_pos(uchar * buf, uchar *pos)=0;
   /**
-    One has to use this method when to find
-    random position by record as the plain
-    position() call doesn't work for some
-    handlers for random position.
+    This function only works for handlers having
+    HA_PRIMARY_KEY_REQUIRED_FOR_POSITION set.
+    It will return the row with the PK given in the record argument.
   */
   virtual int rnd_pos_by_record(uchar *record)
     {
@@ -1558,6 +1560,12 @@ public:
     { return HA_ERR_WRONG_COMMAND; }
   virtual ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key)
     { 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 int info(uint)=0; // see my_base.h for full description
   virtual void get_dynamic_partition_info(PARTITION_STATS *stat_info,


Attachment: [text/bzr-bundle] bzr/mattias.jonsson@oracle.com-20100709130227-sacfqdhjep840za2.bundle
Thread
bzr commit into mysql-trunk branch (mattias.jonsson:3109) Mattias Jonsson9 Jul