diff options
author | Rex <rex.johnston@mariadb.com> | 2023-03-06 12:58:27 +1200 |
---|---|---|
committer | Rex <rex.johnston@mariadb.com> | 2023-03-06 12:58:27 +1200 |
commit | 1514387c4605a7a6ae4f0561a2149cc2278d54ac (patch) | |
tree | b91f4f7679c9e7305a1a786b3a869e3f9c4189c9 /sql | |
parent | 99ee200b8bc8d76469249a828b642f3a1efee2de (diff) | |
download | mariadb-git-bb-10.4-MDEV-30771.tar.gz |
MDEV-30771 Optimizer trace: table_scan.rows is traced as integer, change to doublebb-10.4-MDEV-30771
Alter formatting of printed doubles written to the optimizer trace
to ensure it is clear they ARE floating point numbers.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/my_json_writer.cc | 19 | ||||
-rw-r--r-- | sql/my_json_writer.h | 10 |
2 files changed, 28 insertions, 1 deletions
diff --git a/sql/my_json_writer.cc b/sql/my_json_writer.cc index 8e35b25b822..f5d721b4f09 100644 --- a/sql/my_json_writer.cc +++ b/sql/my_json_writer.cc @@ -217,7 +217,24 @@ void Json_writer::add_size(longlong val) void Json_writer::add_double(double val) { char buf[64]; - size_t len= my_snprintf(buf, sizeof(buf), "%lg", val); + size_t len; + if (((val - (longlong)val) < OPTIMIZER_DOUBLE_TO_INT_PRECISION) + || (-((longlong)val - val) < OPTIMIZER_DOUBLE_TO_INT_PRECISION)) + return Json_writer::add_ll((longlong)val); + if ( (val > OPTIMIZER_DOUBLE_TO_EXPONENT_VALUE) + ||(-val > OPTIMIZER_DOUBLE_TO_EXPONENT_VALUE) + ||(val > 0 && val < OPTIMIZER_DOUBLE_MIN_VALUE) + ||(val < 0 && val > OPTIMIZER_DOUBLE_MIN_VALUE) + ) + len= my_snprintf(buf, sizeof(buf), "%g", val); + else +#if OPTIMIZER_SHOW_DOUBLE_PRECISION + len= my_snprintf(buf, sizeof(buf), "%.*lf", + OPTIMIZER_DOUBLE_PRECISION, val); +#else + len= my_snprintf(buf, sizeof(buf), "%.*lg", + OPTIMIZER_DOUBLE_SIGNIFICANT_DIGITS, val); +#endif add_unquoted_str(buf, len); } diff --git a/sql/my_json_writer.h b/sql/my_json_writer.h index c353831655a..2778405c154 100644 --- a/sql/my_json_writer.h +++ b/sql/my_json_writer.h @@ -40,6 +40,16 @@ class Opt_trace_context; class Json_writer; struct TABLE_LIST; +// See Json_writer::add_double() for usage +#define OPTIMIZER_SHOW_DOUBLE_PRECISION true +#if OPTIMIZER_SHOW_DOUBLE_PRECISION +# define OPTIMIZER_DOUBLE_PRECISION 2 +# define OPTIMIZER_DOUBLE_MIN_VALUE 0.005 +#else +# define OPTIMIZER_DOUBLE_SIGNIFICANT_DIGITS 6 +#endif +#define OPTIMIZER_DOUBLE_TO_INT_PRECISION 0.00000001 +#define OPTIMIZER_DOUBLE_TO_EXPONENT_VALUE 999999 /* Single_line_formatting_helper is used by Json_writer to do better formatting |