summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Okoko <okokomichaels@outlook.com>2021-06-14 17:14:11 +0100
committerSergei Petrunia <psergey@askmonty.org>2022-01-19 18:10:07 +0300
commit79cdb535da8c4128a4572297d264ca8e4a0ba70d (patch)
tree01f6c0b69036ee94b95fcffc959b30ddfdb3645c
parent2aca7b0c335bf260df68582a39ea6ee6e29661c2 (diff)
downloadmariadb-git-79cdb535da8c4128a4572297d264ca8e4a0ba70d.tar.gz
add json statistics test and change histogram column type to blob
-rw-r--r--mysql-test/main/statistics_json.test28
-rw-r--r--scripts/mysql_system_tables.sql2
-rw-r--r--sql/sql_statistics.cc5
3 files changed, 32 insertions, 3 deletions
diff --git a/mysql-test/main/statistics_json.test b/mysql-test/main/statistics_json.test
new file mode 100644
index 00000000000..0af7d1f6d1d
--- /dev/null
+++ b/mysql-test/main/statistics_json.test
@@ -0,0 +1,28 @@
+--source include/have_stat_tables.inc
+--echo #
+--echo # Test that JSON is a valid histogram type and we can store JSON strings in mysql.column_stats
+--echo #
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+
+set @save_histogram_type=@@histogram_type;
+
+CREATE TABLE t1 (
+ a int NOT NULL PRIMARY KEY,
+ b varchar(32)
+) ENGINE=MYISAM;
+
+SET histogram_type='JSON';
+SELECT @@histogram_type;
+
+INSERT INTO t1 VALUES
+ (7, 'xxxxxxxxxxxxxxxxxxxxxxxxxx'),
+ (17, 'vvvvvvvvvvvvv');
+
+ANALYZE TABLE t1 PERSISTENT FOR COLUMNS(b) INDEXES();
+DESCRIBE mysql.column_stats;
+SELECT * FROM mysql.column_stats;
+
+set histogram_type=@save_histogram_type;
+DROP TABLE t1; \ No newline at end of file
diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql
index 353f6658447..e31f3372b5f 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','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 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 blob, 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/sql_statistics.cc b/sql/sql_statistics.cc
index 5e78738c184..16e3e8b1664 100644
--- a/sql/sql_statistics.cc
+++ b/sql/sql_statistics.cc
@@ -183,7 +183,7 @@ TABLE_FIELD_TYPE column_stat_fields[COLUMN_STAT_N_FIELDS] =
},
{
{ STRING_WITH_LEN("histogram") },
- { STRING_WITH_LEN("varbinary(255)") },
+ { STRING_WITH_LEN("blob") },
{ NULL, 0 }
}
};
@@ -1071,7 +1071,8 @@ public:
break;
case COLUMN_STAT_HISTOGRAM:
if (stats->histogram.get_type() == JSON) {
- stat_field->store((char *) "hello_world", 11, &my_charset_bin);
+ const char* val = "{'hello': 'world'}";
+ stat_field->store(val, strlen(val), &my_charset_bin);
} else {
stat_field->store((char *) stats->histogram.get_values(),
stats->histogram.get_size(), &my_charset_bin);