mariadb/mysql-test/suite/innodb/t/innodb_stats.test
Thirunarayanan Balathandayuthapani e25abdd5e7 MDEV-31740 InnoDB statistics column length validation failed
When there's a column length mismatch in the InnoDB
statistics tables (innodb_table_stats or innodb_index_stats),
consecutive access of statistics table throws error message
and uses transient statistics.

This change makes it easier for users to understand and
resolve the issue when the statistics tables have been
modified or corrupted.
2025-10-06 12:53:17 +05:30

80 lines
2.9 KiB
Text

#
# Test the persistent stats feature
#
-- source include/have_innodb.inc
-- source include/not_embedded.inc
-- disable_warnings
-- disable_query_log
DROP TABLE IF EXISTS test_innodb_stats;
set @save_use_stat_tables= @@use_stat_tables;
set @@use_stat_tables= NEVER;
CREATE TABLE test_innodb_stats (
a INT,
KEY a_key (a)
) ENGINE=INNODB STATS_PERSISTENT=1;
-- enable_warnings
-- enable_query_log
# test empty table
-- let $insert = SELECT 'dummy INSERT, the table should be empty'
-- source suite/innodb/include/innodb_stats.inc
# test table with 1 row
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1)
-- source suite/innodb/include/innodb_stats.inc
# test table with 2 eq rows
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1), (1)
-- source suite/innodb/include/innodb_stats.inc
# test table with 3 eq rows
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1), (1), (1)
-- source suite/innodb/include/innodb_stats.inc
# test table with 10 eq rows
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)
-- source suite/innodb/include/innodb_stats.inc
# test table with 2 diff rows
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1), (2)
-- source suite/innodb/include/innodb_stats.inc
# test table with 2 diff rows, 3 rows in total
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1), (1), (2)
-- source suite/innodb/include/innodb_stats.inc
# test table with 3 diff rows
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1), (2), (3)
-- source suite/innodb/include/innodb_stats.inc
# test table with 3 diff rows, 5 rows in total
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1), (1), (2), (3), (3)
-- source suite/innodb/include/innodb_stats.inc
# test table with 5 diff rows, 10 rows in total
-- let $insert = INSERT INTO test_innodb_stats (a) VALUES (1), (2), (3), (4), (5), (1), (2), (3), (4), (5)
-- source suite/innodb/include/innodb_stats.inc
-- disable_query_log
DROP TABLE test_innodb_stats;
set @@use_stat_tables= @save_use_stat_tables;
--enable_query_log
--echo #
--echo # MDEV-31740 InnoDB statistics column length validation failed
--echo #
call mtr.add_suppression("InnoDB: Unexpected length of mysql\\.innodb_table_stats\\.last_update");
ALTER TABLE mysql.innodb_table_stats MODIFY LAST_UPDATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP();
CREATE TABLE t (a INT KEY)Engine=InnoDB STATS_PERSISTENT=1;
let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_PATTERN=InnoDB: Unexpected length of mysql\\.innodb_table_stats\\.last_update;
--source include/search_pattern_in_file.inc
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP();
CREATE TABLE t2(a INT KEY)ENGINE=InnoDB STATS_PERSISTENT= 1;
SELECT table_name FROM mysql.innodb_table_stats;
DROP TABLE t, t2;