From a2675d291612f64f47bbccd72f8366065def2c00 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Dec 2001 22:45:32 +0200 Subject: [PATCH 1/5] ut0byte.h, ut0byte.c, dict0dict.c: Make column names non-case-sensitive in referential constraints and put table and database names there in lower case in Windows innobase/dict/dict0dict.c: Make column names non-case-sensitive in referential constraints and put table and database names there in lower case in Windows innobase/ut/ut0byte.c: Make column names non-case-sensitive in referential constraints and put table and database names there in lower case in Windows innobase/include/ut0byte.h: Make column names non-case-sensitive in referential constraints and put table and database names there in lower case in Windows --- innobase/dict/dict0dict.c | 14 ++++++++++--- innobase/include/ut0byte.h | 20 ++++++++++++++++++ innobase/ut/ut0byte.c | 43 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index ba032013baf..bf3e134febb 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -1761,9 +1761,8 @@ dict_scan_col( col = dict_table_get_nth_col(table, i); if (ut_strlen(col->name) == (ulint)(ptr - old_ptr) - && 0 == ut_memcmp(col->name, old_ptr, + && 0 == ut_cmp_in_lower_case(col->name, old_ptr, (ulint)(ptr - old_ptr))) { - /* Found */ *success = TRUE; @@ -1827,11 +1826,20 @@ dict_scan_table_name( break; } } - +#ifdef __WIN__ + ut_cpy_in_lower_case(second_table_name + i, old_ptr, + ptr - old_ptr); +#else ut_memcpy(second_table_name + i, old_ptr, ptr - old_ptr); +#endif second_table_name[i + (ptr - old_ptr)] = '\0'; } else { +#ifdef __WIN__ + ut_cpy_in_lower_case(second_table_name, old_ptr, + ptr - old_ptr); +#else ut_memcpy(second_table_name, old_ptr, ptr - old_ptr); +#endif second_table_name[dot_ptr - old_ptr] = '/'; second_table_name[ptr - old_ptr] = '\0'; } diff --git a/innobase/include/ut0byte.h b/innobase/include/ut0byte.h index 77795ee0708..b45f2160392 100644 --- a/innobase/include/ut0byte.h +++ b/innobase/include/ut0byte.h @@ -220,6 +220,26 @@ ut_bit_set_nth( ulint a, /* in: ulint */ ulint n, /* in: nth bit requested */ ibool val); /* in: value for the bit to set */ +/**************************************************************** +Copies a string to a memory location, setting characters to lower case. */ + +void +ut_cpy_in_lower_case( +/*=================*/ + char* dest, /* in: destination */ + char* source, /* in: source */ + ulint len); /* in: string length */ +/**************************************************************** +Compares two strings when converted to lower case. */ + +int +ut_cmp_in_lower_case( +/*=================*/ + /* out: -1, 0, 1 if str1 < str2, str1 == str2, + str1 > str2, respectively */ + char* str1, /* in: string1 */ + char* str2, /* in: string2 */ + ulint len); /* in: length of both strings */ #ifndef UNIV_NONINL diff --git a/innobase/ut/ut0byte.c b/innobase/ut/ut0byte.c index fa0d904a6a7..02bdf2065ee 100644 --- a/innobase/ut/ut0byte.c +++ b/innobase/ut/ut0byte.c @@ -30,3 +30,46 @@ ut_dulint_sort(dulint* arr, dulint* aux_arr, ulint low, ulint high) ut_dulint_cmp); } +/**************************************************************** +Copies a string to a memory location, setting characters to lower case. */ + +void +ut_cpy_in_lower_case( +/*=================*/ + char* dest, /* in: destination */ + char* source,/* in: source */ + ulint len) /* in: string length */ +{ + ulint i; + + for (i = 0; i < len; i++) { + dest[i] = tolower(source[i]); + } +} + +/**************************************************************** +Compares two strings when converted to lower case. */ + +int +ut_cmp_in_lower_case( +/*=================*/ + /* out: -1, 0, 1 if str1 < str2, str1 == str2, + str1 > str2, respectively */ + char* str1, /* in: string1 */ + char* str2, /* in: string2 */ + ulint len) /* in: length of both strings */ +{ + ulint i; + + for (i = 0; i < len; i++) { + if (tolower(str1[i]) < tolower(str2[i])) { + return(-1); + } + + if (tolower(str1[i]) > tolower(str2[i])) { + return(1); + } + } + + return(0); +} From 75125cf0e75e8651f36022b7b43363f04caf9932 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Dec 2001 23:42:31 +0200 Subject: [PATCH 2/5] btr0cur.c: Improve table cardinality estimate if there are big BLOBs innobase/btr/btr0cur.c: Improve table cardinality estimate if there are big BLOBs --- innobase/btr/btr0cur.c | 67 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index 70de09f0fd9..da51be11176 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -85,6 +85,15 @@ btr_rec_free_updated_extern_fields( inherited fields */ mtr_t* mtr); /* in: mini-transaction handle which contains an X-latch to record page and to the tree */ +/*************************************************************** +Gets the externally stored size of a record, in units of a database page. */ +static +ulint +btr_rec_get_externally_stored_len( +/*==============================*/ + /* out: externally stored part, in units of a + database page */ + rec_t* rec); /* in: record */ /*==================== B-TREE SEARCH =========================*/ @@ -2540,6 +2549,7 @@ btr_estimate_number_of_different_key_vals( ulint matched_bytes; ulint* n_diff; ulint not_empty_flag = 0; + ulint total_external_size = 0; ulint i; ulint j; mtr_t mtr; @@ -2586,10 +2596,15 @@ btr_estimate_number_of_different_key_vals( for (j = matched_fields + 1; j <= n_cols; j++) { n_diff[j]++; } - + + total_external_size += + btr_rec_get_externally_stored_len(rec); + rec = page_rec_get_next(rec); } + total_external_size += + btr_rec_get_externally_stored_len(rec); mtr_commit(&mtr); } @@ -2597,12 +2612,18 @@ btr_estimate_number_of_different_key_vals( BTR_KEY_VAL_ESTIMATE_N_PAGES leaf pages, we can estimate how many there will be in index->stat_n_leaf_pages */ + /* We must take into account that our sample actually represents + also the pages used for external storage of fields (those pages are + included in index->stat_n_leaf_pages) */ + for (j = 0; j <= n_cols; j++) { index->stat_n_diff_key_vals[j] = (n_diff[j] * index->stat_n_leaf_pages + BTR_KEY_VAL_ESTIMATE_N_PAGES - 1 + + total_external_size + not_empty_flag) - / BTR_KEY_VAL_ESTIMATE_N_PAGES; + / (BTR_KEY_VAL_ESTIMATE_N_PAGES + + total_external_size); } mem_free(n_diff); @@ -2610,6 +2631,48 @@ btr_estimate_number_of_different_key_vals( /*================== EXTERNAL STORAGE OF BIG FIELDS ===================*/ +/*************************************************************** +Gets the externally stored size of a record, in units of a database page. */ +static +ulint +btr_rec_get_externally_stored_len( +/*==============================*/ + /* out: externally stored part, in units of a + database page */ + rec_t* rec) /* in: record */ +{ + ulint n_fields; + byte* data; + ulint local_len; + ulint extern_len; + ulint total_extern_len = 0; + ulint i; + + if (rec_get_data_size(rec) <= REC_1BYTE_OFFS_LIMIT) { + + return(0); + } + + n_fields = rec_get_n_fields(rec); + + for (i = 0; i < n_fields; i++) { + if (rec_get_nth_field_extern_bit(rec, i)) { + + data = rec_get_nth_field(rec, i, &local_len); + + local_len -= BTR_EXTERN_FIELD_REF_SIZE; + + extern_len = mach_read_from_4(data + local_len + + BTR_EXTERN_LEN + 4); + + total_extern_len += ut_calc_align(extern_len, + UNIV_PAGE_SIZE); + } + } + + return(total_extern_len / UNIV_PAGE_SIZE); +} + /*********************************************************************** Sets the ownership bit of an externally stored field in a record. */ static From b9562004e9d8e062790f6346bd8a0439fd5e8822 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 11 Dec 2001 23:45:49 +0200 Subject: [PATCH 3/5] sync0arr.c: Increase semaphore wait warning threshold to 240 seconds innobase/sync/sync0arr.c: Increase semaphore wait warning threshold to 240 seconds --- innobase/sync/sync0arr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/innobase/sync/sync0arr.c b/innobase/sync/sync0arr.c index b82c2a4a2df..c41754316d0 100644 --- a/innobase/sync/sync0arr.c +++ b/innobase/sync/sync0arr.c @@ -905,7 +905,7 @@ sync_array_print_long_waits(void) cell = sync_array_get_nth_cell(sync_primary_wait_array, i); if (cell->wait_object != NULL - && difftime(time(NULL), cell->reservation_time) > 120) { + && difftime(time(NULL), cell->reservation_time) > 240) { fprintf(stderr, "InnoDB: Warning: a long semaphore wait:\n"); From c0de7ffcc83fb5192fda8ec1e47f20c417c5c374 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 13 Dec 2001 19:06:14 +0200 Subject: [PATCH 4/5] Fixed problem with default & InnoDB tables. Docs/manual.texi: ChangeLog --- Docs/manual.texi | 2 ++ mysql-test/r/innodb.result | 2 ++ mysql-test/t/innodb.test | 8 ++++++++ sql/table.cc | 6 ++---- sql/unireg.cc | 20 +++++++++++++++----- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 416e16ff710..bb8e725c8a4 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46839,6 +46839,8 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.47 @itemize @bullet @item +Fix default values for InnoDB tables. +@item Fixed that @code{GROUP BY expr DESC} works. @item Fixed bug when using @code{t1 LEFT JOIN t2 ON t2.key=constant}. diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index 333bbc45196..a422f55767d 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -499,3 +499,5 @@ table type possible_keys key key_len ref rows Extra t1 index NULL b 4 NULL 4 Using index table type possible_keys key key_len ref rows Extra t1 ALL NULL NULL NULL NULL 4 +Field Type Null Key Default Extra +testint int(11) 1 diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index f0e9f8cf72f..a962f120d4e 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -529,3 +529,11 @@ explain select a,b from t1 order by b; explain select a,b from t1; explain select a,b,c from t1; drop table t1; + +# +# Check describe +# + +create table t1 (testint int not null default 1) type=innodb; +desc t1; +drop table t1; diff --git a/sql/table.cc b/sql/table.cc index eed4170c14a..1ab6c50add9 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -120,10 +120,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, outparam->db_record_offset=1; if (db_create_options & HA_OPTION_LONG_BLOB_PTR) outparam->blob_ptr_size=portable_sizeof_char_ptr; - outparam->db_low_byte_first=test(outparam->db_type == DB_TYPE_MYISAM || - outparam->db_type == DB_TYPE_BERKELEY_DB || - outparam->db_type == DB_TYPE_HEAP); - + /* Set temporaryly a good value for db_low_byte_first */ + outparam->db_low_byte_first=test(outparam->db_type != DB_TYPE_ISAM); error=4; outparam->max_rows=uint4korr(head+18); outparam->min_rows=uint4korr(head+22); diff --git a/sql/unireg.cc b/sql/unireg.cc index c5bfbbbea88..0bfc462f01a 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -515,16 +515,23 @@ static bool make_empty_rec(File file,enum db_type table_type, uchar *buff,*null_pos; TABLE table; create_field *field; + handler *handler; DBUG_ENTER("make_empty_rec"); /* We need a table to generate columns for default values */ bzero((char*) &table,sizeof(table)); - table.db_low_byte_first=test(table_type == DB_TYPE_MYISAM || - table_type == DB_TYPE_HEAP); + handler= get_new_handler((TABLE*) 0, table_type); + + if (!handler || + !(buff=(uchar*) my_malloc((uint) reclength,MYF(MY_WME | MY_ZEROFILL)))) + { + delete handler; + DBUG_RETURN(1); + } + + table.db_low_byte_first= handler->low_byte_first(); table.blob_ptr_size=portable_sizeof_char_ptr; - if (!(buff=(uchar*) my_malloc((uint) reclength,MYF(MY_WME | MY_ZEROFILL)))) - DBUG_RETURN(1); firstpos=reclength; null_count=0; if (!(table_options & HA_OPTION_PACK_RECORD)) @@ -574,8 +581,11 @@ static bool make_empty_rec(File file,enum db_type table_type, regfield->reset(); delete regfield; } - bfill((byte*) buff+null_length,firstpos-null_length,255);/* Fill not used startpos */ + + /* Fill not used startpos */ + bfill((byte*) buff+null_length,firstpos-null_length,255); error=(int) my_write(file,(byte*) buff,(uint) reclength,MYF_RW); my_free((gptr) buff,MYF(MY_FAE)); + delete handler; DBUG_RETURN(error); } /* make_empty_rec */ From e12119dcc445edaddc6f232e8b565adc95b03a4c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 13 Dec 2001 20:06:44 +0200 Subject: [PATCH 5/5] Added status variables for all MySQL commands. Docs/manual.texi: Changelog --- Docs/manual.texi | 4 ++++ sql/mysql_priv.h | 1 + sql/mysqld.cc | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ sql/sql_lex.h | 3 ++- sql/sql_parse.cc | 17 +++++++++++++- 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index bb8e725c8a4..3df6dd1abca 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -19620,6 +19620,7 @@ The status variables listed above have the following meaning: @item @code{Aborted_connects} @tab Number of tries to connect to the MySQL server that failed. @xref{Communication errors}. @item @code{Bytes_received} @tab Number of bytes received from all clients. @item @code{Bytes_sent} @tab Number of bytes sent to all clients. +@item @code{Com_xxxx} @tab Number of times the xxx commands has been executed. @item @code{Connections} @tab Number of connection attempts to the MySQL server. @item @code{Created_tmp_disk_tables} @tab Number of implicit temporary tables on disk created while executing statements. @item @code{Created_tmp_tables} @tab Number of implicit temporary tables in memory created while executing statements. @@ -46839,6 +46840,9 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.47 @itemize @bullet @item +Added statistics variables for all MySQL commands. (@code{SHOW STATUS} is +now much longer). +@item Fix default values for InnoDB tables. @item Fixed that @code{GROUP BY expr DESC} works. diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index ceb9bd9a691..11bf7d36389 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -542,6 +542,7 @@ extern ulong keybuff_size,sortbuff_size,max_item_sort_length,table_cache_size, max_tmp_tables,max_heap_table_size,query_buff_size, lower_case_table_names,thread_stack,thread_stack_min, binlog_cache_size, max_binlog_cache_size, record_rnd_cache_size; +extern ulong com_stat[(uint) SQLCOM_END], com_other; extern ulong specialflag, current_pid; extern bool low_priority_updates, using_update_log,opt_warnings; extern bool opt_sql_bin_update, opt_safe_show_db, opt_safe_user_create; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 82fc5556bd8..e0b17a59982 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -270,6 +270,7 @@ ulong keybuff_size,sortbuff_size,max_item_sort_length,table_cache_size, net_interactive_timeout, slow_launch_time = 2L, net_read_timeout,net_write_timeout,slave_open_temp_tables=0, open_files_limit=0, max_binlog_size, record_rnd_cache_size; +ulong com_stat[(uint) SQLCOM_END], com_other; ulong slave_net_timeout; ulong thread_cache_size=0, binlog_cache_size=0, max_binlog_cache_size=0; volatile ulong cached_thread_count=0; @@ -3044,6 +3045,63 @@ struct show_var_st status_vars[]= { {"Aborted_connects", (char*) &aborted_connects, SHOW_LONG}, {"Bytes_received", (char*) &bytes_received, SHOW_LONG}, {"Bytes_sent", (char*) &bytes_sent, SHOW_LONG}, + {"Com_admin_commands", (char*) &com_other, SHOW_LONG}, + {"Com_alter_table", (char*) (com_stat+(uint) SQLCOM_ALTER_TABLE),SHOW_LONG}, + {"Com_analyze", (char*) (com_stat+(uint) SQLCOM_ANALYZE),SHOW_LONG}, + {"Com_backup_table", (char*) (com_stat+(uint) SQLCOM_BACKUP_TABLE),SHOW_LONG}, + {"Com_begin", (char*) (com_stat+(uint) SQLCOM_BEGIN),SHOW_LONG}, + {"Com_change_db", (char*) (com_stat+(uint) SQLCOM_CHANGE_DB),SHOW_LONG}, + {"Com_change_master", (char*) (com_stat+(uint) SQLCOM_CHANGE_MASTER),SHOW_LONG}, + {"Com_check", (char*) (com_stat+(uint) SQLCOM_CHECK),SHOW_LONG}, + {"Com_commit", (char*) (com_stat+(uint) SQLCOM_COMMIT),SHOW_LONG}, + {"Com_create_db", (char*) (com_stat+(uint) SQLCOM_CREATE_DB),SHOW_LONG}, + {"Com_create_function", (char*) (com_stat+(uint) SQLCOM_CREATE_FUNCTION),SHOW_LONG}, + {"Com_create_index", (char*) (com_stat+(uint) SQLCOM_CREATE_INDEX),SHOW_LONG}, + {"Com_create_table", (char*) (com_stat+(uint) SQLCOM_CREATE_TABLE),SHOW_LONG}, + {"Com_delete", (char*) (com_stat+(uint) SQLCOM_DELETE),SHOW_LONG}, + {"Com_drop_db", (char*) (com_stat+(uint) SQLCOM_DROP_DB),SHOW_LONG}, + {"Com_drop_function", (char*) (com_stat+(uint) SQLCOM_DROP_FUNCTION),SHOW_LONG}, + {"Com_drop_index", (char*) (com_stat+(uint) SQLCOM_DROP_INDEX),SHOW_LONG}, + {"Com_drop_table", (char*) (com_stat+(uint) SQLCOM_DROP_TABLE),SHOW_LONG}, + {"Com_flush", (char*) (com_stat+(uint) SQLCOM_FLUSH),SHOW_LONG}, + {"Com_grant", (char*) (com_stat+(uint) SQLCOM_GRANT),SHOW_LONG}, + {"Com_insert", (char*) (com_stat+(uint) SQLCOM_INSERT),SHOW_LONG}, + {"Com_insert_select", (char*) (com_stat+(uint) SQLCOM_INSERT_SELECT),SHOW_LONG}, + {"Com_kill", (char*) (com_stat+(uint) SQLCOM_KILL),SHOW_LONG}, + {"Com_load", (char*) (com_stat+(uint) SQLCOM_LOAD),SHOW_LONG}, + {"Com_load_master_table", (char*) (com_stat+(uint) SQLCOM_LOAD_MASTER_TABLE),SHOW_LONG}, + {"Com_lock_tables", (char*) (com_stat+(uint) SQLCOM_LOCK_TABLES),SHOW_LONG}, + {"Com_optimize", (char*) (com_stat+(uint) SQLCOM_OPTIMIZE),SHOW_LONG}, + {"Com_purge", (char*) (com_stat+(uint) SQLCOM_PURGE),SHOW_LONG}, + {"Com_rename_table", (char*) (com_stat+(uint) SQLCOM_RENAME_TABLE),SHOW_LONG}, + {"Com_repair", (char*) (com_stat+(uint) SQLCOM_REPAIR),SHOW_LONG}, + {"Com_replace", (char*) (com_stat+(uint) SQLCOM_REPLACE),SHOW_LONG}, + {"Com_replace_select", (char*) (com_stat+(uint) SQLCOM_REPLACE_SELECT),SHOW_LONG}, + {"Com_reset", (char*) (com_stat+(uint) SQLCOM_RESET),SHOW_LONG}, + {"Com_restore_table", (char*) (com_stat+(uint) SQLCOM_RESTORE_TABLE),SHOW_LONG}, + {"Com_revoke", (char*) (com_stat+(uint) SQLCOM_REVOKE),SHOW_LONG}, + {"Com_rollback", (char*) (com_stat+(uint) SQLCOM_ROLLBACK),SHOW_LONG}, + {"Com_select", (char*) (com_stat+(uint) SQLCOM_SELECT),SHOW_LONG}, + {"Com_set_option", (char*) (com_stat+(uint) SQLCOM_SET_OPTION),SHOW_LONG}, + {"Com_show_binlogs", (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOGS),SHOW_LONG}, + {"Com_show_create", (char*) (com_stat+(uint) SQLCOM_SHOW_CREATE),SHOW_LONG}, + {"Com_show_databases", (char*) (com_stat+(uint) SQLCOM_SHOW_DATABASES),SHOW_LONG}, + {"Com_show_fields", (char*) (com_stat+(uint) SQLCOM_SHOW_FIELDS),SHOW_LONG}, + {"Com_show_grants", (char*) (com_stat+(uint) SQLCOM_SHOW_GRANTS),SHOW_LONG}, + {"Com_show_keys", (char*) (com_stat+(uint) SQLCOM_SHOW_KEYS),SHOW_LONG}, + {"Com_show_logs", (char*) (com_stat+(uint) SQLCOM_SHOW_LOGS),SHOW_LONG}, + {"Com_show_master_STAT", (char*) (com_stat+(uint) SQLCOM_SHOW_MASTER_STAT),SHOW_LONG}, + {"Com_show_open_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_OPEN_TABLES),SHOW_LONG}, + {"Com_show_processlist", (char*) (com_stat+(uint) SQLCOM_SHOW_PROCESSLIST),SHOW_LONG}, + {"Com_show_slave_stat", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_STAT),SHOW_LONG}, + {"Com_show_status", (char*) (com_stat+(uint) SQLCOM_SHOW_STATUS),SHOW_LONG}, + {"Com_show_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_TABLES),SHOW_LONG}, + {"Com_show_variables", (char*) (com_stat+(uint) SQLCOM_SHOW_VARIABLES),SHOW_LONG}, + {"Com_slave_start", (char*) (com_stat+(uint) SQLCOM_SLAVE_START),SHOW_LONG}, + {"Com_slave_stop", (char*) (com_stat+(uint) SQLCOM_SLAVE_STOP),SHOW_LONG}, + {"Com_truncate", (char*) (com_stat+(uint) SQLCOM_TRUNCATE),SHOW_LONG}, + {"Com_unlock_tables", (char*) (com_stat+(uint) SQLCOM_UNLOCK_TABLES),SHOW_LONG}, + {"Com_update", (char*) (com_stat+(uint) SQLCOM_UPDATE),SHOW_LONG}, {"Connections", (char*) &thread_id, SHOW_LONG_CONST}, {"Created_tmp_disk_tables", (char*) &created_tmp_disk_tables,SHOW_LONG}, {"Created_tmp_tables", (char*) &created_tmp_tables, SHOW_LONG}, diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 8f81af3b548..e70a8902901 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -53,7 +53,8 @@ enum enum_sql_command { SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER, SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE, SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_SHOW_BINLOGS, - SQLCOM_SHOW_OPEN_TABLES + SQLCOM_SHOW_OPEN_TABLES, + SQLCOM_END }; enum lex_states { STATE_START, STATE_CHAR, STATE_IDENT, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 5804060a25a..2f629ec920c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -705,7 +705,6 @@ err: } - /* Execute one command from socket (query or simple command) */ bool do_command(THD *thd) @@ -756,11 +755,13 @@ bool do_command(THD *thd) thd->lex.options=0; // We store status here switch(command) { case COM_INIT_DB: + thread_safe_increment(com_stat[SQLCOM_CHANGE_DB],&LOCK_thread_count); if (!mysql_change_db(thd,packet+1)) mysql_log.write(thd,command,"%s",thd->db); break; case COM_TABLE_DUMP: { + thread_safe_increment(com_other,&LOCK_thread_count); slow_command = TRUE; char* data = packet + 1; uint db_len = *data; @@ -778,6 +779,7 @@ bool do_command(THD *thd) } case COM_CHANGE_USER: { + thread_safe_increment(com_other,&LOCK_thread_count); char *user= (char*) packet+1; char *passwd= strend(user)+1; char *db= strend(passwd)+1; @@ -843,6 +845,7 @@ bool do_command(THD *thd) { char *fields; TABLE_LIST table_list; + thread_safe_increment(com_stat[SQLCOM_SHOW_FIELDS],&LOCK_thread_count); bzero((char*) &table_list,sizeof(table_list)); if (!(table_list.db=thd->db)) { @@ -866,6 +869,7 @@ bool do_command(THD *thd) } #endif case COM_QUIT: + /* We don't calculate statistics for this command */ mysql_log.write(thd,command,NullS); net->error=0; // Don't give 'abort' message error=TRUE; // End server @@ -874,6 +878,7 @@ bool do_command(THD *thd) case COM_CREATE_DB: { char *db=thd->strdup(packet+1); + thread_safe_increment(com_stat[SQLCOM_CREATE_DB],&LOCK_thread_count); // null test to handle EOM if (!db || !stripp_sp(db) || check_db_name(db)) { @@ -889,6 +894,7 @@ bool do_command(THD *thd) case COM_DROP_DB: { char *db=thd->strdup(packet+1); + thread_safe_increment(com_stat[SQLCOM_DROP_DB],&LOCK_thread_count); // null test to handle EOM if (!db || !stripp_sp(db) || check_db_name(db)) { @@ -903,6 +909,7 @@ bool do_command(THD *thd) } case COM_BINLOG_DUMP: { + thread_safe_increment(com_other,&LOCK_thread_count); slow_command = TRUE; if(check_access(thd, FILE_ACL, any_db)) break; @@ -926,6 +933,7 @@ bool do_command(THD *thd) case COM_REFRESH: { uint options=(uchar) packet[1]; + thread_safe_increment(com_stat[SQLCOM_FLUSH],&LOCK_thread_count); if (check_access(thd,RELOAD_ACL,any_db)) break; mysql_log.write(thd,command,NullS); @@ -936,6 +944,7 @@ bool do_command(THD *thd) break; } case COM_SHUTDOWN: + thread_safe_increment(com_other,&LOCK_thread_count); if (check_access(thd,SHUTDOWN_ACL,any_db)) break; /* purecov: inspected */ DBUG_PRINT("quit",("Got shutdown command")); @@ -957,6 +966,7 @@ bool do_command(THD *thd) case COM_STATISTICS: { mysql_log.write(thd,command,NullS); + thread_safe_increment(com_stat[SQLCOM_SHOW_STATUS],&LOCK_thread_count); char buff[200]; ulong uptime = (ulong) (thd->start_time - start_time); sprintf((char*) buff, @@ -975,9 +985,11 @@ bool do_command(THD *thd) break; } case COM_PING: + thread_safe_increment(com_other,&LOCK_thread_count); send_ok(net); // Tell client we are alive break; case COM_PROCESS_INFO: + thread_safe_increment(com_stat[SQLCOM_SHOW_PROCESSLIST],&LOCK_thread_count); if (!thd->priv_user[0] && check_process_priv(thd)) break; mysql_log.write(thd,command,NullS); @@ -986,11 +998,13 @@ bool do_command(THD *thd) break; case COM_PROCESS_KILL: { + thread_safe_increment(com_stat[SQLCOM_KILL],&LOCK_thread_count); ulong id=(ulong) uint4korr(packet+1); kill_one_thread(thd,id); break; } case COM_DEBUG: + thread_safe_increment(com_other,&LOCK_thread_count); if (check_process_priv(thd)) break; /* purecov: inspected */ mysql_print_status(thd); @@ -1062,6 +1076,7 @@ mysql_execute_command(void) // rules have been given and the table list says the query should not be // replicated + thread_safe_increment(com_stat[lex->sql_command],&LOCK_thread_count); switch (lex->sql_command) { case SQLCOM_SELECT: {