Skip to content

Commit 03a9366

Browse files
committed
Extra tests for MDEV-30483 After upgrade to 10.6 from Mysql 5.7 seeing "InnoDB: Column last_update in table mysql.innodb_table_stats is BINARY(4) NOT NULL but should be INT UNSIGNED NOT NULL"
Adding tests demonstrating that columns: - mysql.innodb_table_stats.last_update - mysql.innodb_index_stats.last_update contain sane values close to NOW() rathar than a garbage. Tests cover these three underlying TIMESTAMP data formats: - MariaDB Field_timestamp0 - UINT4 based Like in a MariaDB native installation running with mysql56_temporal_format=0 - MariaDB Field_timestampf - BINARY(4) based, with UNSIGNED_FLAG Like in a MariaDB native installation running with mysql56_temporal_format=1 - MySQL-alike Field_timestampf - BINARY(4) based, without UNSIGNED_FLAG Like with a MariaDB server running over a MySQL-5.6 directory (e.g. during a migragion).
1 parent 9edb1a5 commit 03a9366

File tree

4 files changed

+182
-0
lines changed

4 files changed

+182
-0
lines changed

mysql-test/suite/innodb/r/stat_tables.result

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,60 @@ UPDATE mysql.innodb_table_stats SET last_update=NULL WHERE table_name='t1';
2626
XA END 'test';
2727
XA ROLLBACK 'test';
2828
DROP TABLE t1;
29+
#
30+
# MDEV-30483 After upgrade to 10.6 from Mysql 5.7 seeing "InnoDB: Column last_update in table mysql.innodb_table_stats is BINARY(4) NOT NULL but should be INT UNSIGNED NOT NULL"
31+
#
32+
#
33+
# Testing a non-default format: Field_timestamp0 - UINT4 based
34+
#
35+
SET @@global.mysql56_temporal_format=0;
36+
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TIMESTAMP;
37+
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TIMESTAMP;
38+
SHOW COLUMNS FROM mysql.innodb_table_stats LIKE 'last_update';
39+
Field Type Null Key Default Extra
40+
last_update timestamp /* mariadb-5.3 */ NO current_timestamp() on update current_timestamp()
41+
SHOW COLUMNS FROM mysql.innodb_index_stats LIKE 'last_update';
42+
Field Type Null Key Default Extra
43+
last_update timestamp /* mariadb-5.3 */ NO current_timestamp() on update current_timestamp()
44+
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=1;
45+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_table_stats
46+
WHERE database_name='test' AND table_name='t1';
47+
TIMESTAMPDIFF(DAY,last_update,now())<=1
48+
1
49+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_index_stats
50+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
51+
TIMESTAMPDIFF(DAY,last_update,now())<=1
52+
1
53+
DROP TABLE t1;
54+
#
55+
# Now as the table t1 is dropped, expect no statistics
56+
#
57+
SELECT * FROM mysql.innodb_table_stats
58+
WHERE database_name='test' AND table_name='t1';
59+
database_name table_name last_update n_rows clustered_index_size sum_of_other_index_sizes
60+
SELECT * FROM mysql.innodb_index_stats
61+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
62+
database_name table_name index_name last_update stat_name stat_value sample_size stat_description
63+
#
64+
# Testing with the default format: Field_timestampf - BINARY(4) based with the UNSIGNED_FLAG
65+
#
66+
SET @@global.mysql56_temporal_format=1;
67+
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TIMESTAMP;
68+
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TIMESTAMP;
69+
SHOW COLUMNS FROM mysql.innodb_table_stats LIKE 'last_update';
70+
Field Type Null Key Default Extra
71+
last_update timestamp NO current_timestamp() on update current_timestamp()
72+
SHOW COLUMNS FROM mysql.innodb_index_stats LIKE 'last_update';
73+
Field Type Null Key Default Extra
74+
last_update timestamp NO current_timestamp() on update current_timestamp()
75+
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=1;
76+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_table_stats
77+
WHERE database_name='test' AND table_name='t1';
78+
TIMESTAMPDIFF(DAY,last_update,now())<=1
79+
1
80+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_index_stats
81+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
82+
TIMESTAMPDIFF(DAY,last_update,now())<=1
83+
1
84+
DROP TABLE t1;
2985
# End of 10.6 tests

mysql-test/suite/innodb/t/stat_tables.test

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,57 @@ XA END 'test';
2828
XA ROLLBACK 'test';
2929
DROP TABLE t1;
3030

31+
--echo #
32+
--echo # MDEV-30483 After upgrade to 10.6 from Mysql 5.7 seeing "InnoDB: Column last_update in table mysql.innodb_table_stats is BINARY(4) NOT NULL but should be INT UNSIGNED NOT NULL"
33+
--echo #
34+
35+
# The following tests demonstrate that these columns:
36+
# - innodb_table_stats.last_update
37+
# - innodb_index_stats.last_update
38+
# have sane values close to NOW(), rather than any garbage,
39+
# with all TIMESTAMP formats.
40+
41+
--echo #
42+
--echo # Testing a non-default format: Field_timestamp0 - UINT4 based
43+
--echo #
44+
45+
SET @@global.mysql56_temporal_format=0;
46+
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TIMESTAMP;
47+
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TIMESTAMP;
48+
SHOW COLUMNS FROM mysql.innodb_table_stats LIKE 'last_update';
49+
SHOW COLUMNS FROM mysql.innodb_index_stats LIKE 'last_update';
50+
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=1;
51+
52+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_table_stats
53+
WHERE database_name='test' AND table_name='t1';
54+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_index_stats
55+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
56+
DROP TABLE t1;
57+
58+
--echo #
59+
--echo # Now as the table t1 is dropped, expect no statistics
60+
--echo #
61+
62+
SELECT * FROM mysql.innodb_table_stats
63+
WHERE database_name='test' AND table_name='t1';
64+
SELECT * FROM mysql.innodb_index_stats
65+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
66+
67+
--echo #
68+
--echo # Testing with the default format: Field_timestampf - BINARY(4) based with the UNSIGNED_FLAG
69+
--echo #
70+
71+
SET @@global.mysql56_temporal_format=1;
72+
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TIMESTAMP;
73+
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TIMESTAMP;
74+
SHOW COLUMNS FROM mysql.innodb_table_stats LIKE 'last_update';
75+
SHOW COLUMNS FROM mysql.innodb_index_stats LIKE 'last_update';
76+
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=1;
77+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_table_stats
78+
WHERE database_name='test' AND table_name='t1';
79+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_index_stats
80+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
81+
DROP TABLE t1;
82+
83+
3184
--echo # End of 10.6 tests

plugin/type_mysql_timestamp/mysql-test/type_mysql_timestamp/type_mysql_timestamp_stat_tables.result

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,38 @@ innodb_index_stats CREATE TABLE `innodb_index_stats` (
7171
PRIMARY KEY (`database_name`,`table_name`,`index_name`,`stat_name`)
7272
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0
7373
SET @@global.innodb_stats_persistent=1;
74+
#
75+
# Testing MySQL-5.6-alike Field_timestampf: BINARY(4) based, without UNSIGNED_FLAG
76+
#
77+
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TYPE_MYSQL_TIMESTAMP;
78+
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TYPE_MYSQL_TIMESTAMP;
79+
SHOW COLUMNS FROM mysql.innodb_table_stats LIKE 'last_update';
80+
Field Type Null Key Default Extra
81+
last_update type_mysql_timestamp NO current_timestamp() on update current_timestamp()
82+
SHOW COLUMNS FROM mysql.innodb_index_stats LIKE 'last_update';
83+
Field Type Null Key Default Extra
84+
last_update type_mysql_timestamp NO current_timestamp() on update current_timestamp()
85+
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=1;
86+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_table_stats
87+
WHERE database_name='test' AND table_name='t1';
88+
TIMESTAMPDIFF(DAY,last_update,now())<=1
89+
1
90+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_index_stats
91+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
92+
TIMESTAMPDIFF(DAY,last_update,now())<=1
93+
1
94+
DROP TABLE t1;
95+
#
96+
# Now as the table t1 is dropped, expect no statistics
97+
#
98+
SELECT * FROM mysql.innodb_table_stats
99+
WHERE database_name='test' AND table_name='t1';
100+
database_name table_name last_update n_rows clustered_index_size sum_of_other_index_sizes
101+
SELECT * FROM mysql.innodb_index_stats
102+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
103+
database_name table_name index_name last_update stat_name stat_value sample_size stat_description
104+
#
105+
# Restore the structure of the tables
106+
#
107+
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TIMESTAMP;
108+
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TIMESTAMP;

plugin/type_mysql_timestamp/mysql-test/type_mysql_timestamp/type_mysql_timestamp_stat_tables.test

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,41 @@ SHOW CREATE TABLE mysql.innodb_table_stats;
2222
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TIMESTAMP;
2323
SHOW CREATE TABLE mysql.innodb_index_stats;
2424
SET @@global.innodb_stats_persistent=1;
25+
26+
27+
# The following test demonstrate that these columns:
28+
# - innodb_table_stats.last_update
29+
# - innodb_index_stats.last_update
30+
# have sane values close to NOW(), rather than any garbage,
31+
# with MySQL-alike Field_timestampf
32+
33+
--echo #
34+
--echo # Testing MySQL-5.6-alike Field_timestampf: BINARY(4) based, without UNSIGNED_FLAG
35+
--echo #
36+
37+
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TYPE_MYSQL_TIMESTAMP;
38+
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TYPE_MYSQL_TIMESTAMP;
39+
SHOW COLUMNS FROM mysql.innodb_table_stats LIKE 'last_update';
40+
SHOW COLUMNS FROM mysql.innodb_index_stats LIKE 'last_update';
41+
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=1;
42+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_table_stats
43+
WHERE database_name='test' AND table_name='t1';
44+
SELECT TIMESTAMPDIFF(DAY,last_update,now())<=1 FROM mysql.innodb_index_stats
45+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
46+
DROP TABLE t1;
47+
48+
--echo #
49+
--echo # Now as the table t1 is dropped, expect no statistics
50+
--echo #
51+
52+
SELECT * FROM mysql.innodb_table_stats
53+
WHERE database_name='test' AND table_name='t1';
54+
SELECT * FROM mysql.innodb_index_stats
55+
WHERE database_name='test' AND table_name='t1' AND stat_name='size';
56+
57+
--echo #
58+
--echo # Restore the structure of the tables
59+
--echo #
60+
61+
ALTER TABLE mysql.innodb_table_stats MODIFY last_update TIMESTAMP;
62+
ALTER TABLE mysql.innodb_index_stats MODIFY last_update TIMESTAMP;

0 commit comments

Comments
 (0)