[Maria-developers] 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@pisem.net-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);
participants (1)
-
Michael Widenius