Commit f35b4218 authored by Georgi Kodinov's avatar Georgi Kodinov

Bug #22047 : Time in SHOW PROCESSLIST for SQL thread in replication

seems to become negative

THD::start_time has a dual meaning : it's either the time since the process
entered a given state or is the transaction time returned by e.g. NOW().
This causes problems, as sometimes THD::start_time may be set to a value
that is correct and needed when used as a base for NOW(), but these times
may be arbitrary (SET @@timestamp) or non-local (coming from the master 
through the replication feed).
If one such non-local time is set there's no way to return a correct value
for e.g. SHOW PROCESSLIST or SELECT ... FROM INFORMATION_SCHEMA.PROCESSLIST.
Fixed by making the Time column in SHOW PROCESSLIST SIGNED LONG instead of 
UNSIGNED LONG and doing the correct conversions.
      
Note that no reliable test suite can be constructed, since it would require
knowing the local time and can't be achieved by the means of the current test
suite.

sql/sql_show.cc:
  Bug #22047: make the Time in SHOW PROCESSLIST LONG from 
  LONG UNSIGNED
parent 510e9ddf
...@@ -1338,7 +1338,8 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) ...@@ -1338,7 +1338,8 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
field_list.push_back(field=new Item_empty_string("db",NAME_LEN)); field_list.push_back(field=new Item_empty_string("db",NAME_LEN));
field->maybe_null=1; field->maybe_null=1;
field_list.push_back(new Item_empty_string("Command",16)); field_list.push_back(new Item_empty_string("Command",16));
field_list.push_back(new Item_return_int("Time",7, FIELD_TYPE_LONG)); field_list.push_back(field= new Item_return_int("Time",7, FIELD_TYPE_LONG));
field->unsigned_flag= 0;
field_list.push_back(field=new Item_empty_string("State",30)); field_list.push_back(field=new Item_empty_string("State",30));
field->maybe_null=1; field->maybe_null=1;
field_list.push_back(field=new Item_empty_string("Info",max_query_length)); field_list.push_back(field=new Item_empty_string("Info",max_query_length));
...@@ -1439,7 +1440,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) ...@@ -1439,7 +1440,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
else else
protocol->store(command_name[thd_info->command], system_charset_info); protocol->store(command_name[thd_info->command], system_charset_info);
if (thd_info->start_time) if (thd_info->start_time)
protocol->store((uint32) (now - thd_info->start_time)); protocol->store_long ((longlong) (now - thd_info->start_time));
else else
protocol->store_null(); protocol->store_null();
protocol->store(thd_info->state_info, system_charset_info); protocol->store(thd_info->state_info, system_charset_info);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment