--- a/mysql-test/include/restart_mysqld.inc +++ b/mysql-test/include/restart_mysqld.inc @@ -18,8 +18,13 @@ shutdown_server 10; # Write file to make mysql-test-run.pl start up the server again ---exec echo "restart" > $_expect_file_name +if ($restart_mysqld_options) { +--exec echo "restart: $restart_mysqld_options" > $_expect_file_name +} +if (!$restart_mysqld_options) { +--exec echo "restart" > $_expect_file_name +} # Turn on reconnect --enable_reconnect --- /dev/null +++ b/mysql-test/r/percona_stats_null.result @@ -0,0 +1,25 @@ +restart_mysqld_options=--default-storage-engine=myisam --myisam_stats_method=nulls_equal +restart_mysqld_options=--default-storage-engine=myisam --myisam_stats_method=nulls_unequal +restart_mysqld_options=--default-storage-engine=myisam --myisam_stats_method=nulls_ignored +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=1000 --innodb_stats_method=nulls_equal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=1000 --innodb_stats_method=nulls_unequal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=1000 --innodb_stats_method=nulls_ignored +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=500 --innodb_stats_method=nulls_equal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=500 --innodb_stats_method=nulls_unequal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=500 --innodb_stats_method=nulls_ignored +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=250 --innodb_stats_method=nulls_equal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=250 --innodb_stats_method=nulls_unequal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=250 --innodb_stats_method=nulls_ignored +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=100 --innodb_stats_method=nulls_equal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=100 --innodb_stats_method=nulls_unequal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=100 --innodb_stats_method=nulls_ignored +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=50 --innodb_stats_method=nulls_equal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=50 --innodb_stats_method=nulls_unequal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=50 --innodb_stats_method=nulls_ignored +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=25 --innodb_stats_method=nulls_equal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=25 --innodb_stats_method=nulls_unequal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=25 --innodb_stats_method=nulls_ignored +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=10 --innodb_stats_method=nulls_equal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=10 --innodb_stats_method=nulls_unequal +restart_mysqld_options=--default-storage-engine=innodb --innodb_stats_on_metadata=0 --innodb_stats_sample_pages=10 --innodb_stats_method=nulls_ignored +DROP TABLE t; --- /dev/null +++ b/mysql-test/t/percona_stats_null.test @@ -0,0 +1,135 @@ +--source include/have_innodb.inc + +--enable_result_log +--enable_query_log + +--let delta_coeff=0.2 + +# engine +# 2 - myisam +# 1 - innodb +# 0 - end +--let engine_index=2 + +while ($engine_index) +{ + +--let engine=`SELECT CASE $engine_index WHEN 2 THEN 'myisam' WHEN 1 THEN 'innodb' END` + +--let engine_cmd=`SELECT CONCAT('--default-storage-engine=', '$engine')` + +--let additional_cmd=`SELECT CASE $engine_index WHEN 2 THEN '' WHEN 1 THEN '--innodb_stats_on_metadata=0' END` + +# sample_pages_index +# 7 - 1000 +# 6 - 500 +# 5 - 250 +# 4 - 100 +# 3 - 50 +# 2 - 25 +# 1 - 10 +# 0 - end +--let sample_pages_index=`SELECT CASE $engine_index WHEN 2 THEN 1 WHEN 1 THEN 7 END` + +while ($sample_pages_index) +{ +--let sample_pages=`SELECT CASE $sample_pages_index WHEN 7 THEN 1000 WHEN 6 THEN 500 WHEN 5 THEN 250 WHEN 4 THEN 100 WHEN 3 THEN 50 WHEN 2 THEN 25 WHEN 1 THEN 10 END` +--let sample_pages_cmd=`SELECT CASE $engine_index WHEN 2 THEN '' WHEN 1 THEN (SELECT CONCAT('--innodb_stats_sample_pages=', $sample_pages)) END` + +# stats_method_index +# 3 - nulls_equal +# 2 - nulls_unequal +# 1 - nulls_ignored +# 0 - end +--let stats_method_index=3 + +while ($stats_method_index) +{ +--let stats_method=`SELECT CASE $stats_method_index WHEN 3 THEN 'nulls_equal' WHEN 2 THEN 'nulls_unequal' WHEN 1 THEN 'nulls_ignored' END` +--let stats_method_cmd=`SELECT CONCAT('--', '$engine', '_stats_method=', '$stats_method')` +--let expected_not_null=`SELECT CASE $stats_method_index WHEN 3 THEN TRUE WHEN 2 THEN FALSE WHEN 1 THEN TRUE END` +--let expected_null=`SELECT CASE $stats_method_index WHEN 3 THEN FALSE WHEN 2 THEN TRUE WHEN 1 THEN FALSE END` + +--let restart_mysqld_options=$engine_cmd $additional_cmd $sample_pages_cmd $stats_method_cmd +--echo restart_mysqld_options=$restart_mysqld_options +--source include/restart_mysqld.inc + +# prepare data + +--disable_query_log +--disable_result_log + +--disable_warnings +DROP TABLE IF EXISTS t; +--enable_warnings + +eval CREATE TABLE `t` (`id` int(11) DEFAULT NULL, KEY `t$id` (`id`)) ENGINE=$engine; + +# insert 100 null values +--let i=100 +while($i) +{ + eval INSERT INTO t VALUES(); + dec $i; +} +# insert 6 not null values +--let i=6 +while($i) +{ +eval INSERT INTO t(id) VALUES ($i); +dec $i; +} + +# clone to 100000 +INSERT INTO t SELECT a.* FROM t as a, t as b, t as c LIMIT 99894; + +ANALYZE TABLE t; + +--enable_query_log +--enable_result_log + +--let count= `SELECT count(*) FROM t` +--let null_count= `SELECT count(*) FROM t WHERE id IS NULL` +--let not_null_count=`SELECT count(*) FROM t WHERE id IS NOT NULL` +--let cardinality= query_get_value('SHOW INDEXES FROM t', Cardinality, 1) +--let delta=`SELECT $count * $delta_coeff` + +--let cardinality_not_null_low=`SELECT IF($not_null_count < $delta, 0, $not_null_count - $delta)` +--let cardinality_not_null_high=`SELECT $not_null_count + $delta` +--let cardinality_null_low=`SELECT IF($null_count < $delta, 0, $null_count - $delta)` +--let cardinality_null_high=`SELECT $null_count + $delta` + +--let cardinality_near_not_null=`SELECT ($cardinality_not_null_low <= $cardinality) AND ($cardinality <= $cardinality_not_null_high)` +--let cardinality_near_null=`SELECT ($cardinality_null_low <= $cardinality) AND ($cardinality <= $cardinality_null_high)` + +--let not_null_ok=`SELECT $cardinality_near_not_null = $expected_not_null` +--let null_ok=`SELECT $cardinality_near_null = $expected_null` + +--let ok=`SELECT ($not_null_ok = TRUE) and ($null_ok = TRUE)` +#--let ok=1 +if (!$ok) +{ +--echo Failed with '$restart_mysqld_options' +--echo Delta is $delta_coeff +--echo Engine is $engine +--echo Sample pages is $sample_pages +--echo Count is $count +--echo Not null count is $not_null_count +--echo Null count is $null_count +--echo Cardinality is $cardinality +--echo Expected range of not null $cardinality_not_null_low...$cardinality_not_null_high +--echo Expected range of null $cardinality_null_low...$cardinality_null_high +--echo Expected near not null is $expected_not_null +--echo Expected near null is $expected_null +} + + dec $stats_method_index; +} + + dec $sample_pages_index; +} + + dec $engine_index; +} + +DROP TABLE t;