mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 11:31:51 +01:00
branches/5.1: Check *first_value every time against the column max
value and set *first_value to next autoinc if it's > col max value. ie. not rely on what is passed in from MySQL. [49497] Error 1467 (ER_AUTOINC_READ_FAILED) on inserting a negative value rb://236
This commit is contained in:
parent
80fd468771
commit
1a866c2c3a
3 changed files with 124 additions and 6 deletions
|
@ -7981,6 +7981,11 @@ ha_innobase::get_auto_increment(
|
||||||
invoking this method. So we are not sure if it's guaranteed to
|
invoking this method. So we are not sure if it's guaranteed to
|
||||||
be 0 or not. */
|
be 0 or not. */
|
||||||
|
|
||||||
|
/* We need the upper limit of the col type to check for
|
||||||
|
whether we update the table autoinc counter or not. */
|
||||||
|
ulonglong col_max_value = innobase_get_int_col_max_value(
|
||||||
|
table->next_number_field);
|
||||||
|
|
||||||
/* Called for the first time ? */
|
/* Called for the first time ? */
|
||||||
if (trx->n_autoinc_rows == 0) {
|
if (trx->n_autoinc_rows == 0) {
|
||||||
|
|
||||||
|
@ -7997,6 +8002,11 @@ ha_innobase::get_auto_increment(
|
||||||
/* Not in the middle of a mult-row INSERT. */
|
/* Not in the middle of a mult-row INSERT. */
|
||||||
} else if (prebuilt->autoinc_last_value == 0) {
|
} else if (prebuilt->autoinc_last_value == 0) {
|
||||||
set_if_bigger(*first_value, autoinc);
|
set_if_bigger(*first_value, autoinc);
|
||||||
|
/* Check for -ve values. */
|
||||||
|
} else if (*first_value > col_max_value && trx->n_autoinc_rows > 0) {
|
||||||
|
/* Set to next logical value. */
|
||||||
|
ut_a(autoinc > trx->n_autoinc_rows);
|
||||||
|
*first_value = (autoinc - trx->n_autoinc_rows) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
*nb_reserved_values = trx->n_autoinc_rows;
|
*nb_reserved_values = trx->n_autoinc_rows;
|
||||||
|
@ -8007,12 +8017,6 @@ ha_innobase::get_auto_increment(
|
||||||
ulonglong need;
|
ulonglong need;
|
||||||
ulonglong current;
|
ulonglong current;
|
||||||
ulonglong next_value;
|
ulonglong next_value;
|
||||||
ulonglong col_max_value;
|
|
||||||
|
|
||||||
/* We need the upper limit of the col type to check for
|
|
||||||
whether we update the table autoinc counter or not. */
|
|
||||||
col_max_value = innobase_get_int_col_max_value(
|
|
||||||
table->next_number_field);
|
|
||||||
|
|
||||||
current = *first_value > col_max_value ? autoinc : *first_value;
|
current = *first_value > col_max_value ? autoinc : *first_value;
|
||||||
need = *nb_reserved_values * increment;
|
need = *nb_reserved_values * increment;
|
||||||
|
|
|
@ -1161,3 +1161,86 @@ t1 CREATE TABLE `t1` (
|
||||||
PRIMARY KEY (`c1`)
|
PRIMARY KEY (`c1`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
|
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
Warnings:
|
||||||
|
Note 1051 Unknown table 't1'
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (-685113344), (1), (NULL), (NULL);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
-685113344
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`c1`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (-685113344), (2), (NULL), (NULL);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
-685113344
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`c1`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (NULL), (2), (-685113344), (NULL);
|
||||||
|
INSERT INTO t1 VALUES (4), (5), (6), (NULL);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
-685113344
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`c1`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (NULL), (2), (-685113344), (5);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
-685113344
|
||||||
|
1
|
||||||
|
2
|
||||||
|
5
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`c1`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (1), (2), (-685113344), (NULL);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
c1
|
||||||
|
-685113344
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`c1` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`c1`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
|
@ -631,3 +631,34 @@ REPLACE INTO t1 VALUES (-1);
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
##
|
||||||
|
# 49497: Error 1467 (ER_AUTOINC_READ_FAILED) on inserting a negative value
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (-685113344), (1), (NULL), (NULL);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (-685113344), (2), (NULL), (NULL);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (NULL), (2), (-685113344), (NULL);
|
||||||
|
INSERT INTO t1 VALUES (4), (5), (6), (NULL);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (NULL), (2), (-685113344), (5);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (c1 INTEGER AUTO_INCREMENT, PRIMARY KEY (c1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (1), (2), (-685113344), (NULL);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
Loading…
Add table
Reference in a new issue