From 2aca7b0c335bf260df68582a39ea6ee6e29661c2 Mon Sep 17 00:00:00 2001 From: Michael Okoko Date: Wed, 9 Jun 2021 20:39:50 +0100 Subject: [PATCH] Prepare JSON as valid histogram_type Signed-off-by: Michael Okoko --- scripts/mysql_system_tables.sql | 2 +- sql/item_strfunc.cc | 2 +- sql/sql_statistics.cc | 10 +++++++--- sql/sql_statistics.h | 12 +++++++++--- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql index cee47a0e5d6..353f6658447 100644 --- a/scripts/mysql_system_tables.sql +++ b/scripts/mysql_system_tables.sql @@ -314,7 +314,7 @@ DROP TABLE tmp_proxies_priv; CREATE TABLE IF NOT EXISTS table_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, cardinality bigint(21) unsigned DEFAULT NULL, PRIMARY KEY (db_name,table_name) ) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Tables'; -CREATE TABLE IF NOT EXISTS column_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, column_name varchar(64) NOT NULL, min_value varbinary(255) DEFAULT NULL, max_value varbinary(255) DEFAULT NULL, nulls_ratio decimal(12,4) DEFAULT NULL, avg_length decimal(12,4) DEFAULT NULL, avg_frequency decimal(12,4) DEFAULT NULL, hist_size tinyint unsigned, hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB'), histogram varbinary(255), PRIMARY KEY (db_name,table_name,column_name) ) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Columns'; +CREATE TABLE IF NOT EXISTS column_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, column_name varchar(64) NOT NULL, min_value varbinary(255) DEFAULT NULL, max_value varbinary(255) DEFAULT NULL, nulls_ratio decimal(12,4) DEFAULT NULL, avg_length decimal(12,4) DEFAULT NULL, avg_frequency decimal(12,4) DEFAULT NULL, hist_size tinyint unsigned, hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON'), histogram varbinary(255), PRIMARY KEY (db_name,table_name,column_name) ) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Columns'; CREATE TABLE IF NOT EXISTS index_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, index_name varchar(64) NOT NULL, prefix_arity int(11) unsigned NOT NULL, avg_frequency decimal(12,4) DEFAULT NULL, PRIMARY KEY (db_name,table_name,index_name,prefix_arity) ) engine=Aria transactional=0 CHARACTER SET utf8 COLLATE utf8_bin comment='Statistics on Indexes'; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index d4bf28a9c21..cdf41f05cb1 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -503,7 +503,7 @@ err: const char *histogram_types[] = - {"SINGLE_PREC_HB", "DOUBLE_PREC_HB", 0}; + {"SINGLE_PREC_HB", "DOUBLE_PREC_HB", "JSON", 0}; static TYPELIB histogram_types_typelib= { array_elements(histogram_types), "histogram_types", diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 1f034f490c8..5e78738c184 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -178,7 +178,7 @@ TABLE_FIELD_TYPE column_stat_fields[COLUMN_STAT_N_FIELDS] = }, { { STRING_WITH_LEN("hist_type") }, - { STRING_WITH_LEN("enum('SINGLE_PREC_HB','DOUBLE_PREC_HB')") }, + { STRING_WITH_LEN("enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON')") }, { STRING_WITH_LEN("utf8mb3") } }, { @@ -1070,8 +1070,12 @@ public: stat_field->store(stats->histogram.get_type() + 1); break; case COLUMN_STAT_HISTOGRAM: - stat_field->store((char *)stats->histogram.get_values(), - stats->histogram.get_size(), &my_charset_bin); + if (stats->histogram.get_type() == JSON) { + stat_field->store((char *) "hello_world", 11, &my_charset_bin); + } else { + stat_field->store((char *) stats->histogram.get_values(), + stats->histogram.get_size(), &my_charset_bin); + } break; } } diff --git a/sql/sql_statistics.h b/sql/sql_statistics.h index 35b3aa33acc..555d03cfa22 100644 --- a/sql/sql_statistics.h +++ b/sql/sql_statistics.h @@ -42,7 +42,8 @@ typedef enum enum_histogram_type { SINGLE_PREC_HB, - DOUBLE_PREC_HB + DOUBLE_PREC_HB, + JSON } Histogram_type; enum enum_stat_tables @@ -154,6 +155,7 @@ private: case SINGLE_PREC_HB: return ((uint) (1 << 8) - 1); case DOUBLE_PREC_HB: + case JSON: return ((uint) (1 << 16) - 1); } return 1; @@ -166,6 +168,7 @@ public: case SINGLE_PREC_HB: return size; case DOUBLE_PREC_HB: + case JSON: return size / 2; } return 0; @@ -179,6 +182,7 @@ private: case SINGLE_PREC_HB: return (uint) (((uint8 *) values)[i]); case DOUBLE_PREC_HB: + case JSON: return (uint) uint2korr(values + i * 2); } return 0; @@ -253,7 +257,8 @@ public: void set_value(uint i, double val) { switch (type) { - case SINGLE_PREC_HB: + case SINGLE_PREC_HB: + case JSON: ((uint8 *) values)[i]= (uint8) (val * prec_factor()); return; case DOUBLE_PREC_HB: @@ -265,7 +270,8 @@ public: void set_prev_value(uint i) { switch (type) { - case SINGLE_PREC_HB: + case SINGLE_PREC_HB: + case JSON: ((uint8 *) values)[i]= ((uint8 *) values)[i-1]; return; case DOUBLE_PREC_HB: