← Back to team overview

maria-developers team mailing list archive

bzr commit into Mariadb 5.2, with Maria 2.0:maria/5.2 branch (monty:2751)

 

#At lp:maria/5.2 based on revid:sergii@xxxxxxxxx-20100323092233-t2gwaclx94hd6exa

 2751 Michael Widenius	2010-03-25
      simple speed & space optimization:
      - Avoid full inline of mark_trx_read_write() for many functions
      - Avoid somewhat expensive tests for every write/update/delete row 
      modified:
        sql/handler.cc
        sql/handler.h
        sql/sql_base.cc

per-file messages:
  sql/handler.h
    Adde ha_start_of_new_statement() to reset internal variables as part of the code in "open_table" that resets TABLE object for the new statement
    Faster mark_trx_read_write_part()
  sql/sql_base.cc
    Don't manipulate table->file internal structs directly
=== modified file 'sql/handler.cc'
--- a/sql/handler.cc	2010-03-15 11:51:23 +0000
+++ b/sql/handler.cc	2010-03-25 13:33:39 +0000
@@ -3110,11 +3110,14 @@ int handler::ha_check(THD *thd, HA_CHECK
   if it is started.
 */
 
-inline
 void
-handler::mark_trx_read_write()
+handler::mark_trx_read_write_part2()
 {
   Ha_trx_info *ha_info= &ha_thd()->ha_data[ht->slot].ha_info[0];
+
+  /* Don't call this function again for this statement */
+  mark_trx_done= TRUE;
+
   /*
     When a storage engine method is called, the transaction must
     have been started, unless it's a DDL call, for which the

=== modified file 'sql/handler.h'
--- a/sql/handler.h	2010-02-01 06:14:12 +0000
+++ b/sql/handler.h	2010-03-25 13:33:39 +0000
@@ -1134,6 +1134,7 @@ public:
   enum {NONE=0, INDEX, RND} inited;
   bool locked;
   bool implicit_emptied;                /* Can be !=0 only if HEAP */
+  bool mark_trx_done;
   const COND *pushed_cond;
   /**
     next_insert_id is the next value which should be inserted into the
@@ -1177,7 +1178,7 @@ public:
     ref(0), key_used_on_scan(MAX_KEY), active_index(MAX_KEY),
     ref_length(sizeof(my_off_t)),
     ft_handler(0), inited(NONE),
-    locked(FALSE), implicit_emptied(0),
+    locked(FALSE), implicit_emptied(FALSE), mark_trx_done(FALSE), 
     pushed_cond(0), next_insert_id(0), insert_id_for_cur_row(0),
     auto_inc_intervals_count(0)
     {
@@ -1232,6 +1233,13 @@ public:
     DBUG_RETURN(rnd_end());
   }
   int ha_reset();
+  /* Tell handler (not storage engine) this is start of a new statement */
+  void ha_start_of_new_statement()
+  {
+    ft_handler= 0;
+    mark_trx_done= FALSE;
+  }
+
   /* this is necessary in many places, e.g. in HANDLER command */
   int ha_index_or_rnd_end()
   {
@@ -1943,8 +1951,13 @@ protected:
 
 private:
   /* Private helpers */
-  inline void mark_trx_read_write();
-private:
+  void mark_trx_read_write_part2();
+  inline void mark_trx_read_write()
+  {
+    if (!mark_trx_done)
+      mark_trx_read_write_part2();
+  }
+
   /*
     Low-level primitives for storage engines.  These should be
     overridden by the storage engine class. To call these methods, use

=== modified file 'sql/sql_base.cc'
--- a/sql/sql_base.cc	2010-03-15 11:51:23 +0000
+++ b/sql/sql_base.cc	2010-03-25 13:33:39 +0000
@@ -2996,7 +2996,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *
   table->status=STATUS_NO_RECORD;
   table->insert_values= 0;
   table->fulltext_searched= 0;
-  table->file->ft_handler= 0;
+  table->file->ha_start_of_new_statement();
   table->reginfo.impossible_range= 0;
   /* Catch wrong handling of the auto_increment_field_not_null. */
   DBUG_ASSERT(!table->auto_increment_field_not_null);