mirror of
https://github.com/MariaDB/server.git
synced 2025-08-05 13:16:09 +03:00
Applying InnoDB snapshot
Detailed revision comments: r6536 | sunny | 2010-01-30 00:13:42 +0200 (Sat, 30 Jan 2010) | 6 lines branches/5.1: Check *first_value everytime 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:
@@ -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;
|
||||||
|
@@ -2652,9 +2652,9 @@ ha_innobase::innobase_initialize_autoinc()
|
|||||||
auto_inc = innobase_get_int_col_max_value(field);
|
auto_inc = innobase_get_int_col_max_value(field);
|
||||||
} else {
|
} else {
|
||||||
/* We have no idea what's been passed in to us as the
|
/* We have no idea what's been passed in to us as the
|
||||||
autoinc column. We set it to the 0, effectively disabling
|
autoinc column. We set it to the MAX_INT of our table
|
||||||
updates to the table. */
|
autoinc type. */
|
||||||
auto_inc = 0;
|
auto_inc = 0xFFFFFFFFFFFFFFFFULL;
|
||||||
|
|
||||||
ut_print_timestamp(stderr);
|
ut_print_timestamp(stderr);
|
||||||
fprintf(stderr, " InnoDB: Unable to determine the AUTOINC "
|
fprintf(stderr, " InnoDB: Unable to determine the AUTOINC "
|
||||||
@@ -2663,7 +2663,7 @@ ha_innobase::innobase_initialize_autoinc()
|
|||||||
|
|
||||||
if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) {
|
if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE) {
|
||||||
/* If the recovery level is set so high that writes
|
/* If the recovery level is set so high that writes
|
||||||
are disabled we force the AUTOINC counter to 0
|
are disabled we force the AUTOINC counter to the MAX
|
||||||
value effectively disabling writes to the table.
|
value effectively disabling writes to the table.
|
||||||
Secondly, we avoid reading the table in case the read
|
Secondly, we avoid reading the table in case the read
|
||||||
results in failure due to a corrupted table/index.
|
results in failure due to a corrupted table/index.
|
||||||
@@ -2672,10 +2672,7 @@ ha_innobase::innobase_initialize_autoinc()
|
|||||||
tables can be dumped with minimal hassle. If an error
|
tables can be dumped with minimal hassle. If an error
|
||||||
were returned in this case, the first attempt to read
|
were returned in this case, the first attempt to read
|
||||||
the table would fail and subsequent SELECTs would succeed. */
|
the table would fail and subsequent SELECTs would succeed. */
|
||||||
auto_inc = 0;
|
|
||||||
} else if (field == NULL) {
|
} else if (field == NULL) {
|
||||||
/* This is a far more serious error, best to avoid
|
|
||||||
opening the table and return failure. */
|
|
||||||
my_error(ER_AUTOINC_READ_FAILED, MYF(0));
|
my_error(ER_AUTOINC_READ_FAILED, MYF(0));
|
||||||
} else {
|
} else {
|
||||||
dict_index_t* index;
|
dict_index_t* index;
|
||||||
@@ -2704,7 +2701,7 @@ ha_innobase::innobase_initialize_autoinc()
|
|||||||
"InnoDB: Unable to find the AUTOINC column "
|
"InnoDB: Unable to find the AUTOINC column "
|
||||||
"%s in the InnoDB table %s.\n"
|
"%s in the InnoDB table %s.\n"
|
||||||
"InnoDB: We set the next AUTOINC column "
|
"InnoDB: We set the next AUTOINC column "
|
||||||
"value to 0,\n"
|
"value to the maximum possible value,\n"
|
||||||
"InnoDB: in effect disabling the AUTOINC "
|
"InnoDB: in effect disabling the AUTOINC "
|
||||||
"next value generation.\n"
|
"next value generation.\n"
|
||||||
"InnoDB: You can either set the next "
|
"InnoDB: You can either set the next "
|
||||||
@@ -2713,13 +2710,7 @@ ha_innobase::innobase_initialize_autoinc()
|
|||||||
"recreating the table.\n",
|
"recreating the table.\n",
|
||||||
col_name, index->table->name);
|
col_name, index->table->name);
|
||||||
|
|
||||||
/* This will disable the AUTOINC generation. */
|
my_error(ER_AUTOINC_READ_FAILED, MYF(0));
|
||||||
auto_inc = 0;
|
|
||||||
|
|
||||||
/* We want the open to succeed, so that the user can
|
|
||||||
take corrective action. ie. reads should succeed but
|
|
||||||
updates should fail. */
|
|
||||||
err = DB_SUCCESS;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* row_search_max_autoinc() should only return
|
/* row_search_max_autoinc() should only return
|
||||||
@@ -3977,17 +3968,11 @@ no_commit:
|
|||||||
prebuilt->autoinc_error = DB_SUCCESS;
|
prebuilt->autoinc_error = DB_SUCCESS;
|
||||||
|
|
||||||
if ((error = update_auto_increment())) {
|
if ((error = update_auto_increment())) {
|
||||||
/* We don't want to mask autoinc overflow errors. */
|
|
||||||
|
|
||||||
/* Handle the case where the AUTOINC sub-system
|
/* We don't want to mask autoinc overflow errors. */
|
||||||
failed during initialization. */
|
if (prebuilt->autoinc_error != DB_SUCCESS) {
|
||||||
if (prebuilt->autoinc_error == DB_UNSUPPORTED) {
|
|
||||||
error_result = ER_AUTOINC_READ_FAILED;
|
|
||||||
/* Set the error message to report too. */
|
|
||||||
my_error(ER_AUTOINC_READ_FAILED, MYF(0));
|
|
||||||
goto func_exit;
|
|
||||||
} else if (prebuilt->autoinc_error != DB_SUCCESS) {
|
|
||||||
error = (int) prebuilt->autoinc_error;
|
error = (int) prebuilt->autoinc_error;
|
||||||
|
|
||||||
goto report_error;
|
goto report_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7898,10 +7883,7 @@ ha_innobase::innobase_get_autoinc(
|
|||||||
*value = dict_table_autoinc_read(prebuilt->table);
|
*value = dict_table_autoinc_read(prebuilt->table);
|
||||||
|
|
||||||
/* It should have been initialized during open. */
|
/* It should have been initialized during open. */
|
||||||
if (*value == 0) {
|
ut_a(*value != 0);
|
||||||
prebuilt->autoinc_error = DB_UNSUPPORTED;
|
|
||||||
dict_table_autoinc_unlock(prebuilt->table);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(ulong(prebuilt->autoinc_error));
|
return(ulong(prebuilt->autoinc_error));
|
||||||
@@ -7981,6 +7963,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 +7984,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 +7999,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;
|
||||||
|
Reference in New Issue
Block a user