summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorRex <rex.johnston@mariadb.com>2023-03-06 12:58:27 +1200
committerRex <rex.johnston@mariadb.com>2023-03-06 12:58:27 +1200
commit1514387c4605a7a6ae4f0561a2149cc2278d54ac (patch)
treeb91f4f7679c9e7305a1a786b3a869e3f9c4189c9 /sql
parent99ee200b8bc8d76469249a828b642f3a1efee2de (diff)
downloadmariadb-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.cc19
-rw-r--r--sql/my_json_writer.h10
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