Bug #90903 ALTER TABLE doesn't prevent AUTO_INCREMENT out of range in strict mode
| Submitted: | 17 May 2018 6:13 | Modified: | 23 May 2018 14:50 |
|---|---|---|---|
| Reporter: | monty solomon | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S2 (Serious) |
| Version: | 5.6/5.7/8.0 | OS: | Any |
| Assigned to: | CPU Architecture: | Any |
[17 May 2018 6:18]
monty solomon
In this example, the ALTER TABLE statement permits the AUTO_INCREMENT value to be set to a value larger than can fit in the column.
DROP TABLE IF EXISTS w;
CREATE TABLE `w` (
`x` int NOT NULL AUTO_INCREMENT,
`y` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`x`)
) ENGINE=InnoDB;
ALTER TABLE w AUTO_INCREMENT=2147483648;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
INSERT INTO w SET y=1;
ERROR 1467 (HY000): Failed to read auto-increment value from storage engine
SHOW CREATE TABLE w\G
*************************** 1. row ***************************
Table: w
Create Table: CREATE TABLE `w` (
`x` int(11) NOT NULL AUTO_INCREMENT,
`y` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`x`)
) ENGINE=InnoDB AUTO_INCREMENT=2147483648
[17 May 2018 6:30]
monty solomon
Operations that produce undefined behavior should be prevented in strict mode 14.8.1.5 AUTO_INCREMENT Handling in InnoDB https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html * Assigning a negative value to the AUTO_INCREMENT column In all lock modes (0, 1, and 2), the behavior of the auto-increment mechanism is not defined if you assign a negative value to the AUTO_INCREMENT column. * If the AUTO_INCREMENT value becomes larger than the maximum integer for the specified integer type In all lock modes (0, 1, and 2), the behavior of the auto-increment mechanism is not defined if the value becomes larger than the maximum integer that can be stored in the specified integer type.
[23 May 2018 14:50]
MySQL Verification Team
Thank you for the bug report. Verified as described.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.040 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: ALTER TABLE does not fail if the AUTO_INCREMENT value would be too large for the new type. Any INSERTs to the table will then fail. How to repeat: SET innodb_strict_mode=1; SET sql_mode="ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; DROP TABLE IF EXISTS v; CREATE TABLE `v` ( `x` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `y` bigint(20) unsigned NOT NULL, PRIMARY KEY (`x`) ) ENGINE=InnoDB; INSERT INTO v SET y=2147483648; ALTER TABLE v MODIFY y INT NOT NULL; ERROR 1264 (22003): Out of range value for column 'y' at row 1 ALTER TABLE v AUTO_INCREMENT=2147483648; ALTER TABLE v MODIFY x INT NOT NULL AUTO_INCREMENT; Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0 INSERT INTO v SET y=1; ERROR 1467 (HY000): Failed to read auto-increment value from storage engine SHOW CREATE TABLE v\G *************************** 1. row *************************** Table: v Create Table: CREATE TABLE `v` ( `x` int(11) NOT NULL AUTO_INCREMENT, `y` bigint(20) unsigned NOT NULL, PRIMARY KEY (`x`) ) ENGINE=InnoDB AUTO_INCREMENT=2147483648 Suggested fix: ALTER TABLE should fail.