Commit 6f6655cf authored by unknown's avatar unknown

In 5.0, Field_double::val_str uses "%g" to render floating point

numbers, which uses "X.YeZ" notation when the exponent Z would be
less than -4. That behavior at -4 is not exactly what we want, and
our Decimal type offers smarter number representation.  By changing
profiling to use Decimal types, we get more readable output.


sql/sql_profile.cc:
  Change the DOUBLE I_S types to DECIMAL, so we get a smarter
  floating-point number renderer.
sql/sql_show.cc:
  Add MYSQL_TYPE_DECIMAL as a string-ish type that INFORMATION_SCHEMA
  tables may use.
parent 214fde44
...@@ -44,9 +44,9 @@ ST_FIELD_INFO query_profile_statistics_info[]= ...@@ -44,9 +44,9 @@ ST_FIELD_INFO query_profile_statistics_info[]=
{"QUERY_ID", 20, MYSQL_TYPE_LONG, 0, false, "Query_id"}, {"QUERY_ID", 20, MYSQL_TYPE_LONG, 0, false, "Query_id"},
{"SEQ", 20, MYSQL_TYPE_LONG, 0, false, "Seq"}, {"SEQ", 20, MYSQL_TYPE_LONG, 0, false, "Seq"},
{"STATE", 30, MYSQL_TYPE_STRING, 0, false, "Status"}, {"STATE", 30, MYSQL_TYPE_STRING, 0, false, "Status"},
{"DURATION", TIME_FLOAT_DIGITS, MYSQL_TYPE_DOUBLE, 0, false, "Duration"}, {"DURATION", TIME_FLOAT_DIGITS, MYSQL_TYPE_DECIMAL, 0, false, "Duration"},
{"CPU_USER", TIME_FLOAT_DIGITS, MYSQL_TYPE_DOUBLE, 0, true, "CPU_user"}, {"CPU_USER", TIME_FLOAT_DIGITS, MYSQL_TYPE_DECIMAL, 0, true, "CPU_user"},
{"CPU_SYSTEM", TIME_FLOAT_DIGITS, MYSQL_TYPE_DOUBLE, 0, true, "CPU_system"}, {"CPU_SYSTEM", TIME_FLOAT_DIGITS, MYSQL_TYPE_DECIMAL, 0, true, "CPU_system"},
{"CONTEXT_VOLUNTARY", 20, MYSQL_TYPE_LONG, 0, true, "Context_voluntary"}, {"CONTEXT_VOLUNTARY", 20, MYSQL_TYPE_LONG, 0, true, "Context_voluntary"},
{"CONTEXT_INVOLUNTARY", 20, MYSQL_TYPE_LONG, 0, true, "Context_involuntary"}, {"CONTEXT_INVOLUNTARY", 20, MYSQL_TYPE_LONG, 0, true, "Context_involuntary"},
{"BLOCK_OPS_IN", 20, MYSQL_TYPE_LONG, 0, true, "Block_ops_in"}, {"BLOCK_OPS_IN", 20, MYSQL_TYPE_LONG, 0, true, "Block_ops_in"},
...@@ -557,16 +557,31 @@ int PROFILING::fill_statistics_info(THD *thd, struct st_table_list *tables, Item ...@@ -557,16 +557,31 @@ int PROFILING::fill_statistics_info(THD *thd, struct st_table_list *tables, Item
*/ */
table->field[2]->store(previous->status, strlen(previous->status), table->field[2]->store(previous->status, strlen(previous->status),
system_charset_info); system_charset_info);
table->field[3]->store((double)(entry->time_usecs -
previous->time_usecs)/(1000*1000)); my_decimal duration;
double2my_decimal(E_DEC_FATAL_ERROR,
(entry->time_usecs-previous->time_usecs)/(1000.0*1000),
&duration);
table->field[3]->store_decimal(&duration);
#ifdef HAVE_GETRUSAGE #ifdef HAVE_GETRUSAGE
table->field[4]->store((double)RUSAGE_DIFF_USEC(entry->rusage.ru_utime,
previous->rusage.ru_utime)/(1000.0*1000));
table->field[4]->set_notnull();
table->field[5]->store((double)RUSAGE_DIFF_USEC(entry->rusage.ru_stime,
previous->rusage.ru_stime)/(1000.0*1000));
my_decimal cpu_utime, cpu_stime;
double2my_decimal(E_DEC_FATAL_ERROR,
RUSAGE_DIFF_USEC(entry->rusage.ru_utime,
previous->rusage.ru_utime) /
(1000.0*1000),
&cpu_utime);
double2my_decimal(E_DEC_FATAL_ERROR,
RUSAGE_DIFF_USEC(entry->rusage.ru_stime,
previous->rusage.ru_stime) /
(1000.0*1000),
&cpu_stime);
table->field[4]->store_decimal(&cpu_utime);
table->field[5]->store_decimal(&cpu_stime);
table->field[4]->set_notnull();
table->field[5]->set_notnull(); table->field[5]->set_notnull();
#else #else
/* TODO: Add CPU-usage info for non-BSD systems */ /* TODO: Add CPU-usage info for non-BSD systems */
......
...@@ -3657,11 +3657,18 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list) ...@@ -3657,11 +3657,18 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list)
fields_info->field_length)) == NULL) fields_info->field_length)) == NULL)
DBUG_RETURN(NULL); DBUG_RETURN(NULL);
break; break;
case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_STRING:
default: default:
/* Don't let unimplemented types pass through. Could be a grave error. */ /* Don't let unimplemented types pass through. Could be a grave error. */
DBUG_ASSERT(fields_info->field_type == MYSQL_TYPE_STRING); DBUG_ASSERT(fields_info->field_type == MYSQL_TYPE_STRING ||
fields_info->field_type == MYSQL_TYPE_DECIMAL);
/* this should be changed when Item_empty_string is fixed(in 4.1) */ /**
@todo Change when Item_empty_string is fixed (in 4.1). [Presumably,
this means removing the first of two steps: setting a useless, bogus
value; and then setting the attributes.]
*/
if (!(item= new Item_empty_string("", 0, cs))) if (!(item= new Item_empty_string("", 0, cs)))
{ {
DBUG_RETURN(0); DBUG_RETURN(0);
......
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