#!!! notice !!!
# Any small change to this file in the main branch
# should be done or reviewed by the maintainer!
-diff -ruN a/include/mysql/plugin.h b/include/mysql/plugin.h
---- a/include/mysql/plugin.h 2010-12-03 20:58:24.000000000 +0300
-+++ b/include/mysql/plugin.h 2010-12-31 06:06:43.000000000 +0300
-@@ -547,6 +547,9 @@
+--- a/include/mysql/plugin.h
++++ b/include/mysql/plugin.h
+@@ -556,6 +556,9 @@
unsigned long thd_log_slow_verbosity(const MYSQL_THD thd);
int thd_opt_slow_log();
#define EXTENDED_SLOWLOG
/**
Create a temporary file.
-diff -ruN a/include/mysql_com.h b/include/mysql_com.h
---- a/include/mysql_com.h 2010-12-03 20:58:24.000000000 +0300
-+++ b/include/mysql_com.h 2010-12-31 06:12:05.000000000 +0300
+--- a/include/mysql_com.h
++++ b/include/mysql_com.h
@@ -31,6 +31,7 @@
#define SERVER_VERSION_LENGTH 60
/*
Maximum length of comments
-@@ -142,6 +143,11 @@
+@@ -146,6 +147,11 @@
#define REFRESH_DES_KEY_FILE 0x40000L
#define REFRESH_USER_RESOURCES 0x80000L
#define REFRESH_QUERY_RESPONSE_TIME 0x100000L /* response time distibution */
#define CLIENT_LONG_PASSWORD 1 /* new more secure passwords */
#define CLIENT_FOUND_ROWS 2 /* Found instead of affected rows */
-diff -ruN a/patch_info/userstats.patch b/patch_info/userstats.patch
---- a/patch_info/userstats.patch 1970-01-01 03:00:00.000000000 +0300
-+++ b/patch_info/userstats.patch 2010-12-30 00:45:46.000000000 +0300
-@@ -0,0 +1,15 @@
+--- /dev/null
++++ b/patch_info/userstats.patch
+@@ -0,0 +1,17 @@
+File=userstats.patch
+Name=SHOW USER/TABLE/INDEX statistics
+Version=V2
+YK: fix behavior for prepared statements
+
+2008-11-26
-+YK: add switch variable "userstat_running" to control INFORMATION_SCHEMA.*_STATISTICS (default:OFF)
++YK: add switch variable "userstat" to control INFORMATION_SCHEMA.*_STATISTICS (default:OFF)
+2010-12-31
+Ported to 5.5.8
+2011-1-5
+Fix porting
-diff -ruN a/sql/handler.cc b/sql/handler.cc
---- a/sql/handler.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/handler.cc 2010-12-30 00:59:23.000000000 +0300
-@@ -1239,6 +1239,8 @@
- if (cookie)
- tc_log->unlog(cookie, xid);
++2011-02
++Rename variable USERSTAT_RUNNING => USERSTAT
+--- a/sql/handler.cc
++++ b/sql/handler.cc
+@@ -1245,6 +1245,8 @@
+ goto end;
+ }
DBUG_EXECUTE_IF("crash_commit_after", DBUG_SUICIDE(););
+ if (is_real_trans)
+ thd->diff_commit_trans++;
RUN_HOOK(transaction, after_commit, (thd, FALSE));
end:
if (rw_trans && mdl_request.ticket)
-@@ -1393,6 +1395,8 @@
+@@ -1399,6 +1401,8 @@
/* Always cleanup. Even if nht==0. There may be savepoints. */
if (is_real_trans)
thd->transaction.cleanup();
if (all)
thd->transaction_rollback_request= FALSE;
-@@ -1796,6 +1800,7 @@
+@@ -1803,6 +1807,7 @@
ha_info->reset(); /* keep it conveniently zero-filled */
}
trans->ha_list= sv->ha_list;
DBUG_RETURN(error);
}
-@@ -2165,6 +2170,8 @@
+@@ -2179,6 +2184,8 @@
dup_ref=ref+ALIGN_SIZE(ref_length);
cached_table_flags= table_flags();
}
DBUG_RETURN(error);
}
-@@ -3596,6 +3603,127 @@
+@@ -3644,6 +3651,127 @@
return;
}
+// Updates the global table stats with the TABLE this handler represents.
+void handler::update_global_table_stats()
+{
-+ if (!opt_userstat_running)
++ if (!opt_userstat)
+ {
+ rows_read= rows_changed= 0;
+ return;
+ if (!table->s || !table->s->table_cache_key.str || !table->s->table_name.str)
+ return;
+
-+ if (!opt_userstat_running)
++ if (!opt_userstat)
+ {
+ for (uint x= 0; x < table->s->keys; ++x)
+ {
/****************************************************************************
** Some general functions that isn't in the handler class
-diff -ruN a/sql/handler.h b/sql/handler.h
---- a/sql/handler.h 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/handler.h 2010-12-31 05:10:00.000000000 +0300
-@@ -33,6 +33,10 @@
+--- a/sql/handler.h
++++ b/sql/handler.h
+@@ -36,6 +36,10 @@
#include <ft_global.h>
#include <keycache.h>
// the following is for checking tables
#define HA_ADMIN_ALREADY_DONE 1
-@@ -561,10 +565,12 @@
+@@ -562,10 +566,12 @@
enum enum_schema_tables
{
SCH_CHARSETS= 0,
SCH_ENGINES,
SCH_EVENTS,
SCH_FILES,
-@@ -592,9 +598,12 @@
+@@ -593,9 +599,12 @@
SCH_TABLE_CONSTRAINTS,
SCH_TABLE_NAMES,
SCH_TABLE_PRIVILEGES,
SCH_VARIABLES,
SCH_VIEWS
};
-@@ -1209,6 +1218,9 @@
+@@ -1233,6 +1242,9 @@
bool locked;
bool implicit_emptied; /* Can be !=0 only if HEAP */
const COND *pushed_cond;
/**
next_insert_id is the next value which should be inserted into the
auto_increment column: in a inserting-multi-row statement (like INSERT
-@@ -1260,10 +1272,12 @@
+@@ -1284,10 +1296,12 @@
ref_length(sizeof(my_off_t)),
ft_handler(0), inited(NONE),
locked(FALSE), implicit_emptied(0),
virtual ~handler(void)
{
DBUG_ASSERT(locked == FALSE);
-@@ -1386,6 +1400,8 @@
+@@ -1410,6 +1424,8 @@
{
table= table_arg;
table_share= share;
}
virtual double scan_time()
{ return ulonglong2double(stats.data_file_length) / IO_SIZE + 2; }
-@@ -1753,6 +1769,8 @@
+@@ -1805,6 +1821,8 @@
virtual bool is_crashed() const { return 0; }
virtual bool auto_repair() const { return 0; }
#define CHF_CREATE_FLAG 0
#define CHF_DELETE_FLAG 1
-diff -ruN a/sql/lex.h b/sql/lex.h
---- a/sql/lex.h 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/lex.h 2010-12-30 01:25:40.000000000 +0300
+--- a/sql/lex.h
++++ b/sql/lex.h
@@ -111,6 +111,7 @@
{ "CIPHER", SYM(CIPHER_SYM)},
{ "CLASS_ORIGIN", SYM(CLASS_ORIGIN_SYM)},
{ "USE_FRM", SYM(USE_FRM)},
{ "USING", SYM(USING)},
{ "UTC_DATE", SYM(UTC_DATE_SYM)},
-diff -ruN a/sql/log.cc b/sql/log.cc
---- a/sql/log.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/log.cc 2010-12-30 01:55:35.000000000 +0300
-@@ -922,6 +922,13 @@
+--- a/sql/log.cc
++++ b/sql/log.cc
+@@ -1007,6 +1007,13 @@
mysql_slow_log.reopen_file();
}
/*
Log error with all enabled log event handlers
-@@ -4843,6 +4850,8 @@
+@@ -5062,6 +5069,8 @@
thd->first_successful_insert_id_in_prev_stmt_for_binlog);
if (e.write(file))
goto err;
}
if (thd->auto_inc_intervals_in_cur_stmt_for_binlog.nb_elements() > 0)
{
-@@ -4854,12 +4863,16 @@
+@@ -5073,12 +5082,16 @@
minimum());
if (e.write(file))
goto err;
}
if (thd->user_var_events.elements)
{
-@@ -4882,6 +4895,8 @@
+@@ -5101,6 +5114,8 @@
flags);
if (e.write(file))
goto err;
}
}
}
-@@ -4893,6 +4908,8 @@
+@@ -5112,6 +5127,8 @@
if (event_info->write(file) ||
DBUG_EVALUATE_IF("injecting_fault_writing", 1, 0))
goto err;
+ thd->binlog_bytes_written+= event_info->data_written;
error= 0;
-
-@@ -5056,7 +5073,8 @@
+ err:
+@@ -5346,7 +5363,8 @@
be reset as a READ_CACHE to be able to read the contents from it.
*/
{
Mutex_sentry sentry(lock_log ? &LOCK_log : NULL);
-@@ -5103,6 +5121,7 @@
+@@ -5393,6 +5411,7 @@
/* write the first half of the split header */
if (my_b_write(&log_file, header, carry))
return ER_ERROR_ON_WRITE;
/*
copy fixed second half of header to cache so the correct
-@@ -5171,6 +5190,7 @@
+@@ -5461,6 +5480,7 @@
/* Write data to the binary log file */
if (my_b_write(&log_file, cache->read_pos, length))
return ER_ERROR_ON_WRITE;
cache->read_pos=cache->read_end; // Mark buffer used up
} while ((length= my_b_fill(cache)));
-@@ -5281,20 +5301,23 @@
+@@ -5584,20 +5604,23 @@
Query_log_event qinfo(thd, STRING_WITH_LEN("BEGIN"), TRUE, FALSE, TRUE, 0);
if (qinfo.write(&log_file))
goto err;
if (incident && write_incident(thd, FALSE))
goto err;
-diff -ruN a/sql/log.h b/sql/log.h
---- a/sql/log.h 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/log.h 2010-12-30 01:56:04.000000000 +0300
-@@ -414,7 +414,8 @@
+--- a/sql/log.h
++++ b/sql/log.h
+@@ -437,7 +437,8 @@
bool write(THD *thd, IO_CACHE *cache, Log_event *commit_event, bool incident);
bool write_incident(THD *thd, bool lock);
- int write_cache(IO_CACHE *cache, bool lock_log, bool flush_and_sync);
+ int write_cache(THD *thd, IO_CACHE *cache,
+ bool lock_log, bool flush_and_sync);
- void set_write_error(THD *thd);
+ void set_write_error(THD *thd, bool is_transactional);
bool check_write_error(THD *thd);
-@@ -566,6 +567,7 @@
+@@ -591,6 +592,7 @@
const char *sql_text, uint sql_text_len,
CHARSET_INFO *client_cs);
void flush();
void init_pthread_objects();
MYSQL_QUERY_LOG *get_mysql_slow_log() { return &mysql_slow_log; }
MYSQL_QUERY_LOG *get_mysql_log() { return &mysql_log; }
-diff -ruN a/sql/mysqld.cc b/sql/mysqld.cc
---- a/sql/mysqld.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/mysqld.cc 2010-12-30 02:04:50.000000000 +0300
-@@ -438,6 +438,7 @@
- uint opt_debug_sync_timeout= 0;
+--- a/sql/mysqld.cc
++++ b/sql/mysqld.cc
+@@ -445,6 +445,7 @@
+ MYSQL_PLUGIN_IMPORT uint opt_debug_sync_timeout= 0;
#endif /* defined(ENABLED_DEBUG_SYNC) */
my_bool opt_old_style_user_limits= 0, trust_function_creators= 0;
-+my_bool opt_userstat_running= 0, opt_thread_statistics= 0;
++my_bool opt_userstat= 0, opt_thread_statistics= 0;
my_bool opt_optimizer_fix= 0;
/*
True if there is at least one per-hour limit for some user, so we should
-@@ -486,6 +487,7 @@
- ulong specialflag=0;
+@@ -496,6 +497,7 @@
ulong binlog_cache_use= 0, binlog_cache_disk_use= 0;
+ ulong binlog_stmt_cache_use= 0, binlog_stmt_cache_disk_use= 0;
ulong max_connections, max_connect_errors;
+ulonglong denied_connections= 0;
/* flashcache */
int cachedev_fd;
-@@ -630,7 +632,9 @@
+@@ -645,7 +647,9 @@
LOCK_crypt,
LOCK_global_system_variables,
LOCK_user_conn, LOCK_slave_list, LOCK_active_mi,
/**
The below lock protects access to two global server variables:
max_prepared_stmt_count and prepared_stmt_count. These variables
-@@ -1490,6 +1494,11 @@
+@@ -1509,6 +1513,11 @@
#ifdef HAVE_RESPONSE_TIME_DISTRIBUTION
query_response_time_free();
#endif // HAVE_RESPONSE_TIME_DISTRIBUTION
#ifdef HAVE_REPLICATION
end_slave_list();
#endif
-@@ -1593,6 +1602,10 @@
+@@ -1612,6 +1621,10 @@
mysql_cond_destroy(&COND_thread_cache);
mysql_cond_destroy(&COND_flush_thread_cache);
mysql_cond_destroy(&COND_manager);
}
#endif /*EMBEDDED_LIBRARY*/
-@@ -3024,6 +3037,7 @@
+@@ -2938,6 +2951,7 @@
{"show_binlog_events", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_BINLOG_EVENTS]), SHOW_LONG_STATUS},
{"show_binlogs", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_BINLOGS]), SHOW_LONG_STATUS},
{"show_charsets", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CHARSETS]), SHOW_LONG_STATUS},
{"show_collations", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_COLLATIONS]), SHOW_LONG_STATUS},
{"show_contributors", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CONTRIBUTORS]), SHOW_LONG_STATUS},
{"show_create_db", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CREATE_DB]), SHOW_LONG_STATUS},
-@@ -3044,6 +3058,7 @@
+@@ -2958,6 +2972,7 @@
#endif
{"show_function_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STATUS_FUNC]), SHOW_LONG_STATUS},
{"show_grants", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_GRANTS]), SHOW_LONG_STATUS},
+ {"show_index_statistics",(char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_INDEX_STATS]), SHOW_LONG_STATUS},
{"show_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_KEYS]), SHOW_LONG_STATUS},
{"show_master_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_MASTER_STAT]), SHOW_LONG_STATUS},
- {"show_new_master", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_NEW_MASTER]), SHOW_LONG_STATUS},
-@@ -3063,10 +3078,13 @@
+ {"show_open_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_OPEN_TABLES]), SHOW_LONG_STATUS},
+@@ -2976,10 +2991,13 @@
{"show_slave_status_nolock", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_SLAVE_NOLOCK_STAT]), SHOW_LONG_STATUS},
{"show_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STATUS]), SHOW_LONG_STATUS},
{"show_storage_engines", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STORAGE_ENGINES]), SHOW_LONG_STATUS},
{"show_variables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_VARIABLES]), SHOW_LONG_STATUS},
{"show_warnings", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_WARNS]), SHOW_LONG_STATUS},
{"slave_start", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SLAVE_START]), SHOW_LONG_STATUS},
-@@ -3587,6 +3605,13 @@
+@@ -3517,6 +3535,13 @@
mysql_mutex_init(key_LOCK_server_started,
&LOCK_server_started, MY_MUTEX_INIT_FAST);
mysql_cond_init(key_COND_server_started, &COND_server_started, NULL);
sp_cache_init();
#ifdef HAVE_EVENT_SCHEDULER
Events::init_mutexes();
-@@ -3956,6 +3981,9 @@
+@@ -3886,6 +3911,9 @@
query_response_time_init();
#endif // HAVE_RESPONSE_TIME_DISTRIBUTION
/* We have to initialize the storage engines before CSV logging */
if (ha_init())
{
sql_print_error("Can't init databases");
-@@ -4092,6 +4120,9 @@
+@@ -4022,6 +4050,9 @@
init_max_user_conn();
init_update_queries();
DBUG_RETURN(0);
}
-@@ -5123,6 +5154,7 @@
+@@ -5087,6 +5118,7 @@
{
sql_print_warning("%s", ER_DEFAULT(ER_CON_COUNT_ERROR));
}
delete thd;
DBUG_VOID_RETURN;
}
-@@ -7820,6 +7852,8 @@
+@@ -7825,6 +7857,8 @@
key_delayed_insert_mutex, key_hash_filo_lock, key_LOCK_active_mi,
key_LOCK_connection_count, key_LOCK_crypt, key_LOCK_delayed_create,
key_LOCK_delayed_insert, key_LOCK_delayed_status, key_LOCK_error_log,
key_LOCK_gdl, key_LOCK_global_system_variables,
key_LOCK_manager,
key_LOCK_prepared_stmt_count,
-@@ -7857,6 +7891,13 @@
+@@ -7864,6 +7898,13 @@
{ &key_LOCK_delayed_insert, "LOCK_delayed_insert", PSI_FLAG_GLOBAL},
{ &key_LOCK_delayed_status, "LOCK_delayed_status", PSI_FLAG_GLOBAL},
{ &key_LOCK_error_log, "LOCK_error_log", PSI_FLAG_GLOBAL},
{ &key_LOCK_gdl, "LOCK_gdl", PSI_FLAG_GLOBAL},
{ &key_LOCK_global_system_variables, "LOCK_global_system_variables", PSI_FLAG_GLOBAL},
{ &key_LOCK_manager, "LOCK_manager", PSI_FLAG_GLOBAL},
-diff -ruN a/sql/mysqld.h b/sql/mysqld.h
---- a/sql/mysqld.h 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/mysqld.h 2010-12-31 06:04:59.000000000 +0300
+--- a/sql/mysqld.h
++++ b/sql/mysqld.h
@@ -23,6 +23,7 @@
#include "my_atomic.h" /* my_atomic_rwlock_t */
#include "mysql/psi/mysql_file.h" /* MYSQL_FILE */
extern ulonglong slave_type_conversions_options;
extern my_bool read_only, opt_readonly;
extern my_bool lower_case_file_system;
-+extern my_bool opt_userstat_running, opt_thread_statistics;
++extern my_bool opt_userstat, opt_thread_statistics;
extern my_bool opt_optimizer_fix;
extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs;
extern my_bool opt_secure_auth;
-@@ -180,6 +182,7 @@
+@@ -183,6 +185,7 @@
extern ulong slave_trans_retries;
extern uint slave_net_timeout;
extern uint max_user_connections;
+extern ulonglong denied_connections;
extern ulong what_to_log,flush_time;
extern ulong max_prepared_stmt_count, prepared_stmt_count;
- extern ulong binlog_cache_size, open_files_limit;
-@@ -205,6 +208,11 @@
+ extern ulong open_files_limit;
+@@ -210,6 +213,11 @@
extern struct system_variables max_system_variables;
extern struct system_status_var global_status_var;
extern struct rand_struct sql_rand;
extern const char *opt_date_time_formats[];
extern handlerton *partition_hton;
extern handlerton *myisam_hton;
-@@ -242,6 +250,8 @@
+@@ -252,6 +260,8 @@
key_delayed_insert_mutex, key_hash_filo_lock, key_LOCK_active_mi,
key_LOCK_connection_count, key_LOCK_crypt, key_LOCK_delayed_create,
key_LOCK_delayed_insert, key_LOCK_delayed_status, key_LOCK_error_log,
key_LOCK_gdl, key_LOCK_global_system_variables,
key_LOCK_logger, key_LOCK_manager,
key_LOCK_prepared_stmt_count,
-@@ -338,7 +348,9 @@
+@@ -351,7 +361,9 @@
LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone,
LOCK_slave_list, LOCK_active_mi, LOCK_manager,
LOCK_global_system_variables, LOCK_user_conn,
extern MYSQL_PLUGIN_IMPORT mysql_mutex_t LOCK_thread_count;
#ifdef HAVE_OPENSSL
extern mysql_mutex_t LOCK_des_key_file;
-@@ -450,6 +462,16 @@
+@@ -463,6 +475,16 @@
return id;
}
/*
TODO: Replace this with an inline function.
-diff -ruN a/sql/sql_base.cc b/sql/sql_base.cc
---- a/sql/sql_base.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_base.cc 2010-12-30 02:33:17.000000000 +0300
-@@ -1524,6 +1524,11 @@
+--- a/sql/sql_base.cc
++++ b/sql/sql_base.cc
+@@ -1587,6 +1587,11 @@
table->mdl_ticket= NULL;
mysql_mutex_lock(&thd->LOCK_thd_data);
*table_ptr=table->next;
mysql_mutex_unlock(&thd->LOCK_thd_data);
-@@ -2149,6 +2154,8 @@
+@@ -2225,6 +2230,8 @@
DBUG_PRINT("tmptable", ("closing table: '%s'.'%s'",
table->s->db.str, table->s->table_name.str));
free_io_cache(table);
closefrm(table, 0);
if (delete_table)
-diff -ruN a/sql/sql_class.cc b/sql/sql_class.cc
---- a/sql/sql_class.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_class.cc 2010-12-30 02:41:40.000000000 +0300
-@@ -601,6 +601,13 @@
+--- a/sql/sql_class.cc
++++ b/sql/sql_class.cc
+@@ -978,6 +978,13 @@
mysys_var=0;
binlog_evt_union.do_union= FALSE;
enable_slow_log= 0;
#ifndef DBUG_OFF
dbug_sentry=THD_SENTRY_MAGIC;
#endif
-@@ -981,6 +988,7 @@
+@@ -1357,6 +1364,7 @@
variables.option_bits|= OPTION_BIN_LOG;
else
variables.option_bits&= ~OPTION_BIN_LOG;
#if defined(ENABLED_DEBUG_SYNC)
/* Initialize the Debug Sync Facility. See debug_sync.cc. */
-@@ -988,6 +996,94 @@
- #endif /* defined(ENABLED_DEBUG_SYNC) */
+@@ -1366,6 +1374,94 @@
+ clear_slow_extended();
}
+// Resets stats in a THD.
+// Updates 'diff' stats of a THD.
+void THD::update_stats(bool ran_command)
+{
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+ diff_total_busy_time+= busy_time;
+ diff_total_cpu_time+= cpu_time;
/*
Init THD for query processing.
-@@ -1688,6 +1784,32 @@
+@@ -2125,6 +2221,32 @@
}
#endif
struct Item_change_record: public ilink
{
-@@ -1864,6 +1986,7 @@
+@@ -2301,6 +2423,7 @@
}
thd->sent_row_count++;
if (thd->vio_ok())
DBUG_RETURN(protocol->write());
-@@ -1956,6 +2079,7 @@
+@@ -2393,6 +2516,7 @@
select_export::~select_export()
{
thd->sent_row_count=row_count;
}
-@@ -2979,6 +3103,7 @@
+@@ -3416,6 +3540,7 @@
if (likely(thd != 0))
{ /* current_thd==0 when close_connection() calls net_send_error() */
thd->status_var.bytes_sent+= length;
}
}
-@@ -2986,6 +3111,7 @@
+@@ -3423,6 +3548,7 @@
void thd_increment_bytes_received(ulong length)
{
current_thd->status_var.bytes_received+= length;
}
-diff -ruN a/sql/sql_class.h b/sql/sql_class.h
---- a/sql/sql_class.h 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_class.h 2010-12-31 05:15:57.000000000 +0300
-@@ -1610,6 +1610,8 @@
+--- a/sql/sql_class.h
++++ b/sql/sql_class.h
+@@ -1705,6 +1705,8 @@
*/
enum enum_server_command command;
uint32 server_id;
uint32 file_id; // for LOAD DATA INFILE
/* remote (peer) port */
uint16 peer_port;
-@@ -2081,6 +2083,8 @@
+@@ -2214,6 +2216,8 @@
*/
enum_tx_isolation tx_isolation;
enum_check_fields count_cuted_fields;
DYNAMIC_ARRAY user_var_events; /* For user variables replication */
MEM_ROOT *user_var_events_alloc; /* Allocate above array elements here */
-@@ -2176,6 +2180,49 @@
+@@ -2308,6 +2312,49 @@
*/
LOG_INFO* current_linfo;
NET* slave_net; // network connection from slave -> m.
/* Used by the sys_var class to store temporary values */
union
{
-@@ -2256,6 +2303,11 @@
+@@ -2388,6 +2435,11 @@
alloc_root.
*/
void init_for_queries();
void change_user(void);
void cleanup(void);
void cleanup_after_query();
-@@ -2726,6 +2778,15 @@
+@@ -2860,6 +2912,15 @@
}
thd_scheduler scheduler;
public:
inline Internal_error_handler *get_internal_handler()
{ return m_internal_handler; }
-@@ -2913,6 +2974,10 @@
+@@ -3060,6 +3121,10 @@
LEX_STRING invoker_host;
};
/** A short cut for thd->stmt_da->set_ok_status(). */
-diff -ruN a/sql/sql_connect.cc b/sql/sql_connect.cc
---- a/sql/sql_connect.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_connect.cc 2010-12-31 03:53:28.000000000 +0300
-@@ -55,6 +55,24 @@
+--- a/sql/sql_connect.cc
++++ b/sql/sql_connect.cc
+@@ -56,6 +56,24 @@
#define MIN_HANDSHAKE_SIZE 6
#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */
/*
Get structure for logging connection data for the current user
*/
-@@ -112,6 +130,586 @@
+@@ -113,6 +131,586 @@
}
+ const char* client_string= get_client_host(thd);
+ int return_value= 0;
+
-+ if (!opt_userstat_running)
++ if (!opt_userstat)
+ return return_value;
+
+ if (use_lock)
+// Updates the global stats of a user or client
+void update_global_user_stats(THD* thd, bool create_user, time_t now)
+{
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+ char* user_string= get_valid_user_string(thd->main_security_ctx.user);
+ const char* client_string= get_client_host(thd);
/*
check if user has already too many connections
-@@ -169,6 +767,7 @@
+@@ -170,6 +768,7 @@
if (error)
{
uc->connections--; // no need for decrease_user_connections() here
/*
The thread may returned back to the pool and assigned to a user
that doesn't have a limit. Ensure the user is not using resources
-@@ -565,11 +1164,18 @@
+@@ -589,11 +1188,18 @@
my_sleep(1000); /* must wait after eof() */
#endif
statistic_increment(aborted_connects,&LOCK_status);
DBUG_RETURN(0);
}
-@@ -599,6 +1205,7 @@
+@@ -623,6 +1229,7 @@
if (thd->killed || (net->error && net->vio != 0))
{
statistic_increment(aborted_threads,&LOCK_status);
}
if (net->error && net->vio != 0)
-@@ -728,10 +1335,14 @@
+@@ -787,10 +1394,14 @@
for (;;)
{
- NET *net= &thd->net;
+ bool rc;
+ bool create_user= TRUE;
- lex_start(thd);
- if (login_connection(thd))
+ rc= thd_prepare_connection(thd);
+ if (rc)
+ {
+ create_user= FALSE;
goto end_thread;
+ }
- MYSQL_CONNECTION_START(thd->thread_id, thd->security_ctx->priv_user,
- (char *) thd->security_ctx->host_or_ip);
-@@ -758,6 +1369,8 @@
+ while (thd_is_connection_alive(thd))
+ {
+@@ -802,6 +1413,8 @@
end_thread:
- close_connection(thd, 0, 1);
+ close_connection(thd);
+ thd->update_stats(false);
+ update_global_user_stats(thd, create_user, time(NULL));
if (MYSQL_CALLBACK_ELSE(thread_scheduler, end_thread, (thd, 1), 0))
return; // Probably no-threads
-diff -ruN a/sql/sql_delete.cc b/sql/sql_delete.cc
---- a/sql/sql_delete.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_delete.cc 2010-12-31 03:58:22.000000000 +0300
+--- a/sql/sql_delete.cc
++++ b/sql/sql_delete.cc
@@ -411,6 +411,7 @@
my_ok(thd, deleted);
DBUG_PRINT("info",("%ld records deleted",(long) deleted));
return 0;
}
-diff -ruN a/sql/sql_insert.cc b/sql/sql_insert.cc
---- a/sql/sql_insert.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_insert.cc 2010-12-31 04:12:35.000000000 +0300
-@@ -1073,13 +1073,14 @@
+--- a/sql/sql_insert.cc
++++ b/sql/sql_insert.cc
+@@ -1072,13 +1072,14 @@
if (error)
goto abort;
}
else
{
-@@ -1095,8 +1096,10 @@
+@@ -1094,8 +1095,10 @@
sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records,
(ulong) (info.deleted + updated),
(ulong) thd->warning_info->statement_warn_count());
thd->abort_on_warning= 0;
DBUG_RETURN(FALSE);
-@@ -3585,6 +3588,7 @@
+@@ -3540,6 +3543,7 @@
thd->first_successful_insert_id_in_prev_stmt :
(info.copied ? autoinc_value_of_last_inserted_row : 0));
::my_ok(thd, row_count, id, buff);
DBUG_RETURN(0);
}
-diff -ruN a/sql/sql_lex.h b/sql/sql_lex.h
---- a/sql/sql_lex.h 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_lex.h 2010-12-31 05:07:18.000000000 +0300
-@@ -196,6 +196,9 @@
- When a command is added here, be sure it's also added in mysqld.cc
+--- a/sql/sql_lex.h
++++ b/sql/sql_lex.h
+@@ -197,6 +197,9 @@
in "struct show_var_st status_vars[]= {" ...
*/
+ SQLCOM_SHOW_TEMPORARY_TABLES,
+ // TODO(mcallaghan): update status_vars in mysqld to export these
+ SQLCOM_SHOW_USER_STATS, SQLCOM_SHOW_TABLE_STATS, SQLCOM_SHOW_INDEX_STATS,
+ SQLCOM_SHOW_CLIENT_STATS, SQLCOM_SHOW_THREAD_STATS,
/* This should be the last !!! */
SQLCOM_END
};
-diff -ruN a/sql/sql_parse.cc b/sql/sql_parse.cc
---- a/sql/sql_parse.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_parse.cc 2010-12-31 04:57:45.000000000 +0300
-@@ -116,6 +116,9 @@
- static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables);
+--- a/sql/sql_parse.cc
++++ b/sql/sql_parse.cc
+@@ -117,6 +117,9 @@
static void sql_kill(THD *thd, ulong id, bool only_kill_query);
+ static inline ulonglong get_query_exec_time(THD *thd, ulonglong cur_utime);
+// Uses the THD to update the global stats by user name and client IP
+void update_global_user_stats(THD* thd, bool create_user, time_t now);
const char *any_db="*any*"; // Special symbol for check_access
const LEX_STRING command_name[]={
-@@ -701,6 +704,12 @@
+@@ -703,6 +706,12 @@
*/
thd->clear_error(); // Clear error message
thd->stmt_da->reset_diagnostics_area();
net_new_transaction(net);
-@@ -886,6 +895,10 @@
+@@ -888,6 +897,10 @@
(char *) thd->security_ctx->host_or_ip);
thd->command=command;
/*
Commands which always take a long time are logged into
the slow log only if opt_log_slow_admin_statements is set.
-@@ -1619,6 +1632,13 @@
+@@ -1683,6 +1696,13 @@
thd->profiling.discard_current_query();
#endif
break;
case SCH_OPEN_TABLES:
case SCH_VARIABLES:
case SCH_STATUS:
-@@ -1776,6 +1796,7 @@
+@@ -1857,6 +1877,7 @@
thd->security_ctx->priv_host)) &&
check_global_access(thd, SUPER_ACL))
{
my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER");
DBUG_RETURN(TRUE);
}
-@@ -4705,6 +4726,7 @@
+@@ -4892,6 +4913,7 @@
case ACL_INTERNAL_ACCESS_DENIED:
if (! no_errors)
{
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
sctx->priv_user, sctx->priv_host, db);
}
-@@ -4755,6 +4777,7 @@
+@@ -4942,6 +4964,7 @@
DBUG_PRINT("error",("No possible access"));
if (!no_errors)
{
if (thd->password == 2)
my_error(ER_ACCESS_DENIED_NO_PASSWORD_ERROR, MYF(0),
sctx->priv_user,
-@@ -4871,6 +4894,7 @@
+@@ -5058,6 +5081,7 @@
if (!thd->col_access && check_grant_db(thd, dst_db_name))
{
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
thd->security_ctx->priv_user,
thd->security_ctx->priv_host,
-@@ -5141,6 +5165,7 @@
+@@ -5328,6 +5352,7 @@
if ((thd->security_ctx->master_access & want_access))
return 0;
get_privilege_desc(command, sizeof(command), want_access);
my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), command);
return 1;
#else
-@@ -5529,6 +5554,32 @@
+@@ -5695,6 +5720,32 @@
lex_start(thd);
mysql_reset_thd_for_next_command(thd);
+ double start_cpu_nsecs= 0;
+ double end_cpu_nsecs= 0;
+
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+#ifdef HAVE_CLOCK_GETTIME
+ /* get start cputime */
if (query_cache_send_result_to_client(thd, rawbuf, length) <= 0)
{
LEX *lex= thd->lex;
-@@ -5597,6 +5648,52 @@
+@@ -5763,6 +5814,52 @@
DBUG_ASSERT(thd->change_list.is_empty());
}
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+ // Gets the end time.
+ if (!(end_time_error= gettimeofday(&end_time, NULL)))
DBUG_VOID_RETURN;
}
-diff -ruN a/sql/sql_prepare.cc b/sql/sql_prepare.cc
---- a/sql/sql_prepare.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_prepare.cc 2010-12-31 04:25:04.000000000 +0300
+--- a/sql/sql_prepare.cc
++++ b/sql/sql_prepare.cc
@@ -114,6 +114,9 @@
#endif
#include "lock.h" // MYSQL_OPEN_FORCE_SHARED_MDL
+ double start_cpu_nsecs= 0;
+ double end_cpu_nsecs= 0;
+
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+#ifdef HAVE_CLOCK_GETTIME
+ /* get start cputime */
/* check_prepared_statemnt sends the metadata packet in case of success */
+end:
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+ // Gets the end time.
+ if (!(end_time_error= gettimeofday(&end_time, NULL)))
DBUG_VOID_RETURN;
}
-@@ -2553,12 +2629,38 @@
+@@ -2540,12 +2616,38 @@
/* First of all clear possible warnings from the previous command */
mysql_reset_thd_for_next_command(thd);
+ double start_cpu_nsecs= 0;
+ double end_cpu_nsecs= 0;
+
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+#ifdef HAVE_CLOCK_GETTIME
+ /* get start cputime */
if (!(stmt= find_prepared_statement(thd, stmt_id)))
{
char llbuf[22];
- my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), sizeof(llbuf),
+ my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), static_cast<int>(sizeof(llbuf)),
llstr(stmt_id, llbuf), "mysqld_stmt_execute");
- DBUG_VOID_RETURN;
+ goto end;
}
#if defined(ENABLED_PROFILING)
-@@ -2576,6 +2678,53 @@
+@@ -2563,6 +2665,53 @@
/* Close connection socket; for use with client testing (Bug#43560). */
DBUG_EXECUTE_IF("close_conn_after_stmt_execute", vio_close(thd->net.vio););
+end:
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+ // Gets the end time.
+ if (!(end_time_error= gettimeofday(&end_time, NULL)))
DBUG_VOID_RETURN;
}
-@@ -2648,20 +2797,47 @@
+@@ -2635,20 +2784,47 @@
/* First of all clear possible warnings from the previous command */
mysql_reset_thd_for_next_command(thd);
+ double start_cpu_nsecs= 0;
+ double end_cpu_nsecs= 0;
+
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+#ifdef HAVE_CLOCK_GETTIME
+ /* get start cputime */
if (!(stmt= find_prepared_statement(thd, stmt_id)))
{
char llbuf[22];
- my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), sizeof(llbuf),
+ my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), static_cast<int>(sizeof(llbuf)),
llstr(stmt_id, llbuf), "mysqld_stmt_fetch");
- DBUG_VOID_RETURN;
+ goto end;
}
thd->stmt_arena= stmt;
-@@ -2678,6 +2854,52 @@
+@@ -2665,6 +2841,52 @@
thd->restore_backup_statement(stmt, &stmt_backup);
thd->stmt_arena= thd;
+end:
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+ // Gets the end time.
+ if (!(end_time_error = gettimeofday(&end_time, NULL)))
DBUG_VOID_RETURN;
}
-@@ -2708,13 +2930,39 @@
+@@ -2695,13 +2917,39 @@
/* First of all clear possible warnings from the previous command */
mysql_reset_thd_for_next_command(thd);
+ double start_cpu_nsecs= 0;
+ double end_cpu_nsecs= 0;
+
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+#ifdef HAVE_CLOCK_GETTIME
+ /* get start cputime */
if (!(stmt= find_prepared_statement(thd, stmt_id)))
{
char llbuf[22];
- my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), sizeof(llbuf),
+ my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), static_cast<int>(sizeof(llbuf)),
llstr(stmt_id, llbuf), "mysqld_stmt_reset");
- DBUG_VOID_RETURN;
+ goto end;
}
stmt->close_cursor();
-@@ -2731,6 +2979,53 @@
+@@ -2718,6 +2966,53 @@
my_ok(thd);
+end:
-+ if (opt_userstat_running)
++ if (opt_userstat)
+ {
+ // Gets the end time.
+ if (!(end_time_error = gettimeofday(&end_time, NULL)))
DBUG_VOID_RETURN;
}
-diff -ruN a/sql/sql_reload.cc b/sql/sql_reload.cc
---- a/sql/sql_reload.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_reload.cc 2010-12-31 05:00:59.000000000 +0300
-@@ -272,14 +272,48 @@
+--- a/sql/sql_reload.cc
++++ b/sql/sql_reload.cc
+@@ -320,14 +320,48 @@
mysql_mutex_unlock(&LOCK_active_mi);
}
#endif
+ }
+ mysql_mutex_unlock(&LOCK_global_user_client_stats);
+ }
- *write_to_binlog= tmp_write_to_binlog;
+ if (*write_to_binlog != -1)
+ *write_to_binlog= tmp_write_to_binlog;
/*
- If the query was killed then this function must fail.
-diff -ruN a/sql/sql_show.cc b/sql/sql_show.cc
---- a/sql/sql_show.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_show.cc 2010-12-31 04:39:23.000000000 +0300
+--- a/sql/sql_show.cc
++++ b/sql/sql_show.cc
@@ -114,6 +114,43 @@
static COND * make_cond_for_info_schema(COND *cond, TABLE_LIST *table);
/***************************************************************************
** List all table types supported
***************************************************************************/
-@@ -799,6 +836,7 @@
+@@ -800,6 +837,7 @@
sctx->master_access);
if (!(db_access & DB_ACLS) && check_grant_db(thd,dbname))
{
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
sctx->priv_user, sctx->host_or_ip, dbname);
general_log_print(thd,COM_INIT_DB,ER(ER_DBACCESS_DENIED_ERROR),
-@@ -2351,6 +2389,284 @@
+@@ -2359,6 +2397,284 @@
DBUG_RETURN(res);
}
/* collect status for all running threads */
-@@ -7465,6 +7781,104 @@
+@@ -7712,6 +8028,104 @@
};
ST_FIELD_INFO processlist_fields_info[]=
{
{"ID", 4, MYSQL_TYPE_LONGLONG, 0, 0, "Id", SKIP_OPEN_TABLE},
-@@ -7654,6 +8068,8 @@
+@@ -7901,6 +8315,8 @@
{
{"CHARACTER_SETS", charsets_fields_info, create_schema_table,
fill_schema_charsets, make_character_sets_old_format, 0, -1, -1, 0, 0},
{"COLLATIONS", collation_fields_info, create_schema_table,
fill_schema_collation, make_old_format, 0, -1, -1, 0, 0},
{"COLLATION_CHARACTER_SET_APPLICABILITY", coll_charset_app_fields_info,
-@@ -7663,6 +8079,8 @@
+@@ -7910,6 +8326,8 @@
OPTIMIZE_I_S_TABLE|OPEN_VIEW_FULL},
{"COLUMN_PRIVILEGES", column_privileges_fields_info, create_schema_table,
fill_schema_column_privileges, 0, 0, -1, -1, 0, 0},
{"ENGINES", engines_fields_info, create_schema_table,
fill_schema_engines, make_old_format, 0, -1, -1, 0, 0},
#ifdef HAVE_EVENT_SCHEDULER
-@@ -7735,14 +8153,20 @@
+@@ -7982,14 +8400,20 @@
get_all_tables, make_table_names_old_format, 0, 1, 2, 1, 0},
{"TABLE_PRIVILEGES", table_privileges_fields_info, create_schema_table,
fill_schema_table_privileges, 0, 0, -1, -1, 0, 0},
{"VARIABLES", variables_fields_info, create_schema_table, fill_variables,
make_old_format, 0, 0, -1, 1, 0},
{"VIEWS", view_fields_info, create_schema_table,
-diff -ruN a/sql/sql_update.cc b/sql/sql_update.cc
---- a/sql/sql_update.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_update.cc 2010-12-31 04:08:17.000000000 +0300
-@@ -894,8 +894,10 @@
+--- a/sql/sql_update.cc
++++ b/sql/sql_update.cc
+@@ -900,8 +900,10 @@
my_snprintf(buff, sizeof(buff), ER(ER_UPDATE_INFO), (ulong) found,
(ulong) updated,
(ulong) thd->warning_info->statement_warn_count());
DBUG_PRINT("info",("%ld records updated", (long) updated));
}
thd->count_cuted_fields= CHECK_FIELD_IGNORE; /* calc cuted fields */
-@@ -2136,7 +2138,9 @@
+@@ -2252,7 +2254,9 @@
thd->first_successful_insert_id_in_prev_stmt : 0;
my_snprintf(buff, sizeof(buff), ER(ER_UPDATE_INFO),
(ulong) found, (ulong) updated, (ulong) thd->cuted_fields);
+ thd->updated_row_count+= row_count;
DBUG_RETURN(FALSE);
}
-diff -ruN a/sql/sql_yacc.yy b/sql/sql_yacc.yy
---- a/sql/sql_yacc.yy 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sql_yacc.yy 2010-12-31 05:06:16.000000000 +0300
-@@ -864,6 +864,7 @@
+--- a/sql/sql_yacc.yy
++++ b/sql/sql_yacc.yy
+@@ -865,6 +865,7 @@
%token CIPHER_SYM
%token CLASS_ORIGIN_SYM /* SQL-2003-N */
%token CLIENT_SYM
%token CLOSE_SYM /* SQL-2003-R */
%token COALESCE /* SQL-2003-N */
%token CODE_SYM
-@@ -1017,6 +1018,7 @@
+@@ -1018,6 +1019,7 @@
%token IMPORT
%token INDEXES
%token INDEX_SYM
%token INFILE
%token INITIAL_SIZE_SYM
%token INNER_SYM /* SQL-2003-R */
-@@ -1315,6 +1317,7 @@
+@@ -1316,6 +1318,7 @@
%token TABLESPACE
%token TABLE_REF_PRIORITY
%token TABLE_SYM /* SQL-2003-R */
%token TABLE_CHECKSUM_SYM
%token TABLE_NAME_SYM /* SQL-2003-N */
%token TEMPORARY /* SQL-2003-N */
-@@ -1324,6 +1327,7 @@
+@@ -1325,6 +1328,7 @@
%token TEXT_SYM
%token THAN_SYM
%token THEN_SYM /* SQL-2003-R */
%token TIMESTAMP /* SQL-2003-R */
%token TIMESTAMP_ADD
%token TIMESTAMP_DIFF
-@@ -1361,6 +1365,7 @@
+@@ -1362,6 +1366,7 @@
%token UPGRADE_SYM
%token USAGE /* SQL-2003-N */
%token USER /* SQL-2003-R */
%token USE_FRM
%token USE_SYM
%token USING /* SQL-2003-R */
-@@ -11109,6 +11114,41 @@
+@@ -11126,6 +11131,41 @@
MYSQL_YYABORT;
#endif // HAVE_RESPONSE_TIME_DISTRIBUTION
}
| CREATE PROCEDURE_SYM sp_name
{
LEX *lex= Lex;
-@@ -11351,6 +11391,16 @@
+@@ -11371,6 +11411,16 @@
Lex->type|= REFRESH_QUERY_RESPONSE_TIME;
#endif // HAVE_RESPONSE_TIME_DISTRIBUTION
}
| MASTER_SYM
{ Lex->type|= REFRESH_MASTER; }
| DES_KEY_FILE
-@@ -12473,6 +12523,7 @@
+@@ -12515,6 +12565,7 @@
| CHAIN_SYM {}
| CHANGED {}
| CIPHER_SYM {}
| CLIENT_SYM {}
| CLASS_ORIGIN_SYM {}
| COALESCE {}
-@@ -12541,6 +12592,7 @@
+@@ -12583,6 +12634,7 @@
| HOSTS_SYM {}
| HOUR_SYM {}
| IDENTIFIED_SYM {}
| IGNORE_SERVER_IDS_SYM {}
| INVOKER_SYM {}
| IMPORT {}
-@@ -12692,6 +12744,7 @@
+@@ -12734,6 +12786,7 @@
| SUSPEND_SYM {}
| SWAPS_SYM {}
| SWITCHES_SYM {}
| TABLE_NAME_SYM {}
| TABLES {}
| TABLE_CHECKSUM_SYM {}
-@@ -12717,6 +12770,7 @@
+@@ -12759,6 +12812,7 @@
| UNKNOWN_SYM {}
| UNTIL_SYM {}
| USER {}
| USE_FRM {}
| VARIABLES {}
| VIEW_SYM {}
-diff -ruN a/sql/structs.h b/sql/structs.h
---- a/sql/structs.h 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/structs.h 2010-12-31 05:12:04.000000000 +0300
+--- a/sql/structs.h
++++ b/sql/structs.h
@@ -25,6 +25,7 @@
#include "my_time.h" /* enum_mysql_timestamp_type */
#include "thr_lock.h" /* thr_lock_type */
/* Bits in form->update */
#define REG_MAKE_DUPP 1 /* Make a copy of record when read */
#define REG_NEW_RECORD 2 /* Write a new record if not found */
-diff -ruN a/sql/sys_vars.cc b/sql/sys_vars.cc
---- a/sql/sys_vars.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/sql/sys_vars.cc 2010-12-30 02:22:25.000000000 +0300
-@@ -1547,6 +1547,17 @@
+--- a/sql/sys_vars.cc
++++ b/sql/sys_vars.cc
+@@ -1711,6 +1711,17 @@
NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(check_read_only), ON_UPDATE(fix_read_only));
-+static Sys_var_mybool Sys_userstat_running(
-+ "userstat_running",
++static Sys_var_mybool Sys_userstat(
++ "userstat",
+ "Control USER_STATISTICS, CLIENT_STATISTICS, THREAD_STATISTICS, "
+ "INDEX_STATISTICS and TABLE_STATISTICS running",
-+ GLOBAL_VAR(opt_userstat_running), CMD_LINE(OPT_ARG), DEFAULT(FALSE));
++ GLOBAL_VAR(opt_userstat), CMD_LINE(OPT_ARG), DEFAULT(FALSE));
+
+static Sys_var_mybool Sys_thread_statistics(
+ "thread_statistics",
-+ "Control TABLE_STATISTICS running, when userstat_running is enabled",
++ "Control TABLE_STATISTICS running, when userstat is enabled",
+ GLOBAL_VAR(opt_thread_statistics), CMD_LINE(OPT_ARG), DEFAULT(FALSE));
+
// Small lower limit to be able to test MRR
static Sys_var_ulong Sys_read_rnd_buff_size(
"read_rnd_buffer_size",
-diff -ruN a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
---- a/storage/myisam/ha_myisam.cc 2010-12-03 20:58:26.000000000 +0300
-+++ b/storage/myisam/ha_myisam.cc 2010-12-31 05:58:01.000000000 +0300
-@@ -769,6 +769,7 @@
+--- a/storage/myisam/ha_myisam.cc
++++ b/storage/myisam/ha_myisam.cc
+@@ -770,6 +770,7 @@
int ha_myisam::write_row(uchar *buf)
{
ha_statistic_increment(&SSV::ha_write_count);
/* If we have a timestamp column, update it to the current time */
-@@ -781,11 +782,13 @@
+@@ -782,11 +783,13 @@
*/
if (table->next_number_field && buf == table->record[0])
{
}
int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt)
-@@ -1536,16 +1539,24 @@
+@@ -1553,16 +1556,24 @@
int ha_myisam::update_row(const uchar *old_data, uchar *new_data)
{
}
int ha_myisam::index_read_map(uchar *buf, const uchar *key,
-@@ -1557,6 +1568,14 @@
+@@ -1574,6 +1585,14 @@
ha_statistic_increment(&SSV::ha_read_key_count);
int error=mi_rkey(file, buf, active_index, key, keypart_map, find_flag);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_INDEX_READ_ROW_DONE(error);
return error;
}
-@@ -1569,6 +1588,14 @@
+@@ -1586,6 +1605,14 @@
ha_statistic_increment(&SSV::ha_read_key_count);
int error=mi_rkey(file, buf, index, key, keypart_map, find_flag);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_INDEX_READ_ROW_DONE(error);
return error;
}
-@@ -1583,6 +1610,14 @@
+@@ -1600,6 +1627,14 @@
int error=mi_rkey(file, buf, active_index, key, keypart_map,
HA_READ_PREFIX_LAST);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_INDEX_READ_ROW_DONE(error);
DBUG_RETURN(error);
}
-@@ -1594,6 +1629,13 @@
+@@ -1611,6 +1646,13 @@
ha_statistic_increment(&SSV::ha_read_next_count);
int error=mi_rnext(file,buf,active_index);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_INDEX_READ_ROW_DONE(error);
return error;
}
-@@ -1605,6 +1647,13 @@
+@@ -1622,6 +1664,13 @@
ha_statistic_increment(&SSV::ha_read_prev_count);
int error=mi_rprev(file,buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_INDEX_READ_ROW_DONE(error);
return error;
}
-@@ -1616,6 +1665,14 @@
+@@ -1633,6 +1682,14 @@
ha_statistic_increment(&SSV::ha_read_first_count);
int error=mi_rfirst(file, buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_INDEX_READ_ROW_DONE(error);
return error;
}
-@@ -1627,6 +1684,14 @@
+@@ -1644,6 +1701,14 @@
ha_statistic_increment(&SSV::ha_read_last_count);
int error=mi_rlast(file, buf, active_index);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_INDEX_READ_ROW_DONE(error);
return error;
}
-@@ -1644,6 +1709,14 @@
+@@ -1661,6 +1726,14 @@
error= mi_rnext_same(file,buf);
} while (error == HA_ERR_RECORD_DELETED);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_INDEX_READ_ROW_DONE(error);
return error;
}
-@@ -1663,6 +1736,8 @@
+@@ -1680,6 +1753,8 @@
ha_statistic_increment(&SSV::ha_read_rnd_next_count);
int error=mi_scan(file, buf);
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_READ_ROW_DONE(error);
return error;
}
-@@ -1679,6 +1754,8 @@
+@@ -1696,6 +1771,8 @@
ha_statistic_increment(&SSV::ha_read_rnd_count);
int error=mi_rrnd(file, buf, my_get_ptr(pos,ref_length));
table->status=error ? STATUS_NOT_FOUND: 0;
MYSQL_READ_ROW_DONE(error);
return error;
}
+--- /dev/null
++++ b/mysql-test/r/userstat_bug602047.result
+@@ -0,0 +1,15 @@
++DROP TABLE IF EXISTS t1;
++SET GLOBAL userstat=ON;
++CREATE TABLE t1 ( id int(10), PRIMARY KEY (id)) ENGINE=InnoDB;
++INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
++SELECT COUNT(*) FROM t1;
++COUNT(*)
++10
++SELECT ROWS_READ FROM information_schema.table_statistics WHERE TABLE_NAME='t1';
++ROWS_READ
++10
++SELECT ROWS_READ FROM information_schema.index_statistics WHERE TABLE_NAME='t1';
++ROWS_READ
++10
++SET GLOBAL userstat=OFF;
++DROP TABLE t1;
+--- /dev/null
++++ b/mysql-test/t/userstat_bug602047.test
+@@ -0,0 +1,11 @@
++--disable_warnings
++DROP TABLE IF EXISTS t1;
++--enable_warnings
++SET GLOBAL userstat=ON;
++CREATE TABLE t1 ( id int(10), PRIMARY KEY (id)) ENGINE=InnoDB;
++INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
++SELECT COUNT(*) FROM t1;
++SELECT ROWS_READ FROM information_schema.table_statistics WHERE TABLE_NAME='t1';
++SELECT ROWS_READ FROM information_schema.index_statistics WHERE TABLE_NAME='t1';
++SET GLOBAL userstat=OFF;
++DROP TABLE t1;
+\ No newline at end of file
+--- a/mysql-test/r/mysqld--help-notwin.result
++++ b/mysql-test/r/mysqld--help-notwin.result
+@@ -745,6 +745,8 @@
+ Define threads usage for handling queries, one of
+ one-thread-per-connection, no-threads, loaded-dynamically
+ --thread-stack=# The stack size for each thread
++ --thread-statistics Control TABLE_STATISTICS running, when userstat is
++ enabled
+ --time-format=name The TIME format (ignored)
+ --timed-mutexes Specify whether to time mutexes (only InnoDB mutexes are
+ currently supported)
+@@ -770,6 +772,9 @@
+ of the underlying table and the query uses a LIMIT clause
+ (usually get from GUI tools)
+ -u, --user=name Run mysqld daemon as user.
++ --userstat Control USER_STATISTICS, CLIENT_STATISTICS,
++ THREAD_STATISTICS, INDEX_STATISTICS and TABLE_STATISTICS
++ running
+ -v, --verbose Used with --help option for detailed help.
+ -V, --version Output version information and exit.
+ --wait-timeout=# The number of seconds the server waits for activity on a
+@@ -1005,6 +1010,7 @@
+ thread-cache-size 0
+ thread-handling one-thread-per-connection
+ thread-stack 262144
++thread-statistics FALSE
+ time-format %H:%i:%s
+ timed-mutexes FALSE
+ tmp-table-size 16777216
+@@ -1012,6 +1018,7 @@
+ transaction-isolation REPEATABLE-READ
+ transaction-prealloc-size 4096
+ updatable-views-with-limit YES
++userstat FALSE
+ verbose TRUE
+ wait-timeout 28800
+ xtradb-admin-command ON