Details
-
Bug
-
Status: Stalled (View Workflow)
-
Critical
-
Resolution: Unresolved
-
11.8.0
-
None
Description
mariadb-check does not return warning for incorrect sequence (has two recods) with engine InnoDB
Create table with engine InnoDB and convert it into sequence:
CREATE TABLE `s1` ( |
`next_not_cached_value` bigint(21) NOT NULL, |
`minimum_value` bigint(21) NOT NULL, |
`maximum_value` bigint(21) NOT NULL, |
`start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', |
`increment` bigint(21) NOT NULL COMMENT 'increment value', |
`cache_size` bigint(21) unsigned NOT NULL, |
`cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', |
`cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' |
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci; |
|
insert into s1 values (1,1,9223372036854775806,1,1,1000,0,0); |
insert into s1 values (2,1,9223372036854775806,1,1,1000,0,0); |
|
alter table s1 sequence=1; |
MariaDB [test]> select * from s1; |
+-----------------------+---------------+---------------------+-------------+-----------+------------+--------------+-------------+ |
| next_not_cached_value | minimum_value | maximum_value | start_value | increment | cache_size | cycle_option | cycle_count |
|
+-----------------------+---------------+---------------------+-------------+-----------+------------+--------------+-------------+ |
| 1 | 1 | 9223372036854775806 | 1 | 1 | 1000 | 0 | 0 |
|
+-----------------------+---------------+---------------------+-------------+-----------+------------+--------------+-------------+ |
1 row in set (0,002 sec) |
mariadb-check does not show any warnings
mariadb-check --databases test |
test.s1 OK
|
If you change the type from sequence to table, you can see that the table still has two records:
MariaDB [test]> alter table s1 sequence=0; |
Query OK, 0 rows affected (0,003 sec) |
Records: 0 Duplicates: 0 Warnings: 0
|
|
MariaDB [test]> select * from s1; |
+-----------------------+---------------+---------------------+-------------+-----------+------------+--------------+-------------+ |
| next_not_cached_value | minimum_value | maximum_value | start_value | increment | cache_size | cycle_option | cycle_count |
|
+-----------------------+---------------+---------------------+-------------+-----------+------------+--------------+-------------+ |
| 1 | 1 | 9223372036854775806 | 1 | 1 | 1000 | 0 | 0 |
|
| 2 | 1 | 9223372036854775806 | 1 | 1 | 1000 | 0 | 0 |
|
+-----------------------+---------------+---------------------+-------------+-----------+------------+--------------+-------------+ |
2 rows in set (0,003 sec) |
In a similar situation for Aria and MyISAM warning is shown:
MariaDB [test]> select TABLE_NAME, TABLE_TYPE , ENGINE from information_schema.tables where table_schema='test'; |
+------------+------------+--------+ |
| TABLE_NAME | TABLE_TYPE | ENGINE |
|
+------------+------------+--------+ |
| s1 | SEQUENCE | InnoDB | |
| s2 | SEQUENCE | MyISAM | |
+------------+------------+--------+ |
mariadb-check --databases test |
test.s1 OK
|
test.s2
|
Warning : More than one row in the table |
status : OK
|
Attachments
Issue Links
- includes
-
MDEV-36032 Check when doing ALTER TABLE table_name sequence=1 that table can be a sequence
-
- In Review
-
-
MDEV-36487 Fix ha_innobase::check() for sequences
-
- Open
-
- is blocked by
-
MDEV-36032 Check when doing ALTER TABLE table_name sequence=1 that table can be a sequence
-
- In Review
-
- is caused by
-
MDEV-22491 Support mariadb-check and CHECK TABLE with SEQUENCE
-
- In Testing
-
- relates to
-
MDEV-36038 ALTER TABLE…SEQUENCE does not work correctly with InnoDB
-
- Closed
-
Like I wrote on 2025-01-21, a valid InnoDB sequence must consist of a single record in a single index page, with no transaction metadata. If it is anything else, then various bad things can happen, as it has already been demonstrated in MDEV-36032. Because that level of detail is not visible across the storage engine handler interface, the checks will need to be implemented at the InnoDB level.
Thorough stress testing should find problems related to the scenarios that I have in mind. But, it does not seem to be feasible to conduct thorough testing before all currently known ways to create corrupted sequences (
MDEV-36038and MDEV-36032) have been fixed.