summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <gluh@gluh.mysql.r18.ru>2005-01-18 17:37:45 +0300
committerunknown <gluh@gluh.mysql.r18.ru>2005-01-18 17:37:45 +0300
commit0e2a6843ce3122693dcfeb48647326d354e3a2de (patch)
treee112842f05f0473d9cccf131c66f70d24b20cbf0
parentfd48151791a0b671731fe1cc06e11dc6a08cb415 (diff)
downloadmariadb-git-0e2a6843ce3122693dcfeb48647326d354e3a2de.tar.gz
Fix for bug #7981: SHOW GLOBAL STATUS crashes server
-rw-r--r--mysql-test/r/information_schema.result3
-rw-r--r--mysql-test/t/information_schema.test5
-rw-r--r--sql/sql_show.cc42
3 files changed, 20 insertions, 30 deletions
diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result
index bf1f828edf5..9bf4ee28b3b 100644
--- a/mysql-test/r/information_schema.result
+++ b/mysql-test/r/information_schema.result
@@ -676,3 +676,6 @@ variable_name
character_set_database
collation_database
skip_show_database
+show global status like "Threads_running";
+Variable_name Value
+Threads_running 1
diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test
index ac36bbd6014..a4886fd8245 100644
--- a/mysql-test/t/information_schema.test
+++ b/mysql-test/t/information_schema.test
@@ -354,3 +354,8 @@ show open tables where `table` like "user";
show status variable_name where variable_name like "%database%";
# test for 'show variables ... where'
show variables variable_name where variable_name like "%database%";
+
+#
+# Bug #7981:SHOW GLOBAL STATUS crashes server
+#
+show global status like "Threads_running";
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 2aa8a67fbab..843b0422575 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1534,25 +1534,6 @@ static bool show_status_array(THD *thd, const char *wild,
}
-bool mysqld_show(THD *thd, const char *wild, show_var_st *variables,
- enum enum_var_type value_type,
- pthread_mutex_t *mutex,
- struct system_status_var *status_var, TABLE *table)
-{
- DBUG_ENTER("mysqld_show");
- ha_update_statistics(); /* Export engines statistics */
- pthread_mutex_lock(mutex);
- if (show_status_array(thd, wild, variables, value_type, status_var, "", table))
- goto err;
- pthread_mutex_unlock(mutex);
- DBUG_RETURN(FALSE);
-
- err:
- pthread_mutex_unlock(mutex);
- DBUG_RETURN(TRUE);
-}
-
-
/* collect status for all running threads */
void calc_sum_of_all_status(STATUS_VAR *to)
@@ -2874,10 +2855,14 @@ int fill_open_tables(THD *thd, TABLE_LIST *tables, COND *cond)
int fill_variables(THD *thd, TABLE_LIST *tables, COND *cond)
{
DBUG_ENTER("fill_variables");
+ int res= 0;
LEX *lex= thd->lex;
const char *wild= lex->wild ? lex->wild->ptr() : NullS;
- int res= mysqld_show(thd, wild, init_vars, lex->option_type,
- &LOCK_global_system_variables, 0, tables->table);
+ ha_update_statistics(); /* Export engines statistics */
+ pthread_mutex_lock(&LOCK_global_system_variables);
+ res= show_status_array(thd, wild, init_vars,
+ lex->option_type, 0, "", tables->table);
+ pthread_mutex_unlock(&LOCK_global_system_variables);
DBUG_RETURN(res);
}
@@ -2889,17 +2874,14 @@ int fill_status(THD *thd, TABLE_LIST *tables, COND *cond)
const char *wild= lex->wild ? lex->wild->ptr() : NullS;
int res= 0;
STATUS_VAR tmp;
-
+ ha_update_statistics(); /* Export engines statistics */
+ pthread_mutex_lock(&LOCK_status);
if (lex->option_type == OPT_GLOBAL)
- {
- pthread_mutex_lock(&LOCK_status);
calc_sum_of_all_status(&tmp);
- }
- res= mysqld_show(thd, wild, status_vars, OPT_GLOBAL, &LOCK_status,
- (lex->option_type == OPT_GLOBAL ?
- &tmp: &thd->status_var), tables->table);
- if (lex->option_type == OPT_GLOBAL)
- pthread_mutex_unlock(&LOCK_status);
+ res= show_status_array(thd, wild, status_vars, OPT_GLOBAL,
+ (lex->option_type == OPT_GLOBAL ?
+ &tmp: &thd->status_var), "",tables->table);
+ pthread_mutex_unlock(&LOCK_status);
DBUG_RETURN(res);
}