diff options
author | unknown <cmiller@zippy.cornsilk.net> | 2007-07-03 12:20:19 -0400 |
---|---|---|
committer | unknown <cmiller@zippy.cornsilk.net> | 2007-07-03 12:20:19 -0400 |
commit | fd70537309701acc51a0f92ac46e495363221e07 (patch) | |
tree | 0047088e444a1d70a42c9b5ef897efb4af7ee8df | |
parent | 83e4f46e4bb0f304878f4a87bf20d5f595bc30e3 (diff) | |
download | mariadb-git-fd70537309701acc51a0f92ac46e495363221e07.tar.gz |
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.
-rw-r--r-- | sql/sql_profile.cc | 35 | ||||
-rw-r--r-- | sql/sql_show.cc | 11 |
2 files changed, 34 insertions, 12 deletions
diff --git a/sql/sql_profile.cc b/sql/sql_profile.cc index fbb05a988c5..d4e3568f592 100644 --- a/sql/sql_profile.cc +++ b/sql/sql_profile.cc @@ -44,9 +44,9 @@ ST_FIELD_INFO query_profile_statistics_info[]= {"QUERY_ID", 20, MYSQL_TYPE_LONG, 0, false, "Query_id"}, {"SEQ", 20, MYSQL_TYPE_LONG, 0, false, "Seq"}, {"STATE", 30, MYSQL_TYPE_STRING, 0, false, "Status"}, - {"DURATION", TIME_FLOAT_DIGITS, MYSQL_TYPE_DOUBLE, 0, false, "Duration"}, - {"CPU_USER", TIME_FLOAT_DIGITS, MYSQL_TYPE_DOUBLE, 0, true, "CPU_user"}, - {"CPU_SYSTEM", TIME_FLOAT_DIGITS, MYSQL_TYPE_DOUBLE, 0, true, "CPU_system"}, + {"DURATION", TIME_FLOAT_DIGITS, MYSQL_TYPE_DECIMAL, 0, false, "Duration"}, + {"CPU_USER", TIME_FLOAT_DIGITS, MYSQL_TYPE_DECIMAL, 0, true, "CPU_user"}, + {"CPU_SYSTEM", TIME_FLOAT_DIGITS, MYSQL_TYPE_DECIMAL, 0, true, "CPU_system"}, {"CONTEXT_VOLUNTARY", 20, MYSQL_TYPE_LONG, 0, true, "Context_voluntary"}, {"CONTEXT_INVOLUNTARY", 20, MYSQL_TYPE_LONG, 0, true, "Context_involuntary"}, {"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 */ table->field[2]->store(previous->status, strlen(previous->status), 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 - 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(); #else /* TODO: Add CPU-usage info for non-BSD systems */ diff --git a/sql/sql_show.cc b/sql/sql_show.cc index d37fb3fb6a9..e1e332ff03d 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3657,11 +3657,18 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list) fields_info->field_length)) == NULL) DBUG_RETURN(NULL); break; + case MYSQL_TYPE_DECIMAL: + case MYSQL_TYPE_STRING: default: /* 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))) { DBUG_RETURN(0); |