--echo # --echo # Test that we can store JSON arrays in histogram field mysql.column_stats when histogram_type=JSON --echo # let $histogram_type_override='JSON_HB'; --source statistics.test --source include/have_stat_tables.inc --source include/have_sequence.inc --source include/analyze-format.inc --disable_warnings drop table if exists t1; --enable_warnings set @save_histogram_type=@@histogram_type; set @save_histogram_size=@@histogram_size; create table ten(a int primary key); insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); set histogram_size=100; set histogram_type='double_prec_hb'; create table t1_bin (a varchar(255)); insert into t1_bin select concat('a-', a) from ten; analyze table t1_bin persistent for all; select hex(histogram) from mysql.column_stats where table_name='t1_bin'; explain extended select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz'; analyze select * from t1_bin where a between 'a-3a' and 'zzzzzzzzz'; set histogram_type=json_hb; create table t1_json (a varchar(255)); insert into t1_json select concat('a-', a) from ten; analyze table t1_json persistent for all; select * from mysql.column_stats where table_name='t1_json'; explain extended select * from t1_json where a between 'a-3a' and 'zzzzzzzzz'; analyze select * from t1_json where a between 'a-3a' and 'zzzzzzzzz'; explain extended select * from t1_json where a < 'b-1a'; analyze select * from t1_json where a > 'zzzzzzzzz'; drop table ten; # # Test different valid JSON strings that are invalid histograms. # UPDATE mysql.column_stats SET histogram='["not-what-you-expect"]' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; UPDATE mysql.column_stats SET histogram='{"histogram_hb_v2":"not-histogram"}' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; UPDATE mysql.column_stats SET histogram='{"histogram_hb_v2":["not-a-bucket"]}' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; UPDATE mysql.column_stats SET histogram='{"histogram_hb_v2":[{"no-expected-members":1}]}' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; UPDATE mysql.column_stats SET histogram='{"histogram_hb_v2":[{"start":{}}]}' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; UPDATE mysql.column_stats SET histogram='{"histogram_hb_v2":[{"start":"aaa", "size":"not-an-integer"}]}' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; UPDATE mysql.column_stats SET histogram='{"histogram_hb_v2":[{"start":"aaa", "size":0.25}]}' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; UPDATE mysql.column_stats SET histogram='{"histogram_hb_v2":[{"start":"aaa", "size":0.25, "ndv":1}]}' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; UPDATE mysql.column_stats SET histogram='{"histogram_hb_v2":[]}' WHERE table_name='t1_json'; FLUSH TABLES; --error ER_JSON_HISTOGRAM_PARSE_FAILED explain select * from t1_json limit 1; --source include/have_sequence.inc create table t2 ( city varchar(100) ); set histogram_size=50; insert into t2 select 'Moscow' from seq_1_to_99; insert into t2 select 'Helsinki' from seq_1_to_2; set histogram_type=json_hb; analyze table t2 persistent for all; explain extended select * from t2 where city = 'Moscow'; analyze select * from t2 where city = 'Moscow'; explain extended select * from t2 where city = 'Helsinki'; analyze select * from t2 where city = 'helsinki'; explain extended select * from t2 where city < 'Lagos'; drop table t1_bin; drop table t1_json; drop table t2; DELETE FROM mysql.column_stats; create schema world; use world; --disable_query_log --disable_result_log --disable_warnings --source include/world_schema_utf8.inc --source include/world.inc --enable_warnings --enable_result_log --enable_query_log set histogram_type='JSON_HB'; set histogram_size=50; --disable_result_log ANALYZE TABLE Country, City, CountryLanguage persistent for all; --enable_result_log SELECT column_name, min_value, max_value, hist_size, hist_type, histogram FROM mysql.column_stats; analyze select * from Country use index () where Code between 'BBC' and 'GGG'; analyze select * from Country use index () where Code < 'BBC'; set histogram_type=@save_histogram_type; set histogram_size=@save_histogram_size; DROP SCHEMA world; use test; create table t10 ( a varchar(10) ); --echo # --echo # Histograms are not collected for empty tables: --echo # analyze table t10 persistent for all; select histogram from mysql.column_stats where table_name='t10' and db_name=database(); --echo # --echo # Try with n_buckets > n_rows --echo # insert into t10 values ('Berlin'),('Paris'),('Rome'); set histogram_size=10, histogram_type='json_hb'; analyze table t10 persistent for all; select histogram from mysql.column_stats where table_name='t10' and db_name=database(); drop table t10; --echo # --echo # MDEV-26590: Stack smashing/buffer overflow in Histogram_json_hb::parse upon UPDATE on table with long VARCHAR --echo # CREATE TABLE t1 (b INT, a VARCHAR(3176)); INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); SET histogram_type= JSON_HB; ANALYZE TABLE t1 PERSISTENT FOR ALL; SELECT * FROM t1; drop table t1; --echo # --echo # MDEV-26589: Assertion failure upon DECODE_HISTOGRAM with NULLs in first column --echo # CREATE TABLE t1 (a INT, b INT); INSERT INTO t1 VALUES (NULL,1), (NULL,2); SET histogram_type = JSON_HB; ANALYZE TABLE t1 PERSISTENT FOR ALL; SELECT DECODE_HISTOGRAM(hist_type, histogram) from mysql.column_stats; drop table t1; --echo # --echo # ASAN use-after-poison my_strnxfrm_simple_internal / Histogram_json_hb::range_selectivity ... --echo # (Just the testcase) --echo # CREATE TABLE t1 (f CHAR(8)); INSERT INTO t1 VALUES ('foo'),('bar'); SET histogram_type = JSON_HB; ANALYZE TABLE t1 PERSISTENT FOR ALL; SELECT * FROM t1 WHERE f > 'qux'; DROP TABLE t1;