Skip to content

Commit

Permalink
MDEV-26519: Improved histograms: Better error reporting, test coverage
Browse files Browse the repository at this point in the history
Also report JSON histogram load errors into error log, like it is already
done with other histogram/statistics load errors.

Add test coverage to see what happens if one upgrades but does NOT run
mysql_upgrade.
  • Loading branch information
spetrunia committed Jan 19, 2022
1 parent a0f93f4 commit a0916cf
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 0 deletions.
1 change: 1 addition & 0 deletions mysql-test/main/statistics_json.result
Original file line number Diff line number Diff line change
Expand Up @@ -4157,6 +4157,7 @@ set @@global.histogram_size=@save_histogram_size;
drop table if exists t1;
set @save_histogram_type=@@histogram_type;
set @save_histogram_size=@@histogram_size;
call mtr.add_suppression("Failed to parse histogram for table .*");
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;
Expand Down
1 change: 1 addition & 0 deletions mysql-test/main/statistics_json.test
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ drop table if exists t1;
set @save_histogram_type=@@histogram_type;
set @save_histogram_size=@@histogram_size;

call mtr.add_suppression("Failed to parse histogram for table .*");
create table ten(a int primary key);
insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

Expand Down
44 changes: 44 additions & 0 deletions mysql-test/main/statistics_upgrade_not_done.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Create the old-version of the table
call mtr.add_suppression(".*Incorrect definition of table mysql.column_stats:.*");
alter table mysql.column_stats rename test.t1;
CREATE TABLE mysql.column_stats (
`db_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
`column_name` varchar(64) COLLATE utf8mb3_bin 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(3) unsigned DEFAULT NULL,
`hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') COLLATE utf8mb3_bin DEFAULT NULL,
`histogram` varbinary(255) DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`,`column_name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns';
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
INSERT INTO mysql.column_stats VALUES
('test','t0','a','0','9',0.0000,4.0000,1.0000,5,'DOUBLE_PREC_HB', x'5555AAAA00');
flush tables;
analyze select * from t0 where a<3;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
1 SIMPLE t0 ALL NULL NULL NULL NULL 10 10.00 100.00 30.00 Using where
# restart
select hex(histogram) from mysql.column_stats where table_name='t0' and db_name='test';
hex(histogram)
5555AAAA00
analyze select * from t0 where a<3;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
1 SIMPLE t0 ALL NULL NULL NULL NULL 10 10.00 100.00 30.00 Using where
create table t2 (a int);
# This currently just pretends that the histogram was collected.
analyze table t2 persistent for all;
Table Op Msg_type Msg_text
test.t2 analyze status Engine-independent statistics collected
test.t2 analyze status Table is already up to date
select * from mysql.column_stats where table_name='t2' and db_name='test';
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
analyze select * from t0 where a<3;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
1 SIMPLE t0 ALL NULL NULL NULL NULL 10 10.00 33.33 30.00 Using where
drop table t0, t1, t2;
57 changes: 57 additions & 0 deletions mysql-test/main/statistics_upgrade_not_done.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
--source include/not_embedded.inc
--source include/mysql_upgrade_preparation.inc
--source include/have_innodb.inc

#
# This is like the upgrade test in statistics_upgrade.test, except that we also
# check what happens if one doesn't do the upgrade and attempts to use the new
# server with the old mysql.column_stats table
#
--echo # Create the old-version of the table

call mtr.add_suppression(".*Incorrect definition of table mysql.column_stats:.*");

alter table mysql.column_stats rename test.t1;

CREATE TABLE mysql.column_stats (
`db_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
`table_name` varchar(64) COLLATE utf8mb3_bin NOT NULL,
`column_name` varchar(64) COLLATE utf8mb3_bin 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(3) unsigned DEFAULT NULL,
`hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') COLLATE utf8mb3_bin DEFAULT NULL,
`histogram` varbinary(255) DEFAULT NULL,
PRIMARY KEY (`db_name`,`table_name`,`column_name`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns';

create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
INSERT INTO mysql.column_stats VALUES
('test','t0','a','0','9',0.0000,4.0000,1.0000,5,'DOUBLE_PREC_HB', x'5555AAAA00');

flush tables;
analyze select * from t0 where a<3;

# Restart the server

--source include/restart_mysqld.inc

select hex(histogram) from mysql.column_stats where table_name='t0' and db_name='test';
analyze select * from t0 where a<3;

create table t2 (a int);
-- echo # This currently just pretends that the histogram was collected.
analyze table t2 persistent for all;
select * from mysql.column_stats where table_name='t2' and db_name='test';

--exec $MYSQL_UPGRADE --upgrade-system-tables --force --silent 2>&1
let $MYSQLD_DATADIR= `select @@datadir`;
--file_exists $MYSQLD_DATADIR/mysql_upgrade_info
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info

analyze select * from t0 where a<3;
drop table t0, t1, t2;
4 changes: 4 additions & 0 deletions sql/opt_histogram_json.cc
Original file line number Diff line number Diff line change
Expand Up @@ -696,6 +696,10 @@ bool Histogram_json_hb::parse(MEM_ROOT *mem_root, const char *db_name,
ER_THD(thd, ER_JSON_HISTOGRAM_PARSE_FAILED),
db_name, table_name,
err, (je.s.c_str - (const uchar*)hist_data));
sql_print_error(ER_THD(thd, ER_JSON_HISTOGRAM_PARSE_FAILED),
db_name, table_name, err,
(je.s.c_str - (const uchar*)hist_data));

DBUG_RETURN(true);
}

Expand Down

0 comments on commit a0916cf

Please sign in to comment.