This commit is contained in:
jani@rhols221.adsl.netsonic.fi 2004-09-13 18:12:44 +03:00
commit 0b3d778691
22 changed files with 504 additions and 271 deletions

View file

@ -788,6 +788,10 @@ extern void add_compiled_collation(CHARSET_INFO *cs);
extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to,
const char *from, ulong length); const char *from, ulong length);
extern void thd_increment_bytes_sent(ulong length);
extern void thd_increment_bytes_received(ulong length);
extern void thd_increment_net_big_packet_count(ulong length);
#ifdef __WIN__ #ifdef __WIN__
extern my_bool have_tcpip; /* Is set if tcpip is used */ extern my_bool have_tcpip; /* Is set if tcpip is used */
#endif #endif

View file

@ -163,11 +163,11 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
if (select && select->quick) if (select && select->quick)
{ {
statistic_increment(filesort_range_count, &LOCK_status); statistic_increment(thd->status_var.filesort_range_count, &LOCK_status);
} }
else else
{ {
statistic_increment(filesort_scan_count, &LOCK_status); statistic_increment(thd->status_var.filesort_scan_count, &LOCK_status);
} }
#ifdef CAN_TRUST_RANGE #ifdef CAN_TRUST_RANGE
if (select && select->quick && select->quick->records > 0L) if (select && select->quick && select->quick->records > 0L)
@ -280,7 +280,8 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
if (error) if (error)
my_error(ER_FILSORT_ABORT,MYF(ME_ERROR+ME_WAITTANG)); my_error(ER_FILSORT_ABORT,MYF(ME_ERROR+ME_WAITTANG));
else else
statistic_add(filesort_rows, (ulong) records, &LOCK_status); statistic_add(thd->status_var.filesort_rows,
(ulong) records, &LOCK_status);
*examined_rows= param.examined_rows; *examined_rows= param.examined_rows;
#ifdef SKIP_DBUG_IN_FILESORT #ifdef SKIP_DBUG_IN_FILESORT
DBUG_POP(); /* Ok to DBUG */ DBUG_POP(); /* Ok to DBUG */
@ -874,7 +875,8 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
THD::killed_state not_killable; THD::killed_state not_killable;
DBUG_ENTER("merge_buffers"); DBUG_ENTER("merge_buffers");
statistic_increment(filesort_merge_passes, &LOCK_status); statistic_increment(current_thd->status_var.filesort_merge_passes,
&LOCK_status);
if (param->not_killable) if (param->not_killable)
{ {
killed= &not_killable; killed= &not_killable;

View file

@ -855,7 +855,7 @@ int ha_berkeley::write_row(byte * record)
int error; int error;
DBUG_ENTER("write_row"); DBUG_ENTER("write_row");
statistic_increment(ha_write_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_write_count, &LOCK_status);
if (table->timestamp_default_now) if (table->timestamp_default_now)
update_timestamp(record+table->timestamp_default_now-1); update_timestamp(record+table->timestamp_default_now-1);
if (table->next_number_field && record == table->record[0]) if (table->next_number_field && record == table->record[0])
@ -1099,10 +1099,11 @@ int ha_berkeley::update_row(const byte * old_row, byte * new_row)
DB_TXN *sub_trans; DB_TXN *sub_trans;
ulong thd_options = table->tmp_table == NO_TMP_TABLE ? table->in_use->options : 0; ulong thd_options = table->tmp_table == NO_TMP_TABLE ? table->in_use->options : 0;
bool primary_key_changed; bool primary_key_changed;
DBUG_ENTER("update_row"); DBUG_ENTER("update_row");
LINT_INIT(error); LINT_INIT(error);
statistic_increment(ha_update_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_update_count,&LOCK_status);
if (table->timestamp_on_update_now) if (table->timestamp_on_update_now)
update_timestamp(new_row+table->timestamp_on_update_now-1); update_timestamp(new_row+table->timestamp_on_update_now-1);
@ -1292,7 +1293,7 @@ int ha_berkeley::delete_row(const byte * record)
key_map keys=table->keys_in_use; key_map keys=table->keys_in_use;
ulong thd_options = table->tmp_table == NO_TMP_TABLE ? table->in_use->options : 0; ulong thd_options = table->tmp_table == NO_TMP_TABLE ? table->in_use->options : 0;
DBUG_ENTER("delete_row"); DBUG_ENTER("delete_row");
statistic_increment(ha_delete_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_delete_count,&LOCK_status);
if ((error=pack_row(&row, record, 0))) if ((error=pack_row(&row, record, 0)))
DBUG_RETURN((error)); /* purecov: inspected */ DBUG_RETURN((error)); /* purecov: inspected */
@ -1439,7 +1440,7 @@ int ha_berkeley::read_row(int error, char *buf, uint keynr, DBT *row,
int ha_berkeley::index_read_idx(byte * buf, uint keynr, const byte * key, int ha_berkeley::index_read_idx(byte * buf, uint keynr, const byte * key,
uint key_len, enum ha_rkey_function find_flag) uint key_len, enum ha_rkey_function find_flag)
{ {
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_key_count,&LOCK_status);
DBUG_ENTER("index_read_idx"); DBUG_ENTER("index_read_idx");
current_row.flags=DB_DBT_REALLOC; current_row.flags=DB_DBT_REALLOC;
active_index=MAX_KEY; active_index=MAX_KEY;
@ -1458,9 +1459,10 @@ int ha_berkeley::index_read(byte * buf, const byte * key,
int error; int error;
KEY *key_info= &table->key_info[active_index]; KEY *key_info= &table->key_info[active_index];
int do_prev= 0; int do_prev= 0;
DBUG_ENTER("ha_berkeley::index_read"); DBUG_ENTER("ha_berkeley::index_read");
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_key_count,&LOCK_status);
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
if (find_flag == HA_READ_BEFORE_KEY) if (find_flag == HA_READ_BEFORE_KEY)
{ {
@ -1529,7 +1531,8 @@ int ha_berkeley::index_read_last(byte * buf, const byte * key, uint key_len)
KEY *key_info= &table->key_info[active_index]; KEY *key_info= &table->key_info[active_index];
DBUG_ENTER("ha_berkeley::index_read"); DBUG_ENTER("ha_berkeley::index_read");
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_key_count,
&LOCK_status);
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
/* read of partial key */ /* read of partial key */
@ -1553,7 +1556,8 @@ int ha_berkeley::index_next(byte * buf)
{ {
DBT row; DBT row;
DBUG_ENTER("index_next"); DBUG_ENTER("index_next");
statistic_increment(ha_read_next_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_next_count,
&LOCK_status);
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_NEXT), DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_NEXT),
(char*) buf, active_index, &row, &last_key, 1)); (char*) buf, active_index, &row, &last_key, 1));
@ -1564,7 +1568,8 @@ int ha_berkeley::index_next_same(byte * buf, const byte *key, uint keylen)
DBT row; DBT row;
int error; int error;
DBUG_ENTER("index_next_same"); DBUG_ENTER("index_next_same");
statistic_increment(ha_read_next_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_next_count,
&LOCK_status);
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
if (keylen == table->key_info[active_index].key_length) if (keylen == table->key_info[active_index].key_length)
error=read_row(cursor->c_get(cursor, &last_key, &row, DB_NEXT_DUP), error=read_row(cursor->c_get(cursor, &last_key, &row, DB_NEXT_DUP),
@ -1584,7 +1589,8 @@ int ha_berkeley::index_prev(byte * buf)
{ {
DBT row; DBT row;
DBUG_ENTER("index_prev"); DBUG_ENTER("index_prev");
statistic_increment(ha_read_prev_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_prev_count,
&LOCK_status);
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_PREV), DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_PREV),
(char*) buf, active_index, &row, &last_key, 1)); (char*) buf, active_index, &row, &last_key, 1));
@ -1595,7 +1601,8 @@ int ha_berkeley::index_first(byte * buf)
{ {
DBT row; DBT row;
DBUG_ENTER("index_first"); DBUG_ENTER("index_first");
statistic_increment(ha_read_first_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_first_count,
&LOCK_status);
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_FIRST), DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_FIRST),
(char*) buf, active_index, &row, &last_key, 1)); (char*) buf, active_index, &row, &last_key, 1));
@ -1605,7 +1612,8 @@ int ha_berkeley::index_last(byte * buf)
{ {
DBT row; DBT row;
DBUG_ENTER("index_last"); DBUG_ENTER("index_last");
statistic_increment(ha_read_last_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_last_count,
&LOCK_status);
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_LAST), DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_LAST),
(char*) buf, active_index, &row, &last_key, 0)); (char*) buf, active_index, &row, &last_key, 0));
@ -1627,7 +1635,8 @@ int ha_berkeley::rnd_next(byte *buf)
{ {
DBT row; DBT row;
DBUG_ENTER("rnd_next"); DBUG_ENTER("rnd_next");
statistic_increment(ha_read_rnd_next_count,&LOCK_status); statistic_increment(table->in_use->status_var.ha_read_rnd_next_count,
&LOCK_status);
bzero((char*) &row,sizeof(row)); bzero((char*) &row,sizeof(row));
DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_NEXT), DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_NEXT),
(char*) buf, primary_key, &row, &last_key, 1)); (char*) buf, primary_key, &row, &last_key, 1));
@ -1658,9 +1667,10 @@ DBT *ha_berkeley::get_pos(DBT *to, byte *pos)
int ha_berkeley::rnd_pos(byte * buf, byte *pos) int ha_berkeley::rnd_pos(byte * buf, byte *pos)
{ {
DBT db_pos; DBT db_pos;
statistic_increment(ha_read_rnd_count,&LOCK_status);
DBUG_ENTER("ha_berkeley::rnd_pos"); DBUG_ENTER("ha_berkeley::rnd_pos");
statistic_increment(table->in_use->status_var.ha_read_rnd_count,
&LOCK_status);
active_index= MAX_KEY; active_index= MAX_KEY;
DBUG_RETURN(read_row(file->get(file, transaction, DBUG_RETURN(read_row(file->get(file, transaction,
get_pos(&db_pos, pos), get_pos(&db_pos, pos),

View file

@ -86,7 +86,7 @@ void ha_heap::set_keys_for_scanning(void)
int ha_heap::write_row(byte * buf) int ha_heap::write_row(byte * buf)
{ {
statistic_increment(ha_write_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_write_count,&LOCK_status);
if (table->timestamp_default_now) if (table->timestamp_default_now)
update_timestamp(buf+table->timestamp_default_now-1); update_timestamp(buf+table->timestamp_default_now-1);
if (table->next_number_field && buf == table->record[0]) if (table->next_number_field && buf == table->record[0])
@ -96,7 +96,7 @@ int ha_heap::write_row(byte * buf)
int ha_heap::update_row(const byte * old_data, byte * new_data) int ha_heap::update_row(const byte * old_data, byte * new_data)
{ {
statistic_increment(ha_update_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_update_count,&LOCK_status);
if (table->timestamp_on_update_now) if (table->timestamp_on_update_now)
update_timestamp(new_data+table->timestamp_on_update_now-1); update_timestamp(new_data+table->timestamp_on_update_now-1);
return heap_update(file,old_data,new_data); return heap_update(file,old_data,new_data);
@ -104,7 +104,7 @@ int ha_heap::update_row(const byte * old_data, byte * new_data)
int ha_heap::delete_row(const byte * buf) int ha_heap::delete_row(const byte * buf)
{ {
statistic_increment(ha_delete_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_delete_count,&LOCK_status);
return heap_delete(file,buf); return heap_delete(file,buf);
} }
@ -112,7 +112,7 @@ int ha_heap::index_read(byte * buf, const byte * key, uint key_len,
enum ha_rkey_function find_flag) enum ha_rkey_function find_flag)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_key_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count, &LOCK_status);
int error = heap_rkey(file,buf,active_index, key, key_len, find_flag); int error = heap_rkey(file,buf,active_index, key, key_len, find_flag);
table->status = error ? STATUS_NOT_FOUND : 0; table->status = error ? STATUS_NOT_FOUND : 0;
return error; return error;
@ -121,7 +121,7 @@ int ha_heap::index_read(byte * buf, const byte * key, uint key_len,
int ha_heap::index_read_last(byte *buf, const byte *key, uint key_len) int ha_heap::index_read_last(byte *buf, const byte *key, uint key_len)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_key_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count, &LOCK_status);
int error= heap_rkey(file, buf, active_index, key, key_len, int error= heap_rkey(file, buf, active_index, key, key_len,
HA_READ_PREFIX_LAST); HA_READ_PREFIX_LAST);
table->status= error ? STATUS_NOT_FOUND : 0; table->status= error ? STATUS_NOT_FOUND : 0;
@ -131,7 +131,7 @@ int ha_heap::index_read_last(byte *buf, const byte *key, uint key_len)
int ha_heap::index_read_idx(byte * buf, uint index, const byte * key, int ha_heap::index_read_idx(byte * buf, uint index, const byte * key,
uint key_len, enum ha_rkey_function find_flag) uint key_len, enum ha_rkey_function find_flag)
{ {
statistic_increment(ha_read_key_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count, &LOCK_status);
int error = heap_rkey(file, buf, index, key, key_len, find_flag); int error = heap_rkey(file, buf, index, key, key_len, find_flag);
table->status = error ? STATUS_NOT_FOUND : 0; table->status = error ? STATUS_NOT_FOUND : 0;
return error; return error;
@ -140,7 +140,7 @@ int ha_heap::index_read_idx(byte * buf, uint index, const byte * key,
int ha_heap::index_next(byte * buf) int ha_heap::index_next(byte * buf)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_next_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_next_count,&LOCK_status);
int error=heap_rnext(file,buf); int error=heap_rnext(file,buf);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -149,7 +149,7 @@ int ha_heap::index_next(byte * buf)
int ha_heap::index_prev(byte * buf) int ha_heap::index_prev(byte * buf)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_prev_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_prev_count,&LOCK_status);
int error=heap_rprev(file,buf); int error=heap_rprev(file,buf);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -158,7 +158,8 @@ int ha_heap::index_prev(byte * buf)
int ha_heap::index_first(byte * buf) int ha_heap::index_first(byte * buf)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_first_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_first_count,
&LOCK_status);
int error=heap_rfirst(file, buf, active_index); int error=heap_rfirst(file, buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -167,7 +168,7 @@ int ha_heap::index_first(byte * buf)
int ha_heap::index_last(byte * buf) int ha_heap::index_last(byte * buf)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_last_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_last_count,&LOCK_status);
int error=heap_rlast(file, buf, active_index); int error=heap_rlast(file, buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -180,7 +181,8 @@ int ha_heap::rnd_init(bool scan)
int ha_heap::rnd_next(byte *buf) int ha_heap::rnd_next(byte *buf)
{ {
statistic_increment(ha_read_rnd_next_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_rnd_next_count,
&LOCK_status);
int error=heap_scan(file, buf); int error=heap_scan(file, buf);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -190,7 +192,7 @@ int ha_heap::rnd_pos(byte * buf, byte *pos)
{ {
int error; int error;
HEAP_PTR position; HEAP_PTR position;
statistic_increment(ha_read_rnd_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_rnd_count, &LOCK_status);
memcpy_fixed((char*) &position,pos,sizeof(HEAP_PTR)); memcpy_fixed((char*) &position,pos,sizeof(HEAP_PTR));
error=heap_rrnd(file, buf, position); error=heap_rrnd(file, buf, position);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;

View file

@ -2220,7 +2220,8 @@ ha_innobase::write_row(
ut_error; ut_error;
} }
statistic_increment(ha_write_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_write_count,
&LOCK_status);
if (table->timestamp_default_now) if (table->timestamp_default_now)
update_timestamp(record + table->timestamp_default_now - 1); update_timestamp(record + table->timestamp_default_now - 1);
@ -2839,7 +2840,8 @@ ha_innobase::index_read(
ut_ad(prebuilt->trx == ut_ad(prebuilt->trx ==
(trx_t*) current_thd->transaction.all.innobase_tid); (trx_t*) current_thd->transaction.all.innobase_tid);
statistic_increment(ha_read_key_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count,
&LOCK_status);
if (last_query_id != user_thd->query_id) { if (last_query_id != user_thd->query_id) {
prebuilt->sql_stat_start = TRUE; prebuilt->sql_stat_start = TRUE;
@ -2945,7 +2947,8 @@ ha_innobase::change_active_index(
{ {
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
KEY* key=0; KEY* key=0;
statistic_increment(ha_read_key_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count,
&LOCK_status);
DBUG_ENTER("change_active_index"); DBUG_ENTER("change_active_index");
ut_ad(user_thd == current_thd); ut_ad(user_thd == current_thd);
@ -3077,7 +3080,8 @@ ha_innobase::index_next(
mysql_byte* buf) /* in/out: buffer for next row in MySQL mysql_byte* buf) /* in/out: buffer for next row in MySQL
format */ format */
{ {
statistic_increment(ha_read_next_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_next_count,
&LOCK_status);
return(general_fetch(buf, ROW_SEL_NEXT, 0)); return(general_fetch(buf, ROW_SEL_NEXT, 0));
} }
@ -3094,7 +3098,8 @@ ha_innobase::index_next_same(
const mysql_byte* key, /* in: key value */ const mysql_byte* key, /* in: key value */
uint keylen) /* in: key value length */ uint keylen) /* in: key value length */
{ {
statistic_increment(ha_read_next_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_next_count,
&LOCK_status);
return(general_fetch(buf, ROW_SEL_NEXT, last_match_mode)); return(general_fetch(buf, ROW_SEL_NEXT, last_match_mode));
} }
@ -3128,7 +3133,8 @@ ha_innobase::index_first(
int error; int error;
DBUG_ENTER("index_first"); DBUG_ENTER("index_first");
statistic_increment(ha_read_first_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_first_count,
&LOCK_status);
error = index_read(buf, NULL, 0, HA_READ_AFTER_KEY); error = index_read(buf, NULL, 0, HA_READ_AFTER_KEY);
@ -3154,7 +3160,8 @@ ha_innobase::index_last(
int error; int error;
DBUG_ENTER("index_first"); DBUG_ENTER("index_first");
statistic_increment(ha_read_last_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_last_count,
&LOCK_status);
error = index_read(buf, NULL, 0, HA_READ_BEFORE_KEY); error = index_read(buf, NULL, 0, HA_READ_BEFORE_KEY);
@ -3219,7 +3226,8 @@ ha_innobase::rnd_next(
int error; int error;
DBUG_ENTER("rnd_next"); DBUG_ENTER("rnd_next");
statistic_increment(ha_read_rnd_next_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_rnd_next_count,
&LOCK_status);
if (start_of_scan) { if (start_of_scan) {
error = index_first(buf); error = index_first(buf);
@ -3255,7 +3263,8 @@ ha_innobase::rnd_pos(
DBUG_ENTER("rnd_pos"); DBUG_ENTER("rnd_pos");
DBUG_DUMP("key", (char*) pos, ref_length); DBUG_DUMP("key", (char*) pos, ref_length);
statistic_increment(ha_read_rnd_count, &LOCK_status); statistic_increment(current_thd->status_var.ha_read_rnd_count,
&LOCK_status);
ut_ad(prebuilt->trx == ut_ad(prebuilt->trx ==
(trx_t*) current_thd->transaction.all.innobase_tid); (trx_t*) current_thd->transaction.all.innobase_tid);

View file

@ -249,7 +249,7 @@ int ha_myisam::close(void)
int ha_myisam::write_row(byte * buf) int ha_myisam::write_row(byte * buf)
{ {
statistic_increment(ha_write_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_write_count,&LOCK_status);
/* If we have a timestamp column, update it to the current time */ /* If we have a timestamp column, update it to the current time */
if (table->timestamp_default_now) if (table->timestamp_default_now)
@ -1070,7 +1070,7 @@ bool ha_myisam::is_crashed() const
int ha_myisam::update_row(const byte * old_data, byte * new_data) int ha_myisam::update_row(const byte * old_data, byte * new_data)
{ {
statistic_increment(ha_update_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_update_count,&LOCK_status);
if (table->timestamp_on_update_now) if (table->timestamp_on_update_now)
update_timestamp(new_data+table->timestamp_on_update_now-1); update_timestamp(new_data+table->timestamp_on_update_now-1);
return mi_update(file,old_data,new_data); return mi_update(file,old_data,new_data);
@ -1078,7 +1078,7 @@ int ha_myisam::update_row(const byte * old_data, byte * new_data)
int ha_myisam::delete_row(const byte * buf) int ha_myisam::delete_row(const byte * buf)
{ {
statistic_increment(ha_delete_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_delete_count,&LOCK_status);
return mi_delete(file,buf); return mi_delete(file,buf);
} }
@ -1086,7 +1086,7 @@ int ha_myisam::index_read(byte * buf, const byte * key,
uint key_len, enum ha_rkey_function find_flag) uint key_len, enum ha_rkey_function find_flag)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count,&LOCK_status);
int error=mi_rkey(file,buf,active_index, key, key_len, find_flag); int error=mi_rkey(file,buf,active_index, key, key_len, find_flag);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1095,7 +1095,7 @@ int ha_myisam::index_read(byte * buf, const byte * key,
int ha_myisam::index_read_idx(byte * buf, uint index, const byte * key, int ha_myisam::index_read_idx(byte * buf, uint index, const byte * key,
uint key_len, enum ha_rkey_function find_flag) uint key_len, enum ha_rkey_function find_flag)
{ {
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count,&LOCK_status);
int error=mi_rkey(file,buf,index, key, key_len, find_flag); int error=mi_rkey(file,buf,index, key, key_len, find_flag);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1104,7 +1104,7 @@ int ha_myisam::index_read_idx(byte * buf, uint index, const byte * key,
int ha_myisam::index_read_last(byte * buf, const byte * key, uint key_len) int ha_myisam::index_read_last(byte * buf, const byte * key, uint key_len)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count,&LOCK_status);
int error=mi_rkey(file,buf,active_index, key, key_len, HA_READ_PREFIX_LAST); int error=mi_rkey(file,buf,active_index, key, key_len, HA_READ_PREFIX_LAST);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1113,7 +1113,7 @@ int ha_myisam::index_read_last(byte * buf, const byte * key, uint key_len)
int ha_myisam::index_next(byte * buf) int ha_myisam::index_next(byte * buf)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_next_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_next_count,&LOCK_status);
int error=mi_rnext(file,buf,active_index); int error=mi_rnext(file,buf,active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1122,7 +1122,7 @@ int ha_myisam::index_next(byte * buf)
int ha_myisam::index_prev(byte * buf) int ha_myisam::index_prev(byte * buf)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_prev_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_prev_count,&LOCK_status);
int error=mi_rprev(file,buf, active_index); int error=mi_rprev(file,buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1131,7 +1131,8 @@ int ha_myisam::index_prev(byte * buf)
int ha_myisam::index_first(byte * buf) int ha_myisam::index_first(byte * buf)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_first_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_first_count,
&LOCK_status);
int error=mi_rfirst(file, buf, active_index); int error=mi_rfirst(file, buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1140,7 +1141,7 @@ int ha_myisam::index_first(byte * buf)
int ha_myisam::index_last(byte * buf) int ha_myisam::index_last(byte * buf)
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_last_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_last_count,&LOCK_status);
int error=mi_rlast(file, buf, active_index); int error=mi_rlast(file, buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1151,7 +1152,7 @@ int ha_myisam::index_next_same(byte * buf,
uint length __attribute__((unused))) uint length __attribute__((unused)))
{ {
DBUG_ASSERT(inited==INDEX); DBUG_ASSERT(inited==INDEX);
statistic_increment(ha_read_next_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_next_count,&LOCK_status);
int error=mi_rnext_same(file,buf); int error=mi_rnext_same(file,buf);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1167,7 +1168,8 @@ int ha_myisam::rnd_init(bool scan)
int ha_myisam::rnd_next(byte *buf) int ha_myisam::rnd_next(byte *buf)
{ {
statistic_increment(ha_read_rnd_next_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_rnd_next_count,
&LOCK_status);
int error=mi_scan(file, buf); int error=mi_scan(file, buf);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1180,7 +1182,7 @@ int ha_myisam::restart_rnd_next(byte *buf, byte *pos)
int ha_myisam::rnd_pos(byte * buf, byte *pos) int ha_myisam::rnd_pos(byte * buf, byte *pos)
{ {
statistic_increment(ha_read_rnd_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_rnd_count,&LOCK_status);
int error=mi_rrnd(file, buf, ha_get_ptr(pos,ref_length)); int error=mi_rrnd(file, buf, ha_get_ptr(pos,ref_length));
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -1588,7 +1590,8 @@ int ha_myisam::ft_read(byte * buf)
if (!ft_handler) if (!ft_handler)
return -1; return -1;
thread_safe_increment(ha_read_next_count,&LOCK_status); // why ? thread_safe_increment(current_thd->status_var.ha_read_next_count,
&LOCK_status); // why ?
error=ft_handler->please->read_next(ft_handler,(char*) buf); error=ft_handler->please->read_next(ft_handler,(char*) buf);

View file

@ -81,7 +81,7 @@ int ha_myisammrg::close(void)
int ha_myisammrg::write_row(byte * buf) int ha_myisammrg::write_row(byte * buf)
{ {
statistic_increment(ha_write_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_write_count,&LOCK_status);
if (table->timestamp_default_now) if (table->timestamp_default_now)
update_timestamp(buf+table->timestamp_default_now-1); update_timestamp(buf+table->timestamp_default_now-1);
if (table->next_number_field && buf == table->record[0]) if (table->next_number_field && buf == table->record[0])
@ -91,7 +91,7 @@ int ha_myisammrg::write_row(byte * buf)
int ha_myisammrg::update_row(const byte * old_data, byte * new_data) int ha_myisammrg::update_row(const byte * old_data, byte * new_data)
{ {
statistic_increment(ha_update_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_update_count,&LOCK_status);
if (table->timestamp_on_update_now) if (table->timestamp_on_update_now)
update_timestamp(new_data+table->timestamp_on_update_now); update_timestamp(new_data+table->timestamp_on_update_now);
return myrg_update(file,old_data,new_data); return myrg_update(file,old_data,new_data);
@ -99,14 +99,14 @@ int ha_myisammrg::update_row(const byte * old_data, byte * new_data)
int ha_myisammrg::delete_row(const byte * buf) int ha_myisammrg::delete_row(const byte * buf)
{ {
statistic_increment(ha_delete_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_delete_count,&LOCK_status);
return myrg_delete(file,buf); return myrg_delete(file,buf);
} }
int ha_myisammrg::index_read(byte * buf, const byte * key, int ha_myisammrg::index_read(byte * buf, const byte * key,
uint key_len, enum ha_rkey_function find_flag) uint key_len, enum ha_rkey_function find_flag)
{ {
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count,&LOCK_status);
int error=myrg_rkey(file,buf,active_index, key, key_len, find_flag); int error=myrg_rkey(file,buf,active_index, key, key_len, find_flag);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -115,7 +115,7 @@ int ha_myisammrg::index_read(byte * buf, const byte * key,
int ha_myisammrg::index_read_idx(byte * buf, uint index, const byte * key, int ha_myisammrg::index_read_idx(byte * buf, uint index, const byte * key,
uint key_len, enum ha_rkey_function find_flag) uint key_len, enum ha_rkey_function find_flag)
{ {
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count,&LOCK_status);
int error=myrg_rkey(file,buf,index, key, key_len, find_flag); int error=myrg_rkey(file,buf,index, key, key_len, find_flag);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -123,7 +123,7 @@ int ha_myisammrg::index_read_idx(byte * buf, uint index, const byte * key,
int ha_myisammrg::index_read_last(byte * buf, const byte * key, uint key_len) int ha_myisammrg::index_read_last(byte * buf, const byte * key, uint key_len)
{ {
statistic_increment(ha_read_key_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_key_count,&LOCK_status);
int error=myrg_rkey(file,buf,active_index, key, key_len, int error=myrg_rkey(file,buf,active_index, key, key_len,
HA_READ_PREFIX_LAST); HA_READ_PREFIX_LAST);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
@ -132,7 +132,7 @@ int ha_myisammrg::index_read_last(byte * buf, const byte * key, uint key_len)
int ha_myisammrg::index_next(byte * buf) int ha_myisammrg::index_next(byte * buf)
{ {
statistic_increment(ha_read_next_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_next_count,&LOCK_status);
int error=myrg_rnext(file,buf,active_index); int error=myrg_rnext(file,buf,active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -140,7 +140,7 @@ int ha_myisammrg::index_next(byte * buf)
int ha_myisammrg::index_prev(byte * buf) int ha_myisammrg::index_prev(byte * buf)
{ {
statistic_increment(ha_read_prev_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_prev_count,&LOCK_status);
int error=myrg_rprev(file,buf, active_index); int error=myrg_rprev(file,buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -148,7 +148,8 @@ int ha_myisammrg::index_prev(byte * buf)
int ha_myisammrg::index_first(byte * buf) int ha_myisammrg::index_first(byte * buf)
{ {
statistic_increment(ha_read_first_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_first_count,
&LOCK_status);
int error=myrg_rfirst(file, buf, active_index); int error=myrg_rfirst(file, buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -156,7 +157,7 @@ int ha_myisammrg::index_first(byte * buf)
int ha_myisammrg::index_last(byte * buf) int ha_myisammrg::index_last(byte * buf)
{ {
statistic_increment(ha_read_last_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_last_count,&LOCK_status);
int error=myrg_rlast(file, buf, active_index); int error=myrg_rlast(file, buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -166,7 +167,7 @@ int ha_myisammrg::index_next_same(byte * buf,
const byte *key __attribute__((unused)), const byte *key __attribute__((unused)),
uint length __attribute__((unused))) uint length __attribute__((unused)))
{ {
statistic_increment(ha_read_next_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_next_count,&LOCK_status);
int error=myrg_rnext_same(file,buf); int error=myrg_rnext_same(file,buf);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -179,7 +180,8 @@ int ha_myisammrg::rnd_init(bool scan)
int ha_myisammrg::rnd_next(byte *buf) int ha_myisammrg::rnd_next(byte *buf)
{ {
statistic_increment(ha_read_rnd_next_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_rnd_next_count,
&LOCK_status);
int error=myrg_rrnd(file, buf, HA_OFFSET_ERROR); int error=myrg_rrnd(file, buf, HA_OFFSET_ERROR);
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;
@ -187,7 +189,7 @@ int ha_myisammrg::rnd_next(byte *buf)
int ha_myisammrg::rnd_pos(byte * buf, byte *pos) int ha_myisammrg::rnd_pos(byte * buf, byte *pos)
{ {
statistic_increment(ha_read_rnd_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_rnd_count,&LOCK_status);
int error=myrg_rrnd(file, buf, ha_get_ptr(pos,ref_length)); int error=myrg_rrnd(file, buf, ha_get_ptr(pos,ref_length));
table->status=error ? STATUS_NOT_FOUND: 0; table->status=error ? STATUS_NOT_FOUND: 0;
return error; return error;

View file

@ -1963,7 +1963,7 @@ int ha_ndbcluster::index_first(byte *buf)
int ha_ndbcluster::index_last(byte *buf) int ha_ndbcluster::index_last(byte *buf)
{ {
DBUG_ENTER("index_last"); DBUG_ENTER("index_last");
statistic_increment(ha_read_last_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_last_count,&LOCK_status);
DBUG_RETURN(1); DBUG_RETURN(1);
} }

View file

@ -54,11 +54,7 @@
static int NEAR_F delete_file(const char *name,const char *ext,int extflag); static int NEAR_F delete_file(const char *name,const char *ext,int extflag);
ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count, ulong ha_read_count, ha_discover_count;
ha_read_key_count, ha_read_next_count, ha_read_prev_count,
ha_read_first_count, ha_read_last_count,
ha_commit_count, ha_rollback_count,
ha_read_rnd_count, ha_read_rnd_next_count, ha_discover_count;
static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES; static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
@ -562,7 +558,7 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans)
thd->variables.tx_isolation=thd->session_tx_isolation; thd->variables.tx_isolation=thd->session_tx_isolation;
if (operation_done) if (operation_done)
{ {
statistic_increment(ha_commit_count,&LOCK_status); statistic_increment(thd->status_var.ha_commit_count,&LOCK_status);
thd->transaction.cleanup(); thd->transaction.cleanup();
} }
if (need_start_waiters) if (need_start_waiters)
@ -651,7 +647,7 @@ int ha_rollback_trans(THD *thd, THD_TRANS *trans)
} }
thd->variables.tx_isolation=thd->session_tx_isolation; thd->variables.tx_isolation=thd->session_tx_isolation;
if (operation_done) if (operation_done)
statistic_increment(ha_rollback_count,&LOCK_status); statistic_increment(thd->status_var.ha_rollback_count,&LOCK_status);
} }
#endif /* USING_TRANSACTIONS */ #endif /* USING_TRANSACTIONS */
DBUG_RETURN(error); DBUG_RETURN(error);
@ -724,7 +720,7 @@ int ha_rollback_to_savepoint(THD *thd, char *savepoint_name)
operation_done=1; operation_done=1;
#endif #endif
if (operation_done) if (operation_done)
statistic_increment(ha_rollback_count,&LOCK_status); statistic_increment(thd->status_var.ha_rollback_count,&LOCK_status);
} }
#endif /* USING_TRANSACTIONS */ #endif /* USING_TRANSACTIONS */
@ -919,7 +915,7 @@ int handler::read_first_row(byte * buf, uint primary_key)
register int error; register int error;
DBUG_ENTER("handler::read_first_row"); DBUG_ENTER("handler::read_first_row");
statistic_increment(ha_read_first_count,&LOCK_status); statistic_increment(current_thd->status_var.ha_read_first_count,&LOCK_status);
/* /*
If there is very few deleted rows in the table, find the first row by If there is very few deleted rows in the table, find the first row by

View file

@ -2850,6 +2850,8 @@ String *Item_func_uuid::val_str(String *str)
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
char *s; char *s;
THD *thd= current_thd;
pthread_mutex_lock(&LOCK_uuid_generator); pthread_mutex_lock(&LOCK_uuid_generator);
if (! uuid_time) /* first UUID() call. initializing data */ if (! uuid_time) /* first UUID() call. initializing data */
{ {
@ -2864,7 +2866,7 @@ String *Item_func_uuid::val_str(String *str)
with a clock_seq value (initialized random below), we use a separate with a clock_seq value (initialized random below), we use a separate
randominit() here randominit() here
*/ */
randominit(&uuid_rand, tmp + (ulong)current_thd, tmp + query_id); randominit(&uuid_rand, tmp + (ulong) thd, tmp + query_id);
for (i=0; i < (int)sizeof(mac); i++) for (i=0; i < (int)sizeof(mac); i++)
mac[i]=(uchar)(my_rnd(&uuid_rand)*255); mac[i]=(uchar)(my_rnd(&uuid_rand)*255);
} }
@ -2874,7 +2876,8 @@ String *Item_func_uuid::val_str(String *str)
*--s=_dig_vec_lower[mac[i] & 15]; *--s=_dig_vec_lower[mac[i] & 15];
*--s=_dig_vec_lower[mac[i] >> 4]; *--s=_dig_vec_lower[mac[i] >> 4];
} }
randominit(&uuid_rand, tmp + (ulong)start_time, tmp + bytes_sent); randominit(&uuid_rand, tmp + (ulong)start_time,
tmp + thd->status_var.bytes_sent);
set_clock_seq_str(); set_clock_seq_str();
} }

View file

@ -698,7 +698,8 @@ int mysqld_show_status(THD *thd);
int mysqld_show_variables(THD *thd,const char *wild); int mysqld_show_variables(THD *thd,const char *wild);
int mysqld_show(THD *thd, const char *wild, show_var_st *variables, int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
enum enum_var_type value_type, enum enum_var_type value_type,
pthread_mutex_t *mutex); pthread_mutex_t *mutex,
struct system_status_var *status_var);
int mysql_find_files(THD *thd,List<char> *files, const char *db, int mysql_find_files(THD *thd,List<char> *files, const char *db,
const char *path, const char *wild, bool dir); const char *path, const char *wild, bool dir);
int mysqld_show_charsets(THD *thd,const char *wild); int mysqld_show_charsets(THD *thd,const char *wild);
@ -707,6 +708,7 @@ int mysqld_show_storage_engines(THD *thd);
int mysqld_show_privileges(THD *thd); int mysqld_show_privileges(THD *thd);
int mysqld_show_column_types(THD *thd); int mysqld_show_column_types(THD *thd);
int mysqld_help (THD *thd, const char *text); int mysqld_help (THD *thd, const char *text);
void calc_sum_of_all_status(STATUS_VAR *to);
/* sql_prepare.cc */ /* sql_prepare.cc */
int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length, int mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
@ -926,36 +928,28 @@ extern double last_query_cost;
extern double log_10[32]; extern double log_10[32];
extern ulonglong log_10_int[20]; extern ulonglong log_10_int[20];
extern ulonglong keybuff_size; extern ulonglong keybuff_size;
extern ulong refresh_version,flush_version, thread_id,query_id,opened_tables; extern ulong refresh_version,flush_version, thread_id,query_id;
extern ulong created_tmp_tables, created_tmp_disk_tables, bytes_sent;
extern ulong binlog_cache_use, binlog_cache_disk_use; extern ulong binlog_cache_use, binlog_cache_disk_use;
extern ulong aborted_threads,aborted_connects; extern ulong aborted_threads,aborted_connects;
extern ulong delayed_insert_timeout; extern ulong delayed_insert_timeout;
extern ulong delayed_insert_limit, delayed_queue_size; extern ulong delayed_insert_limit, delayed_queue_size;
extern ulong delayed_insert_threads, delayed_insert_writes; extern ulong delayed_insert_threads, delayed_insert_writes;
extern ulong delayed_rows_in_use,delayed_insert_errors; extern ulong delayed_rows_in_use,delayed_insert_errors;
extern ulong filesort_rows, filesort_range_count, filesort_scan_count;
extern ulong filesort_merge_passes;
extern ulong select_range_check_count, select_range_count, select_scan_count;
extern ulong select_full_range_join_count,select_full_join_count;
extern ulong slave_open_temp_tables; extern ulong slave_open_temp_tables;
extern ulong query_cache_size, query_cache_min_res_unit; extern ulong query_cache_size, query_cache_min_res_unit;
extern ulong thd_startup_options, slow_launch_threads, slow_launch_time; extern ulong thd_startup_options, slow_launch_threads, slow_launch_time;
extern ulong server_id, concurrency; extern ulong server_id, concurrency;
extern ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count; extern ulong ha_read_count, ha_discover_count;
extern ulong ha_read_key_count, ha_read_next_count, ha_read_prev_count; extern ulong table_cache_size;
extern ulong ha_read_first_count, ha_read_last_count;
extern ulong ha_read_rnd_count, ha_read_rnd_next_count, ha_discover_count;
extern ulong ha_commit_count, ha_rollback_count,table_cache_size;
extern ulong max_connections,max_connect_errors, connect_timeout; extern ulong max_connections,max_connect_errors, connect_timeout;
extern ulong slave_net_timeout; extern ulong slave_net_timeout;
extern ulong max_user_connections; extern ulong max_user_connections;
extern ulong long_query_count, what_to_log,flush_time; extern ulong what_to_log,flush_time;
extern ulong query_buff_size, thread_stack,thread_stack_min; extern ulong query_buff_size, thread_stack,thread_stack_min;
extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit; extern ulong binlog_cache_size, max_binlog_cache_size, open_files_limit;
extern ulong max_binlog_size, max_relay_log_size; extern ulong max_binlog_size, max_relay_log_size;
extern ulong rpl_recovery_rank, thread_cache_size; extern ulong rpl_recovery_rank, thread_cache_size;
extern ulong com_stat[(uint) SQLCOM_END], com_other, back_log; extern ulong back_log;
extern ulong specialflag, current_pid; extern ulong specialflag, current_pid;
extern ulong expire_logs_days, sync_binlog_period, sync_binlog_counter; extern ulong expire_logs_days, sync_binlog_period, sync_binlog_counter;
extern my_bool relay_log_purge, opt_innodb_safe_binlog; extern my_bool relay_log_purge, opt_innodb_safe_binlog;
@ -1005,6 +999,7 @@ extern SHOW_COMP_OPTION have_berkeley_db;
extern SHOW_COMP_OPTION have_ndbcluster; extern SHOW_COMP_OPTION have_ndbcluster;
extern struct system_variables global_system_variables; extern struct system_variables global_system_variables;
extern struct system_variables max_system_variables; extern struct system_variables max_system_variables;
extern struct system_status_var global_status_var;
extern struct rand_struct sql_rand; extern struct rand_struct sql_rand;
extern KEY_CACHE *sql_key_cache; extern KEY_CACHE *sql_key_cache;

View file

@ -289,20 +289,13 @@ ulong open_files_limit, max_binlog_size, max_relay_log_size;
ulong slave_net_timeout; ulong slave_net_timeout;
ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0; ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0;
ulong query_cache_size=0; ulong query_cache_size=0;
ulong com_stat[(uint) SQLCOM_END], com_other;
ulong bytes_sent, bytes_received, net_big_packet_count;
ulong refresh_version, flush_version; /* Increments on each reload */ ulong refresh_version, flush_version; /* Increments on each reload */
ulong query_id, long_query_count; ulong query_id;
ulong aborted_threads, killed_threads, aborted_connects; ulong aborted_threads, killed_threads, aborted_connects;
ulong delayed_insert_timeout, delayed_insert_limit, delayed_queue_size; ulong delayed_insert_timeout, delayed_insert_limit, delayed_queue_size;
ulong delayed_insert_threads, delayed_insert_writes, delayed_rows_in_use; ulong delayed_insert_threads, delayed_insert_writes, delayed_rows_in_use;
ulong delayed_insert_errors,flush_time, thread_created; ulong delayed_insert_errors,flush_time, thread_created;
ulong filesort_rows, filesort_range_count, filesort_scan_count; ulong specialflag=0;
ulong filesort_merge_passes;
ulong select_range_check_count, select_range_count, select_scan_count;
ulong select_full_range_join_count,select_full_join_count;
ulong specialflag=0,opened_tables=0,created_tmp_tables=0,
created_tmp_disk_tables=0;
ulong binlog_cache_use= 0, binlog_cache_disk_use= 0; ulong binlog_cache_use= 0, binlog_cache_disk_use= 0;
ulong max_connections,max_used_connections, ulong max_connections,max_used_connections,
max_connect_errors, max_user_connections = 0; max_connect_errors, max_user_connections = 0;
@ -361,6 +354,7 @@ I_List<NAMED_LIST> key_caches;
struct system_variables global_system_variables; struct system_variables global_system_variables;
struct system_variables max_system_variables; struct system_variables max_system_variables;
struct system_status_var global_status_var;
MY_TMPDIR mysql_tmpdir_list; MY_TMPDIR mysql_tmpdir_list;
MY_BITMAP temp_pool; MY_BITMAP temp_pool;
@ -518,6 +512,8 @@ static void close_connections(void)
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
int count=0; int count=0;
#endif #endif
THD *thd= current_thd;
DBUG_ENTER("close_connections"); DBUG_ENTER("close_connections");
/* Clear thread cache */ /* Clear thread cache */
@ -5182,118 +5178,137 @@ struct show_var_st status_vars[]= {
{"Aborted_connects", (char*) &aborted_connects, SHOW_LONG}, {"Aborted_connects", (char*) &aborted_connects, SHOW_LONG},
{"Binlog_cache_disk_use", (char*) &binlog_cache_disk_use, SHOW_LONG}, {"Binlog_cache_disk_use", (char*) &binlog_cache_disk_use, SHOW_LONG},
{"Binlog_cache_use", (char*) &binlog_cache_use, SHOW_LONG}, {"Binlog_cache_use", (char*) &binlog_cache_use, SHOW_LONG},
{"Bytes_received", (char*) &bytes_received, SHOW_LONG}, {"Bytes_received", (char*) offsetof(STATUS_VAR, bytes_received),
{"Bytes_sent", (char*) &bytes_sent, SHOW_LONG}, SHOW_LONG_STATUS},
{"Com_admin_commands", (char*) &com_other, SHOW_LONG}, {"Bytes_sent", (char*) offsetof(STATUS_VAR, bytes_sent),
{"Com_alter_db", (char*) (com_stat+(uint) SQLCOM_ALTER_DB),SHOW_LONG}, SHOW_LONG_STATUS},
{"Com_alter_table", (char*) (com_stat+(uint) SQLCOM_ALTER_TABLE),SHOW_LONG}, {"Com_admin_commands", (char*) offsetof(STATUS_VAR, com_other),
{"Com_analyze", (char*) (com_stat+(uint) SQLCOM_ANALYZE),SHOW_LONG}, SHOW_LONG_STATUS},
{"Com_backup_table", (char*) (com_stat+(uint) SQLCOM_BACKUP_TABLE),SHOW_LONG}, {"Com_alter_db", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_ALTER_DB]), SHOW_LONG_STATUS},
{"Com_begin", (char*) (com_stat+(uint) SQLCOM_BEGIN),SHOW_LONG}, {"Com_alter_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_ALTER_TABLE]), SHOW_LONG_STATUS},
{"Com_change_db", (char*) (com_stat+(uint) SQLCOM_CHANGE_DB),SHOW_LONG}, {"Com_analyze", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_ANALYZE]), SHOW_LONG_STATUS},
{"Com_change_master", (char*) (com_stat+(uint) SQLCOM_CHANGE_MASTER),SHOW_LONG}, {"Com_backup_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_BACKUP_TABLE]), SHOW_LONG_STATUS},
{"Com_check", (char*) (com_stat+(uint) SQLCOM_CHECK),SHOW_LONG}, {"Com_begin", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_BEGIN]), SHOW_LONG_STATUS},
{"Com_checksum", (char*) (com_stat+(uint) SQLCOM_CHECKSUM),SHOW_LONG}, {"Com_change_db", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CHANGE_DB]), SHOW_LONG_STATUS},
{"Com_commit", (char*) (com_stat+(uint) SQLCOM_COMMIT),SHOW_LONG}, {"Com_change_master", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CHANGE_MASTER]), SHOW_LONG_STATUS},
{"Com_create_db", (char*) (com_stat+(uint) SQLCOM_CREATE_DB),SHOW_LONG}, {"Com_check", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CHECK]), SHOW_LONG_STATUS},
{"Com_create_function", (char*) (com_stat+(uint) SQLCOM_CREATE_FUNCTION),SHOW_LONG}, {"Com_checksum", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CHECKSUM]), SHOW_LONG_STATUS},
{"Com_create_index", (char*) (com_stat+(uint) SQLCOM_CREATE_INDEX),SHOW_LONG}, {"Com_commit", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_COMMIT]), SHOW_LONG_STATUS},
{"Com_create_table", (char*) (com_stat+(uint) SQLCOM_CREATE_TABLE),SHOW_LONG}, {"Com_create_db", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CREATE_DB]), SHOW_LONG_STATUS},
{"Com_dealloc_sql", (char*) (com_stat+(uint) {"Com_create_function", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CREATE_FUNCTION]), SHOW_LONG_STATUS},
SQLCOM_DEALLOCATE_PREPARE), SHOW_LONG}, {"Com_create_index", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CREATE_INDEX]), SHOW_LONG_STATUS},
{"Com_delete", (char*) (com_stat+(uint) SQLCOM_DELETE),SHOW_LONG}, {"Com_create_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_CREATE_TABLE]), SHOW_LONG_STATUS},
{"Com_delete_multi", (char*) (com_stat+(uint) SQLCOM_DELETE_MULTI),SHOW_LONG}, {"Com_dealloc_sql", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DEALLOCATE_PREPARE]), SHOW_LONG_STATUS},
{"Com_do", (char*) (com_stat+(uint) SQLCOM_DO),SHOW_LONG}, {"Com_delete", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DELETE]), SHOW_LONG_STATUS},
{"Com_drop_db", (char*) (com_stat+(uint) SQLCOM_DROP_DB),SHOW_LONG}, {"Com_delete_multi", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DELETE_MULTI]), SHOW_LONG_STATUS},
{"Com_drop_function", (char*) (com_stat+(uint) SQLCOM_DROP_FUNCTION),SHOW_LONG}, {"Com_do", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DO]), SHOW_LONG_STATUS},
{"Com_drop_index", (char*) (com_stat+(uint) SQLCOM_DROP_INDEX),SHOW_LONG}, {"Com_drop_db", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DROP_DB]), SHOW_LONG_STATUS},
{"Com_drop_table", (char*) (com_stat+(uint) SQLCOM_DROP_TABLE),SHOW_LONG}, {"Com_drop_function", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DROP_FUNCTION]), SHOW_LONG_STATUS},
{"Com_drop_user", (char*) (com_stat+(uint) SQLCOM_DROP_USER),SHOW_LONG}, {"Com_drop_index", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DROP_INDEX]), SHOW_LONG_STATUS},
{"Com_execute_sql", (char*) (com_stat+(uint) SQLCOM_EXECUTE), {"Com_drop_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DROP_TABLE]), SHOW_LONG_STATUS},
SHOW_LONG}, {"Com_drop_user", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DROP_USER]), SHOW_LONG_STATUS},
{"Com_flush", (char*) (com_stat+(uint) SQLCOM_FLUSH),SHOW_LONG}, {"Com_execute_sql", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_EXECUTE]), SHOW_LONG_STATUS},
{"Com_grant", (char*) (com_stat+(uint) SQLCOM_GRANT),SHOW_LONG}, {"Com_flush", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_FLUSH]), SHOW_LONG_STATUS},
{"Com_ha_close", (char*) (com_stat+(uint) SQLCOM_HA_CLOSE),SHOW_LONG}, {"Com_grant", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_GRANT]), SHOW_LONG_STATUS},
{"Com_ha_open", (char*) (com_stat+(uint) SQLCOM_HA_OPEN),SHOW_LONG}, {"Com_ha_close", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_HA_CLOSE]), SHOW_LONG_STATUS},
{"Com_ha_read", (char*) (com_stat+(uint) SQLCOM_HA_READ),SHOW_LONG}, {"Com_ha_open", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_HA_OPEN]), SHOW_LONG_STATUS},
{"Com_help", (char*) (com_stat+(uint) SQLCOM_HELP),SHOW_LONG}, {"Com_ha_read", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_HA_READ]), SHOW_LONG_STATUS},
{"Com_insert", (char*) (com_stat+(uint) SQLCOM_INSERT),SHOW_LONG}, {"Com_help", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_HELP]), SHOW_LONG_STATUS},
{"Com_insert_select", (char*) (com_stat+(uint) SQLCOM_INSERT_SELECT),SHOW_LONG}, {"Com_insert", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_INSERT]), SHOW_LONG_STATUS},
{"Com_kill", (char*) (com_stat+(uint) SQLCOM_KILL),SHOW_LONG}, {"Com_insert_select", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_INSERT_SELECT]), SHOW_LONG_STATUS},
{"Com_load", (char*) (com_stat+(uint) SQLCOM_LOAD),SHOW_LONG}, {"Com_kill", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_KILL]), SHOW_LONG_STATUS},
{"Com_load_master_data", (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_DATA),SHOW_LONG}, {"Com_load", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LOAD]), SHOW_LONG_STATUS},
{"Com_load_master_table", (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_TABLE),SHOW_LONG}, {"Com_load_master_data", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LOAD_MASTER_DATA]), SHOW_LONG_STATUS},
{"Com_lock_tables", (char*) (com_stat+(uint) SQLCOM_LOCK_TABLES),SHOW_LONG}, {"Com_load_master_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LOAD_MASTER_TABLE]), SHOW_LONG_STATUS},
{"Com_optimize", (char*) (com_stat+(uint) SQLCOM_OPTIMIZE),SHOW_LONG}, {"Com_lock_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LOCK_TABLES]), SHOW_LONG_STATUS},
{"Com_preload_keys", (char*) (com_stat+(uint) SQLCOM_PRELOAD_KEYS),SHOW_LONG}, {"Com_optimize", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_OPTIMIZE]), SHOW_LONG_STATUS},
{"Com_prepare_sql", (char*) (com_stat+(uint) SQLCOM_PREPARE), {"Com_preload_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PRELOAD_KEYS]), SHOW_LONG_STATUS},
SHOW_LONG}, {"Com_prepare_sql", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PREPARE]), SHOW_LONG_STATUS},
{"Com_purge", (char*) (com_stat+(uint) SQLCOM_PURGE),SHOW_LONG}, {"Com_purge", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PURGE]), SHOW_LONG_STATUS},
{"Com_purge_before_date", (char*) (com_stat+(uint) SQLCOM_PURGE_BEFORE),SHOW_LONG}, {"Com_purge_before_date", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PURGE_BEFORE]), SHOW_LONG_STATUS},
{"Com_rename_table", (char*) (com_stat+(uint) SQLCOM_RENAME_TABLE),SHOW_LONG}, {"Com_rename_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_RENAME_TABLE]), SHOW_LONG_STATUS},
{"Com_repair", (char*) (com_stat+(uint) SQLCOM_REPAIR),SHOW_LONG}, {"Com_repair", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REPAIR]), SHOW_LONG_STATUS},
{"Com_replace", (char*) (com_stat+(uint) SQLCOM_REPLACE),SHOW_LONG}, {"Com_replace", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REPLACE]), SHOW_LONG_STATUS},
{"Com_replace_select", (char*) (com_stat+(uint) SQLCOM_REPLACE_SELECT),SHOW_LONG}, {"Com_replace_select", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REPLACE_SELECT]), SHOW_LONG_STATUS},
{"Com_reset", (char*) (com_stat+(uint) SQLCOM_RESET),SHOW_LONG}, {"Com_reset", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_RESET]), SHOW_LONG_STATUS},
{"Com_restore_table", (char*) (com_stat+(uint) SQLCOM_RESTORE_TABLE),SHOW_LONG}, {"Com_restore_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_RESTORE_TABLE]), SHOW_LONG_STATUS},
{"Com_revoke", (char*) (com_stat+(uint) SQLCOM_REVOKE),SHOW_LONG}, {"Com_revoke", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REVOKE]), SHOW_LONG_STATUS},
{"Com_revoke_all", (char*) (com_stat+(uint) SQLCOM_REVOKE_ALL),SHOW_LONG}, {"Com_revoke_all", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_REVOKE_ALL]), SHOW_LONG_STATUS},
{"Com_rollback", (char*) (com_stat+(uint) SQLCOM_ROLLBACK),SHOW_LONG}, {"Com_rollback", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_ROLLBACK]), SHOW_LONG_STATUS},
{"Com_savepoint", (char*) (com_stat+(uint) SQLCOM_SAVEPOINT),SHOW_LONG}, {"Com_savepoint", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SAVEPOINT]), SHOW_LONG_STATUS},
{"Com_select", (char*) (com_stat+(uint) SQLCOM_SELECT),SHOW_LONG}, {"Com_select", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SELECT]), SHOW_LONG_STATUS},
{"Com_set_option", (char*) (com_stat+(uint) SQLCOM_SET_OPTION),SHOW_LONG}, {"Com_set_option", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SET_OPTION]), SHOW_LONG_STATUS},
{"Com_show_binlog_events", (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOG_EVENTS),SHOW_LONG}, {"Com_show_binlogs", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_BINLOGS]), SHOW_LONG_STATUS},
{"Com_show_binlogs", (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOGS),SHOW_LONG}, {"Com_show_binlog_events", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_BINLOG_EVENTS]), SHOW_LONG_STATUS},
{"Com_show_charsets", (char*) (com_stat+(uint) SQLCOM_SHOW_CHARSETS),SHOW_LONG}, {"Com_show_charsets", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CHARSETS]), SHOW_LONG_STATUS},
{"Com_show_collations", (char*) (com_stat+(uint) SQLCOM_SHOW_COLLATIONS),SHOW_LONG}, {"Com_show_collations", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_COLLATIONS]), SHOW_LONG_STATUS},
{"Com_show_column_types", (char*) (com_stat+(uint) SQLCOM_SHOW_COLUMN_TYPES),SHOW_LONG}, {"Com_show_column_types", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_COLUMN_TYPES]), SHOW_LONG_STATUS},
{"Com_show_create_db", (char*) (com_stat+(uint) SQLCOM_SHOW_CREATE_DB),SHOW_LONG}, {"Com_show_create_table", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CREATE]), SHOW_LONG_STATUS},
{"Com_show_create_table", (char*) (com_stat+(uint) SQLCOM_SHOW_CREATE),SHOW_LONG}, {"Com_show_create_db", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CREATE_DB]), SHOW_LONG_STATUS},
{"Com_show_databases", (char*) (com_stat+(uint) SQLCOM_SHOW_DATABASES),SHOW_LONG}, {"Com_show_databases", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_DATABASES]), SHOW_LONG_STATUS},
{"Com_show_errors", (char*) (com_stat+(uint) SQLCOM_SHOW_ERRORS),SHOW_LONG}, {"Com_show_errors", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_ERRORS]), SHOW_LONG_STATUS},
{"Com_show_fields", (char*) (com_stat+(uint) SQLCOM_SHOW_FIELDS),SHOW_LONG}, {"Com_show_fields", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_FIELDS]), SHOW_LONG_STATUS},
{"Com_show_grants", (char*) (com_stat+(uint) SQLCOM_SHOW_GRANTS),SHOW_LONG}, {"Com_show_grants", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_GRANTS]), SHOW_LONG_STATUS},
{"Com_show_innodb_status", (char*) (com_stat+(uint) SQLCOM_SHOW_INNODB_STATUS),SHOW_LONG}, {"Com_show_innodb_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_INNODB_STATUS]), SHOW_LONG_STATUS},
{"Com_show_keys", (char*) (com_stat+(uint) SQLCOM_SHOW_KEYS),SHOW_LONG}, {"Com_show_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_KEYS]), SHOW_LONG_STATUS},
{"Com_show_logs", (char*) (com_stat+(uint) SQLCOM_SHOW_LOGS),SHOW_LONG}, {"Com_show_logs", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_LOGS]), SHOW_LONG_STATUS},
{"Com_show_master_status", (char*) (com_stat+(uint) SQLCOM_SHOW_MASTER_STAT),SHOW_LONG}, {"Com_show_master_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_MASTER_STAT]), SHOW_LONG_STATUS},
{"Com_show_new_master", (char*) (com_stat+(uint) SQLCOM_SHOW_NEW_MASTER),SHOW_LONG}, {"Com_show_new_master", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_NEW_MASTER]), SHOW_LONG_STATUS},
{"Com_show_open_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_OPEN_TABLES),SHOW_LONG}, {"Com_show_open_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_OPEN_TABLES]), SHOW_LONG_STATUS},
{"Com_show_privileges", (char*) (com_stat+(uint) SQLCOM_SHOW_PRIVILEGES),SHOW_LONG}, {"Com_show_privileges", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PRIVILEGES]), SHOW_LONG_STATUS},
{"Com_show_processlist", (char*) (com_stat+(uint) SQLCOM_SHOW_PROCESSLIST),SHOW_LONG}, {"Com_show_processlist", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_PROCESSLIST]), SHOW_LONG_STATUS},
{"Com_show_slave_hosts", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_HOSTS),SHOW_LONG}, {"Com_show_slave_hosts", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_SLAVE_HOSTS]), SHOW_LONG_STATUS},
{"Com_show_slave_status", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_STAT),SHOW_LONG}, {"Com_show_slave_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_SLAVE_STAT]), SHOW_LONG_STATUS},
{"Com_show_status", (char*) (com_stat+(uint) SQLCOM_SHOW_STATUS),SHOW_LONG}, {"Com_show_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STATUS]), SHOW_LONG_STATUS},
{"Com_show_storage_engines", (char*) (com_stat+(uint) SQLCOM_SHOW_STORAGE_ENGINES),SHOW_LONG}, {"Com_show_storage_engines", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STORAGE_ENGINES]), SHOW_LONG_STATUS},
{"Com_show_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_TABLES),SHOW_LONG}, {"Com_show_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_TABLES]), SHOW_LONG_STATUS},
{"Com_show_variables", (char*) (com_stat+(uint) SQLCOM_SHOW_VARIABLES),SHOW_LONG}, {"Com_show_variables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_VARIABLES]), SHOW_LONG_STATUS},
{"Com_show_warnings", (char*) (com_stat+(uint) SQLCOM_SHOW_WARNS),SHOW_LONG}, {"Com_show_warnings", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_WARNS]), SHOW_LONG_STATUS},
{"Com_slave_start", (char*) (com_stat+(uint) SQLCOM_SLAVE_START),SHOW_LONG}, {"Com_slave_start", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SLAVE_START]), SHOW_LONG_STATUS},
{"Com_slave_stop", (char*) (com_stat+(uint) SQLCOM_SLAVE_STOP),SHOW_LONG}, {"Com_slave_stop", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SLAVE_STOP]), SHOW_LONG_STATUS},
{"Com_truncate", (char*) (com_stat+(uint) SQLCOM_TRUNCATE),SHOW_LONG}, {"Com_truncate", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_TRUNCATE]), SHOW_LONG_STATUS},
{"Com_unlock_tables", (char*) (com_stat+(uint) SQLCOM_UNLOCK_TABLES),SHOW_LONG}, {"Com_unlock_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_UNLOCK_TABLES]), SHOW_LONG_STATUS},
{"Com_update", (char*) (com_stat+(uint) SQLCOM_UPDATE),SHOW_LONG}, {"Com_update", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_UPDATE]), SHOW_LONG_STATUS},
{"Com_update_multi", (char*) (com_stat+(uint) SQLCOM_UPDATE_MULTI),SHOW_LONG}, {"Com_update_multi", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_UPDATE_MULTI]), SHOW_LONG_STATUS},
{"Connections", (char*) &thread_id, SHOW_LONG_CONST}, {"Connections", (char*) &thread_id, SHOW_LONG_CONST},
{"Created_tmp_disk_tables", (char*) &created_tmp_disk_tables,SHOW_LONG}, {"Created_tmp_disk_tables", (char*) offsetof(STATUS_VAR,
created_tmp_disk_tables),
SHOW_LONG_STATUS},
{"Created_tmp_files", (char*) &my_tmp_file_created, SHOW_LONG}, {"Created_tmp_files", (char*) &my_tmp_file_created, SHOW_LONG},
{"Created_tmp_tables", (char*) &created_tmp_tables, SHOW_LONG}, {"Created_tmp_tables", (char*) offsetof(STATUS_VAR,
created_tmp_tables),
SHOW_LONG_STATUS},
{"Delayed_errors", (char*) &delayed_insert_errors, SHOW_LONG}, {"Delayed_errors", (char*) &delayed_insert_errors, SHOW_LONG},
{"Delayed_insert_threads", (char*) &delayed_insert_threads, SHOW_LONG_CONST}, {"Delayed_insert_threads", (char*) &delayed_insert_threads, SHOW_LONG_CONST},
{"Delayed_writes", (char*) &delayed_insert_writes, SHOW_LONG}, {"Delayed_writes", (char*) &delayed_insert_writes, SHOW_LONG},
{"Flush_commands", (char*) &refresh_version, SHOW_LONG_CONST}, {"Flush_commands", (char*) &refresh_version, SHOW_LONG_CONST},
{"Handler_commit", (char*) &ha_commit_count, SHOW_LONG}, {"Handler_commit", (char*) offsetof(STATUS_VAR, ha_commit_count),
{"Handler_delete", (char*) &ha_delete_count, SHOW_LONG}, SHOW_LONG_STATUS},
{"Handler_delete", (char*) offsetof(STATUS_VAR, ha_delete_count),
SHOW_LONG_STATUS},
{"Handler_discover", (char*) &ha_discover_count, SHOW_LONG}, {"Handler_discover", (char*) &ha_discover_count, SHOW_LONG},
{"Handler_read_first", (char*) &ha_read_first_count, SHOW_LONG}, {"Handler_read_first", (char*) offsetof(STATUS_VAR,
{"Handler_read_key", (char*) &ha_read_key_count, SHOW_LONG}, ha_read_first_count),
{"Handler_read_next", (char*) &ha_read_next_count, SHOW_LONG}, SHOW_LONG_STATUS},
{"Handler_read_prev", (char*) &ha_read_prev_count, SHOW_LONG}, {"Handler_read_key", (char*) offsetof(STATUS_VAR, ha_read_key_count),
{"Handler_read_rnd", (char*) &ha_read_rnd_count, SHOW_LONG}, SHOW_LONG_STATUS},
{"Handler_read_rnd_next", (char*) &ha_read_rnd_next_count, SHOW_LONG}, {"Handler_read_next", (char*) offsetof(STATUS_VAR,
{"Handler_rollback", (char*) &ha_rollback_count, SHOW_LONG}, ha_read_next_count),
{"Handler_update", (char*) &ha_update_count, SHOW_LONG}, SHOW_LONG_STATUS},
{"Handler_write", (char*) &ha_write_count, SHOW_LONG}, {"Handler_read_prev", (char*) offsetof(STATUS_VAR,
ha_read_prev_count),
SHOW_LONG_STATUS},
{"Handler_read_rnd", (char*) offsetof(STATUS_VAR, ha_read_rnd_count),
SHOW_LONG_STATUS},
{"Handler_read_rnd_next", (char*) offsetof(STATUS_VAR,
ha_read_rnd_next_count),
SHOW_LONG_STATUS},
{"Handler_rollback", (char*) offsetof(STATUS_VAR, ha_rollback_count),
SHOW_LONG_STATUS},
{"Handler_update", (char*) offsetof(STATUS_VAR, ha_update_count),
SHOW_LONG_STATUS},
{"Handler_write", (char*) offsetof(STATUS_VAR, ha_write_count),
SHOW_LONG_STATUS},
{"Key_blocks_not_flushed", (char*) &dflt_key_cache_var.global_blocks_changed, {"Key_blocks_not_flushed", (char*) &dflt_key_cache_var.global_blocks_changed,
SHOW_KEY_CACHE_LONG}, SHOW_KEY_CACHE_LONG},
{"Key_blocks_unused", (char*) &dflt_key_cache_var.blocks_unused, {"Key_blocks_unused", (char*) &dflt_key_cache_var.blocks_unused,
@ -5314,7 +5329,8 @@ struct show_var_st status_vars[]= {
{"Open_files", (char*) &my_file_opened, SHOW_LONG_CONST}, {"Open_files", (char*) &my_file_opened, SHOW_LONG_CONST},
{"Open_streams", (char*) &my_stream_opened, SHOW_LONG_CONST}, {"Open_streams", (char*) &my_stream_opened, SHOW_LONG_CONST},
{"Open_tables", (char*) 0, SHOW_OPENTABLES}, {"Open_tables", (char*) 0, SHOW_OPENTABLES},
{"Opened_tables", (char*) &opened_tables, SHOW_LONG}, {"Opened_tables", (char*) offsetof(STATUS_VAR, opened_tables),
SHOW_LONG_STATUS},
#ifdef HAVE_QUERY_CACHE #ifdef HAVE_QUERY_CACHE
{"Qcache_free_blocks", (char*) &query_cache.free_memory_blocks, {"Qcache_free_blocks", (char*) &query_cache.free_memory_blocks,
SHOW_LONG_CONST}, SHOW_LONG_CONST},
@ -5330,19 +5346,36 @@ struct show_var_st status_vars[]= {
#endif /*HAVE_QUERY_CACHE*/ #endif /*HAVE_QUERY_CACHE*/
{"Questions", (char*) 0, SHOW_QUESTION}, {"Questions", (char*) 0, SHOW_QUESTION},
{"Rpl_status", (char*) 0, SHOW_RPL_STATUS}, {"Rpl_status", (char*) 0, SHOW_RPL_STATUS},
{"Select_full_join", (char*) &select_full_join_count, SHOW_LONG}, {"Select_full_join", (char*) offsetof(STATUS_VAR,
{"Select_full_range_join", (char*) &select_full_range_join_count, SHOW_LONG}, select_full_join_count),
{"Select_range", (char*) &select_range_count, SHOW_LONG}, SHOW_LONG_STATUS},
{"Select_range_check", (char*) &select_range_check_count, SHOW_LONG}, {"Select_full_range_join", (char*) offsetof(STATUS_VAR,
{"Select_scan", (char*) &select_scan_count, SHOW_LONG}, select_full_range_join_count),
SHOW_LONG_STATUS},
{"Select_range", (char*) offsetof(STATUS_VAR,
select_range_count),
SHOW_LONG_STATUS},
{"Select_range_check", (char*) offsetof(STATUS_VAR,
select_range_check_count),
SHOW_LONG_STATUS},
{"Select_scan", (char*) offsetof(STATUS_VAR, select_scan_count),
SHOW_LONG_STATUS},
{"Slave_open_temp_tables", (char*) &slave_open_temp_tables, SHOW_LONG}, {"Slave_open_temp_tables", (char*) &slave_open_temp_tables, SHOW_LONG},
{"Slave_running", (char*) 0, SHOW_SLAVE_RUNNING}, {"Slave_running", (char*) 0, SHOW_SLAVE_RUNNING},
{"Slow_launch_threads", (char*) &slow_launch_threads, SHOW_LONG}, {"Slow_launch_threads", (char*) &slow_launch_threads, SHOW_LONG},
{"Slow_queries", (char*) &long_query_count, SHOW_LONG}, {"Slow_queries", (char*) offsetof(STATUS_VAR, long_query_count),
{"Sort_merge_passes", (char*) &filesort_merge_passes, SHOW_LONG}, SHOW_LONG_STATUS},
{"Sort_range", (char*) &filesort_range_count, SHOW_LONG}, {"Sort_merge_passes", (char*) offsetof(STATUS_VAR,
{"Sort_rows", (char*) &filesort_rows, SHOW_LONG}, filesort_merge_passes),
{"Sort_scan", (char*) &filesort_scan_count, SHOW_LONG}, SHOW_LONG_STATUS},
{"Sort_range", (char*) offsetof(STATUS_VAR,
filesort_range_count),
SHOW_LONG_STATUS},
{"Sort_rows", (char*) offsetof(STATUS_VAR, filesort_rows),
SHOW_LONG_STATUS},
{"Sort_scan", (char*) offsetof(STATUS_VAR,
filesort_scan_count),
SHOW_LONG_STATUS},
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
{"Ssl_accept_renegotiates", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_RENEGOTIATE}, {"Ssl_accept_renegotiates", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT_RENEGOTIATE},
{"Ssl_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT}, {"Ssl_accepts", (char*) 0, SHOW_SSL_CTX_SESS_ACCEPT},
@ -5473,27 +5506,22 @@ static void mysql_init_variables(void)
test_flags= select_errors= dropping_tables= ha_open_options=0; test_flags= select_errors= dropping_tables= ha_open_options=0;
thread_count= thread_running= kill_cached_threads= wake_thread=0; thread_count= thread_running= kill_cached_threads= wake_thread=0;
slave_open_temp_tables= 0; slave_open_temp_tables= 0;
com_other= 0;
cached_thread_count= 0; cached_thread_count= 0;
bytes_sent= bytes_received= 0;
opt_endinfo= using_udf_functions= 0; opt_endinfo= using_udf_functions= 0;
opt_using_transactions= using_update_log= 0; opt_using_transactions= using_update_log= 0;
abort_loop= select_thread_in_use= signal_thread_in_use= 0; abort_loop= select_thread_in_use= signal_thread_in_use= 0;
ready_to_exit= shutdown_in_progress= grant_option= 0; ready_to_exit= shutdown_in_progress= grant_option= 0;
long_query_count= aborted_threads= aborted_connects= 0; aborted_threads= aborted_connects= 0;
delayed_insert_threads= delayed_insert_writes= delayed_rows_in_use= 0; delayed_insert_threads= delayed_insert_writes= delayed_rows_in_use= 0;
delayed_insert_errors= thread_created= 0; delayed_insert_errors= thread_created= 0;
filesort_rows= filesort_range_count= filesort_scan_count= 0; specialflag= 0;
filesort_merge_passes= select_range_check_count= select_range_count= 0;
select_scan_count= select_full_range_join_count= select_full_join_count= 0;
specialflag= opened_tables= created_tmp_tables= created_tmp_disk_tables= 0;
binlog_cache_use= binlog_cache_disk_use= 0; binlog_cache_use= binlog_cache_disk_use= 0;
max_used_connections= slow_launch_threads = 0; max_used_connections= slow_launch_threads = 0;
mysqld_user= mysqld_chroot= opt_init_file= opt_bin_logname = 0; mysqld_user= mysqld_chroot= opt_init_file= opt_bin_logname = 0;
errmesg= 0; errmesg= 0;
mysqld_unix_port= opt_mysql_tmpdir= my_bind_addr_str= NullS; mysqld_unix_port= opt_mysql_tmpdir= my_bind_addr_str= NullS;
bzero((gptr) &mysql_tmpdir_list, sizeof(mysql_tmpdir_list)); bzero((gptr) &mysql_tmpdir_list, sizeof(mysql_tmpdir_list));
bzero((gptr) &com_stat, sizeof(com_stat)); bzero((char *) &global_status_var, sizeof(global_status_var));
/* Character sets */ /* Character sets */
system_charset_info= &my_charset_utf8_general_ci; system_charset_info= &my_charset_utf8_general_ci;

View file

@ -103,11 +103,10 @@ extern uint test_flags;
extern ulong bytes_sent, bytes_received, net_big_packet_count; extern ulong bytes_sent, bytes_received, net_big_packet_count;
extern pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received; extern pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received;
extern void query_cache_insert(NET *net, const char *packet, ulong length); extern void query_cache_insert(NET *net, const char *packet, ulong length);
#define update_statistics(A) A
#else #else
#undef statistic_add #define update_statistics(A)
#undef statistic_increment #define thd_increment_bytes_sent()
#define statistic_add(A,B,C)
#define statistic_increment(A,B)
#endif #endif
#define TEST_BLOCKING 8 #define TEST_BLOCKING 8
@ -565,7 +564,7 @@ net_real_write(NET *net,const char *packet,ulong len)
break; break;
} }
pos+=length; pos+=length;
statistic_add(bytes_sent,length,&LOCK_bytes_sent); update_statistics(thd_increment_bytes_sent(length));
} }
#ifndef __WIN__ #ifndef __WIN__
end: end:
@ -636,7 +635,7 @@ static my_bool my_net_skip_rest(NET *net, uint32 remain, thr_alarm_t *alarmed,
DBUG_PRINT("enter",("bytes_to_skip: %u", (uint) remain)); DBUG_PRINT("enter",("bytes_to_skip: %u", (uint) remain));
/* The following is good for debugging */ /* The following is good for debugging */
statistic_increment(net_big_packet_count,&LOCK_bytes_received); update_statistics(thd_increment_net_big_packet_count(1));
if (!thr_alarm_in_use(alarmed)) if (!thr_alarm_in_use(alarmed))
{ {
@ -652,7 +651,7 @@ static my_bool my_net_skip_rest(NET *net, uint32 remain, thr_alarm_t *alarmed,
uint length= min(remain, net->max_packet); uint length= min(remain, net->max_packet);
if (net_safe_read(net, (char*) net->buff, length, alarmed)) if (net_safe_read(net, (char*) net->buff, length, alarmed))
DBUG_RETURN(1); DBUG_RETURN(1);
statistic_add(bytes_received, length, &LOCK_bytes_received); update_statistics(thd_increment_bytes_received(length));
remain -= (uint32) length; remain -= (uint32) length;
} }
if (old != MAX_PACKET_LENGTH) if (old != MAX_PACKET_LENGTH)
@ -777,7 +776,7 @@ my_real_read(NET *net, ulong *complen)
} }
remain -= (uint32) length; remain -= (uint32) length;
pos+= (ulong) length; pos+= (ulong) length;
statistic_add(bytes_received,(ulong) length,&LOCK_bytes_received); update_statistics(thd_increment_bytes_received(length));
} }
if (i == 0) if (i == 0)
{ /* First parts is packet length */ { /* First parts is packet length */

View file

@ -298,6 +298,7 @@ void THD::init(void)
bzero((char*) warn_count, sizeof(warn_count)); bzero((char*) warn_count, sizeof(warn_count));
total_warn_count= 0; total_warn_count= 0;
update_charset(); update_charset();
bzero((char *) &status_var, sizeof(status_var));
} }
@ -388,6 +389,7 @@ THD::~THD()
/* Ensure that no one is using THD */ /* Ensure that no one is using THD */
pthread_mutex_lock(&LOCK_delete); pthread_mutex_lock(&LOCK_delete);
pthread_mutex_unlock(&LOCK_delete); pthread_mutex_unlock(&LOCK_delete);
add_to_status(&global_status_var, &status_var);
/* Close connection */ /* Close connection */
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
@ -430,6 +432,27 @@ THD::~THD()
} }
/*
Add to one status variable another status variable
NOTES
This function assumes that all variables are long/ulong.
If this assumption will change, then we have to explictely add
the other variables after the while loop
*/
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var)
{
ulong *end= (ulong*) ((byte*) to_var + offsetof(STATUS_VAR,
last_system_status_var) +
sizeof(ulong));
ulong *to= (ulong*) to_var, *from= (ulong*) from_var;
while (to != end)
*(to++)+= *(from++);
}
void THD::awake(THD::killed_state state_to_set) void THD::awake(THD::killed_state state_to_set)
{ {
THD_CHECK_SENTRY(this); THD_CHECK_SENTRY(this);
@ -1628,3 +1651,27 @@ void TMP_TABLE_PARAM::init()
group_parts= group_length= group_null_parts= 0; group_parts= group_length= group_null_parts= 0;
quick_group= 1; quick_group= 1;
} }
void thd_increment_bytes_sent(ulong length)
{
current_thd->status_var.bytes_sent+= length;
}
void thd_increment_bytes_received(ulong length)
{
current_thd->status_var.bytes_received+= length;
}
void thd_increment_net_big_packet_count(ulong length)
{
current_thd->status_var.net_big_packet_count+= length;
}
void THD::set_status_var_init()
{
bzero((char*) &status_var, sizeof(status_var));
}

View file

@ -442,6 +442,61 @@ struct system_variables
DATE_TIME_FORMAT *time_format; DATE_TIME_FORMAT *time_format;
}; };
/* per thread status variables */
typedef struct system_status_var
{
ulong bytes_received;
ulong bytes_sent;
ulong com_other;
ulong com_stat[(uint) SQLCOM_END];
ulong created_tmp_disk_tables;
ulong created_tmp_tables;
ulong ha_commit_count;
ulong ha_delete_count;
ulong ha_read_first_count;
ulong ha_read_last_count;
ulong ha_read_key_count;
ulong ha_read_next_count;
ulong ha_read_prev_count;
ulong ha_read_rnd_count;
ulong ha_read_rnd_next_count;
ulong ha_rollback_count;
ulong ha_update_count;
ulong ha_write_count;
/* KEY_CACHE parts. These are copies of the original */
ulong key_blocks_changed;
ulong key_blocks_used;
ulong key_cache_r_requests;
ulong key_cache_read;
ulong key_cache_w_requests;
ulong key_cache_write;
/* END OF KEY_CACHE parts */
ulong net_big_packet_count;
ulong opened_tables;
ulong select_full_join_count;
ulong select_full_range_join_count;
ulong select_range_count;
ulong select_range_check_count;
ulong select_scan_count;
ulong long_query_count;
ulong filesort_merge_passes;
ulong filesort_range_count;
ulong filesort_rows;
ulong filesort_scan_count;
} STATUS_VAR;
/*
This is used for 'show status'. It must be updated to the last ulong
variable in system_status_var
*/
#define last_system_status_var filesort_scan_count
void free_tmp_table(THD *thd, TABLE *entry); void free_tmp_table(THD *thd, TABLE *entry);
@ -683,6 +738,7 @@ public:
struct sockaddr_in remote; // client socket address struct sockaddr_in remote; // client socket address
struct rand_struct rand; // used for authentication struct rand_struct rand; // used for authentication
struct system_variables variables; // Changeable local variables struct system_variables variables; // Changeable local variables
struct system_status_var status_var; // Per thread statistic vars
pthread_mutex_t LOCK_delete; // Locked before thd is deleted pthread_mutex_t LOCK_delete; // Locked before thd is deleted
/* /*
Note that (A) if we set query = NULL, we must at the same time set Note that (A) if we set query = NULL, we must at the same time set
@ -1072,6 +1128,7 @@ public:
} }
inline CHARSET_INFO *charset() { return variables.character_set_client; } inline CHARSET_INFO *charset() { return variables.character_set_client; }
void update_charset(); void update_charset();
void set_status_var_init();
}; };
/* Flags for the THD::system_thread (bitmap) variable */ /* Flags for the THD::system_thread (bitmap) variable */
@ -1555,3 +1612,7 @@ public:
bool send_eof(); bool send_eof();
void cleanup(); void cleanup();
}; };
/* Functions in sql_class.cc */
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var);

View file

@ -1343,7 +1343,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
case COM_INIT_DB: case COM_INIT_DB:
{ {
LEX_STRING tmp; LEX_STRING tmp;
statistic_increment(com_stat[SQLCOM_CHANGE_DB],&LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_CHANGE_DB],
&LOCK_status);
thd->convert_string(&tmp, system_charset_info, thd->convert_string(&tmp, system_charset_info,
packet, strlen(packet), thd->charset()); packet, strlen(packet), thd->charset());
if (!mysql_change_db(thd, tmp.str)) if (!mysql_change_db(thd, tmp.str))
@ -1364,7 +1365,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
uint db_len= *(uchar*) packet; uint db_len= *(uchar*) packet;
uint tbl_len= *(uchar*) (packet + db_len + 1); uint tbl_len= *(uchar*) (packet + db_len + 1);
statistic_increment(com_other, &LOCK_status); statistic_increment(thd->status_var.com_other, &LOCK_status);
thd->slow_command= TRUE; thd->slow_command= TRUE;
db= thd->alloc(db_len + tbl_len + 2); db= thd->alloc(db_len + tbl_len + 2);
tbl_name= strmake(db, packet + 1, db_len)+1; tbl_name= strmake(db, packet + 1, db_len)+1;
@ -1378,7 +1379,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
thd->change_user(); thd->change_user();
thd->clear_error(); // if errors from rollback thd->clear_error(); // if errors from rollback
statistic_increment(com_other, &LOCK_status); statistic_increment(thd->status_var.com_other, &LOCK_status);
char *user= (char*) packet; char *user= (char*) packet;
char *passwd= strend(user)+1; char *passwd= strend(user)+1;
/* /*
@ -1545,7 +1546,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
TABLE_LIST table_list; TABLE_LIST table_list;
LEX_STRING conv_name; LEX_STRING conv_name;
statistic_increment(com_stat[SQLCOM_SHOW_FIELDS],&LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_SHOW_FIELDS],
&LOCK_status);
bzero((char*) &table_list,sizeof(table_list)); bzero((char*) &table_list,sizeof(table_list));
if (!(table_list.db=thd->db)) if (!(table_list.db=thd->db))
{ {
@ -1598,7 +1600,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
{ {
char *db=thd->strdup(packet), *alias; char *db=thd->strdup(packet), *alias;
statistic_increment(com_stat[SQLCOM_CREATE_DB],&LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_CREATE_DB],
&LOCK_status);
// null test to handle EOM // null test to handle EOM
if (!db || !(alias= thd->strdup(db)) || check_db_name(db)) if (!db || !(alias= thd->strdup(db)) || check_db_name(db))
{ {
@ -1613,7 +1616,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
} }
case COM_DROP_DB: // QQ: To be removed case COM_DROP_DB: // QQ: To be removed
{ {
statistic_increment(com_stat[SQLCOM_DROP_DB],&LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_DROP_DB],
&LOCK_status);
char *db=thd->strdup(packet), *alias; char *db=thd->strdup(packet), *alias;
/* null test to handle EOM */ /* null test to handle EOM */
if (!db || !(alias= thd->strdup(db)) || check_db_name(db)) if (!db || !(alias= thd->strdup(db)) || check_db_name(db))
@ -1635,7 +1639,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
case COM_BINLOG_DUMP: case COM_BINLOG_DUMP:
{ {
statistic_increment(com_other,&LOCK_status); statistic_increment(thd->status_var.com_other,&LOCK_status);
thd->slow_command = TRUE; thd->slow_command = TRUE;
if (check_global_access(thd, REPL_SLAVE_ACL)) if (check_global_access(thd, REPL_SLAVE_ACL))
break; break;
@ -1661,7 +1665,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
#endif #endif
case COM_REFRESH: case COM_REFRESH:
{ {
statistic_increment(com_stat[SQLCOM_FLUSH],&LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_FLUSH],
&LOCK_status);
ulong options= (ulong) (uchar) packet[0]; ulong options= (ulong) (uchar) packet[0];
if (check_global_access(thd,RELOAD_ACL)) if (check_global_access(thd,RELOAD_ACL))
break; break;
@ -1675,7 +1680,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
case COM_SHUTDOWN: case COM_SHUTDOWN:
{ {
statistic_increment(com_other,&LOCK_status); statistic_increment(thd->status_var.com_other, &LOCK_status);
if (check_global_access(thd,SHUTDOWN_ACL)) if (check_global_access(thd,SHUTDOWN_ACL))
break; /* purecov: inspected */ break; /* purecov: inspected */
/* /*
@ -1714,7 +1719,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
case COM_STATISTICS: case COM_STATISTICS:
{ {
mysql_log.write(thd,command,NullS); mysql_log.write(thd,command,NullS);
statistic_increment(com_stat[SQLCOM_SHOW_STATUS],&LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_SHOW_STATUS],
&LOCK_status);
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
char buff[200]; char buff[200];
#else #else
@ -1724,8 +1730,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
sprintf((char*) buff, sprintf((char*) buff,
"Uptime: %ld Threads: %d Questions: %lu Slow queries: %ld Opens: %ld Flush tables: %ld Open tables: %u Queries per second avg: %.3f", "Uptime: %ld Threads: %d Questions: %lu Slow queries: %ld Opens: %ld Flush tables: %ld Open tables: %u Queries per second avg: %.3f",
uptime, uptime,
(int) thread_count,thd->query_id,long_query_count, (int) thread_count,thd->query_id,thd->status_var.long_query_count,
opened_tables,refresh_version, cached_tables(), thd->status_var.opened_tables,refresh_version, cached_tables(),
uptime ? (float)thd->query_id/(float)uptime : 0); uptime ? (float)thd->query_id/(float)uptime : 0);
#ifdef SAFEMALLOC #ifdef SAFEMALLOC
if (sf_malloc_cur_memory) // Using SAFEMALLOC if (sf_malloc_cur_memory) // Using SAFEMALLOC
@ -1740,11 +1746,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
break; break;
} }
case COM_PING: case COM_PING:
statistic_increment(com_other,&LOCK_status); statistic_increment(thd->status_var.com_other, &LOCK_status);
send_ok(thd); // Tell client we are alive send_ok(thd); // Tell client we are alive
break; break;
case COM_PROCESS_INFO: case COM_PROCESS_INFO:
statistic_increment(com_stat[SQLCOM_SHOW_PROCESSLIST],&LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_SHOW_PROCESSLIST],
&LOCK_status);
if (!thd->priv_user[0] && check_global_access(thd,PROCESS_ACL)) if (!thd->priv_user[0] && check_global_access(thd,PROCESS_ACL))
break; break;
mysql_log.write(thd,command,NullS); mysql_log.write(thd,command,NullS);
@ -1754,14 +1761,15 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
break; break;
case COM_PROCESS_KILL: case COM_PROCESS_KILL:
{ {
statistic_increment(com_stat[SQLCOM_KILL],&LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_KILL], &LOCK_status);
ulong id=(ulong) uint4korr(packet); ulong id=(ulong) uint4korr(packet);
kill_one_thread(thd,id,false); kill_one_thread(thd,id,false);
break; break;
} }
case COM_SET_OPTION: case COM_SET_OPTION:
{ {
statistic_increment(com_stat[SQLCOM_SET_OPTION], &LOCK_status); statistic_increment(thd->status_var.com_stat[SQLCOM_SET_OPTION],
&LOCK_status);
enum_mysql_set_option command= (enum_mysql_set_option) uint2korr(packet); enum_mysql_set_option command= (enum_mysql_set_option) uint2korr(packet);
switch (command) { switch (command) {
case MYSQL_OPTION_MULTI_STATEMENTS_ON: case MYSQL_OPTION_MULTI_STATEMENTS_ON:
@ -1779,7 +1787,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
break; break;
} }
case COM_DEBUG: case COM_DEBUG:
statistic_increment(com_other,&LOCK_status); statistic_increment(thd->status_var.com_other, &LOCK_status);
if (check_global_access(thd, SUPER_ACL)) if (check_global_access(thd, SUPER_ACL))
break; /* purecov: inspected */ break; /* purecov: inspected */
mysql_print_status(thd); mysql_print_status(thd);
@ -1818,7 +1826,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) && (SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) &&
(specialflag & SPECIAL_LOG_QUERIES_NOT_USING_INDEXES))) (specialflag & SPECIAL_LOG_QUERIES_NOT_USING_INDEXES)))
{ {
long_query_count++; thd->status_var.long_query_count++;
mysql_slow_log.write(thd, thd->query, thd->query_length, start_of_query); mysql_slow_log.write(thd, thd->query, thd->query_length, start_of_query);
} }
} }
@ -1995,7 +2003,8 @@ mysql_execute_command(THD *thd)
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
statistic_increment(com_stat[lex->sql_command],&LOCK_status); statistic_increment(thd->status_var.com_stat[lex->sql_command],
&LOCK_status);
switch (lex->sql_command) { switch (lex->sql_command) {
case SQLCOM_SELECT: case SQLCOM_SELECT:
{ {
@ -2976,13 +2985,23 @@ unsent_create_error:
res= mysqld_show_column_types(thd); res= mysqld_show_column_types(thd);
break; break;
case SQLCOM_SHOW_STATUS: case SQLCOM_SHOW_STATUS:
res= mysqld_show(thd,(lex->wild ? lex->wild->ptr() : NullS),status_vars, STATUS_VAR tmp;
OPT_GLOBAL, &LOCK_status); if (lex->option_type == OPT_GLOBAL)
{
pthread_mutex_lock(&LOCK_status);
calc_sum_of_all_status(&tmp);
}
res= mysqld_show(thd, (lex->wild ? lex->wild->ptr() : NullS),
status_vars, OPT_GLOBAL, &LOCK_status,
(lex->option_type == OPT_GLOBAL ?
&tmp: &thd->status_var));
if (lex->option_type == OPT_GLOBAL)
pthread_mutex_unlock(&LOCK_status);
break; break;
case SQLCOM_SHOW_VARIABLES: case SQLCOM_SHOW_VARIABLES:
res= mysqld_show(thd, (lex->wild ? lex->wild->ptr() : NullS), res= mysqld_show(thd, (lex->wild ? lex->wild->ptr() : NullS),
init_vars, lex->option_type, init_vars, lex->option_type,
&LOCK_global_system_variables); &LOCK_global_system_variables, 0);
break; break;
case SQLCOM_SHOW_LOGS: case SQLCOM_SHOW_LOGS:
#ifdef DONT_ALLOW_SHOW_COMMANDS #ifdef DONT_ALLOW_SHOW_COMMANDS
@ -5663,6 +5682,13 @@ static void refresh_status(void)
(char*) &dflt_key_cache_var)); (char*) &dflt_key_cache_var));
*(ulong*) value= 0; *(ulong*) value= 0;
} }
else if (ptr->type == SHOW_LONG_STATUS)
{
THD *thd= current_thd;
/* We must update the global status before cleaning up the thread */
add_to_status(&global_status_var, &thd->status_var);
bzero((char*) &thd->status_var, sizeof(thd->status_var));
}
} }
pthread_mutex_unlock(&LOCK_status); pthread_mutex_unlock(&LOCK_status);
} }

View file

@ -5145,6 +5145,7 @@ static void
make_join_readinfo(JOIN *join, uint options) make_join_readinfo(JOIN *join, uint options)
{ {
uint i; uint i;
bool statistics= test(!(join->select_options & SELECT_DESCRIBE)); bool statistics= test(!(join->select_options & SELECT_DESCRIBE));
DBUG_ENTER("make_join_readinfo"); DBUG_ENTER("make_join_readinfo");
@ -5243,7 +5244,8 @@ make_join_readinfo(JOIN *join, uint options)
join->thd->server_status|=SERVER_QUERY_NO_GOOD_INDEX_USED; join->thd->server_status|=SERVER_QUERY_NO_GOOD_INDEX_USED;
tab->read_first_record= join_init_quick_read_record; tab->read_first_record= join_init_quick_read_record;
if (statistics) if (statistics)
statistic_increment(select_range_check_count, &LOCK_status); statistic_increment(join->thd->status_var.select_range_check_count,
&LOCK_status);
} }
else else
{ {
@ -5253,13 +5255,15 @@ make_join_readinfo(JOIN *join, uint options)
if (tab->select && tab->select->quick) if (tab->select && tab->select->quick)
{ {
if (statistics) if (statistics)
statistic_increment(select_range_count, &LOCK_status); statistic_increment(join->thd->status_var.select_range_count,
&LOCK_status);
} }
else else
{ {
join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED; join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
if (statistics) if (statistics)
statistic_increment(select_scan_count, &LOCK_status); statistic_increment(join->thd->status_var.select_scan_count,
&LOCK_status);
} }
} }
else else
@ -5267,13 +5271,15 @@ make_join_readinfo(JOIN *join, uint options)
if (tab->select && tab->select->quick) if (tab->select && tab->select->quick)
{ {
if (statistics) if (statistics)
statistic_increment(select_full_range_join_count, &LOCK_status); statistic_increment(join->thd->status_var.select_full_range_join_count,
&LOCK_status);
} }
else else
{ {
join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED; join->thd->server_status|=SERVER_QUERY_NO_INDEX_USED;
if (statistics) if (statistics)
statistic_increment(select_full_join_count, &LOCK_status); statistic_increment(join->thd->status_var.select_full_join_count,
&LOCK_status);
} }
} }
if (!table->no_keyread) if (!table->no_keyread)
@ -6654,7 +6660,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
(int) distinct, (int) save_sum_fields, (int) distinct, (int) save_sum_fields,
(ulong) rows_limit,test(group))); (ulong) rows_limit,test(group)));
statistic_increment(created_tmp_tables, &LOCK_status); statistic_increment(thd->status_var.created_tmp_tables, &LOCK_status);
if (use_temp_pool) if (use_temp_pool)
temp_pool_slot = bitmap_set_next(&temp_pool); temp_pool_slot = bitmap_set_next(&temp_pool);
@ -7240,7 +7246,8 @@ static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param,
table->db_stat=0; table->db_stat=0;
goto err; goto err;
} }
statistic_increment(created_tmp_disk_tables, &LOCK_status); statistic_increment(table->in_use->status_var.created_tmp_disk_tables,
&LOCK_status);
table->db_record_offset=1; table->db_record_offset=1;
DBUG_RETURN(0); DBUG_RETURN(0);
err: err:

View file

@ -1874,7 +1874,8 @@ err:
int mysqld_show(THD *thd, const char *wild, show_var_st *variables, int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
enum enum_var_type value_type, enum enum_var_type value_type,
pthread_mutex_t *mutex) pthread_mutex_t *mutex,
struct system_status_var *status_var)
{ {
char buff[1024]; char buff[1024];
List<Item> field_list; List<Item> field_list;
@ -1912,6 +1913,10 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
pos= end= buff; pos= end= buff;
switch (show_type) { switch (show_type) {
case SHOW_LONG_STATUS:
case SHOW_LONG_CONST_STATUS:
value= ((char *) status_var + (uint) value);
/* fall through */
case SHOW_LONG: case SHOW_LONG:
case SHOW_LONG_CONST: case SHOW_LONG_CONST:
end= int10_to_str(*(long*) value, buff, 10); end= int10_to_str(*(long*) value, buff, 10);
@ -2181,6 +2186,31 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables,
DBUG_RETURN(1); DBUG_RETURN(1);
} }
/* collect status for all running threads */
void calc_sum_of_all_status(STATUS_VAR *to)
{
DBUG_ENTER("calc_sum_of_all_status");
/* Ensure that thread id not killed during loop */
VOID(pthread_mutex_lock(&LOCK_thread_count)); // For unlink from list
I_List_iterator<THD> it(threads);
THD *tmp;
/* Get global values as base */
*to= global_status_var;
/* Add to this status from existing threads */
while ((tmp= it++))
add_to_status(to, &tmp->status_var);
VOID(pthread_mutex_unlock(&LOCK_thread_count));
DBUG_VOID_RETURN;
}
#ifdef __GNUC__ #ifdef __GNUC__
template class List_iterator_fast<char>; template class List_iterator_fast<char>;
template class List<char>; template class List<char>;

View file

@ -468,16 +468,20 @@ read_first: %10lu\n\
write: %10lu\n\ write: %10lu\n\
delete %10lu\n\ delete %10lu\n\
update: %10lu\n", update: %10lu\n",
ha_read_key_count, ha_read_next_count, thd->status_var.ha_read_key_count,
ha_read_rnd_count, ha_read_first_count, thd->status_var.ha_read_next_count,
ha_write_count, ha_delete_count, ha_update_count); thd->status_var.ha_read_rnd_count,
thd->status_var.ha_read_first_count,
thd->status_var.ha_write_count,
thd->status_var.ha_delete_count,
thd->status_var.ha_update_count);
pthread_mutex_unlock(&LOCK_status); pthread_mutex_unlock(&LOCK_status);
printf("\nTable status:\n\ printf("\nTable status:\n\
Opened tables: %10lu\n\ Opened tables: %10lu\n\
Open tables: %10lu\n\ Open tables: %10lu\n\
Open files: %10lu\n\ Open files: %10lu\n\
Open streams: %10lu\n", Open streams: %10lu\n",
opened_tables, thd->status_var.opened_tables,
(ulong) cached_tables(), (ulong) cached_tables(),
(ulong) my_file_opened, (ulong) my_file_opened,
(ulong) my_stream_opened); (ulong) my_stream_opened);

View file

@ -5937,8 +5937,12 @@ show_param:
{ Lex->sql_command = SQLCOM_SHOW_WARNS;} { Lex->sql_command = SQLCOM_SHOW_WARNS;}
| ERRORS opt_limit_clause_init | ERRORS opt_limit_clause_init
{ Lex->sql_command = SQLCOM_SHOW_ERRORS;} { Lex->sql_command = SQLCOM_SHOW_ERRORS;}
| STATUS_SYM wild | opt_var_type STATUS_SYM wild
{ Lex->sql_command= SQLCOM_SHOW_STATUS; } {
THD *thd= YYTHD;
thd->lex->sql_command= SQLCOM_SHOW_STATUS;
thd->lex->option_type= (enum_var_type) $1;
}
| INNOBASE_SYM STATUS_SYM | INNOBASE_SYM STATUS_SYM
{ Lex->sql_command = SQLCOM_SHOW_INNODB_STATUS; WARN_DEPRECATED("SHOW INNODB STATUS", "SHOW ENGINE INNODB STATUS"); } { Lex->sql_command = SQLCOM_SHOW_INNODB_STATUS; WARN_DEPRECATED("SHOW INNODB STATUS", "SHOW ENGINE INNODB STATUS"); }
| opt_full PROCESSLIST_SYM | opt_full PROCESSLIST_SYM

View file

@ -176,7 +176,8 @@ enum SHOW_TYPE
SHOW_SSL_GET_CIPHER_LIST, SHOW_SSL_GET_CIPHER_LIST,
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
SHOW_RPL_STATUS, SHOW_SLAVE_RUNNING, SHOW_RPL_STATUS, SHOW_SLAVE_RUNNING,
SHOW_KEY_CACHE_LONG, SHOW_KEY_CACHE_CONST_LONG SHOW_KEY_CACHE_LONG, SHOW_KEY_CACHE_CONST_LONG,
SHOW_LONG_STATUS, SHOW_LONG_CONST_STATUS
}; };
enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED}; enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED};

View file

@ -733,7 +733,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
outparam->db_low_byte_first=outparam->file->low_byte_first(); outparam->db_low_byte_first=outparam->file->low_byte_first();
my_pthread_setspecific_ptr(THR_MALLOC,old_root); my_pthread_setspecific_ptr(THR_MALLOC,old_root);
opened_tables++; current_thd->status_var.opened_tables++;
#ifndef DBUG_OFF #ifndef DBUG_OFF
if (use_hash) if (use_hash)
(void) hash_check(&outparam->name_hash); (void) hash_check(&outparam->name_hash);