Fix Bug #55277 - Failing assertion: auto_inc > 0
Handle overflow when reading value from SELECT MAX(C) FROM T; Call ha_innobase::info() after initializing the autoinc value in ha_innobase::open(). Fix for both the builtin and plugin. rb://402
This commit is contained in:
parent
b37256b1ab
commit
09eb23d50b
@ -1244,3 +1244,16 @@ t1 CREATE TABLE `t1` (
|
|||||||
PRIMARY KEY (`c1`)
|
PRIMARY KEY (`c1`)
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
|
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
Warnings:
|
||||||
|
Note 1051 Unknown table 't1'
|
||||||
|
CREATE TABLE t1(c1 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (NULL);
|
||||||
|
INSERT INTO t1 VALUES (18446744073709551615);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`c1` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`c1`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=18446744073709551615 DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -662,3 +662,15 @@ INSERT INTO t1 VALUES (1), (2), (-685113344), (NULL);
|
|||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
##
|
||||||
|
# 55277: Failing assertion: auto_inc > 0
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
CREATE TABLE t1(c1 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (NULL);
|
||||||
|
INSERT INTO t1 VALUES (18446744073709551615);
|
||||||
|
# Restart the server
|
||||||
|
-- source include/restart_mysqld.inc
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -2720,12 +2720,19 @@ ha_innobase::innobase_initialize_autoinc()
|
|||||||
err = row_search_max_autoinc(index, col_name, &read_auto_inc);
|
err = row_search_max_autoinc(index, col_name, &read_auto_inc);
|
||||||
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case DB_SUCCESS:
|
case DB_SUCCESS: {
|
||||||
/* At the this stage we do not know the increment
|
ulonglong col_max_value;
|
||||||
or the offset, so use a default increment of 1. */
|
|
||||||
auto_inc = read_auto_inc + 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
col_max_value = innobase_get_int_col_max_value(field);
|
||||||
|
|
||||||
|
/* At the this stage we do not know the increment
|
||||||
|
nor the offset, so use a default increment of 1. */
|
||||||
|
|
||||||
|
auto_inc = innobase_next_autoinc(
|
||||||
|
read_auto_inc, 1, 1, col_max_value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case DB_RECORD_NOT_FOUND:
|
case DB_RECORD_NOT_FOUND:
|
||||||
ut_print_timestamp(stderr);
|
ut_print_timestamp(stderr);
|
||||||
fprintf(stderr, " InnoDB: MySQL and InnoDB data "
|
fprintf(stderr, " InnoDB: MySQL and InnoDB data "
|
||||||
@ -2951,8 +2958,6 @@ retry:
|
|||||||
/* Init table lock structure */
|
/* Init table lock structure */
|
||||||
thr_lock_data_init(&share->lock,&lock,(void*) 0);
|
thr_lock_data_init(&share->lock,&lock,(void*) 0);
|
||||||
|
|
||||||
info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST);
|
|
||||||
|
|
||||||
/* Only if the table has an AUTOINC column. */
|
/* Only if the table has an AUTOINC column. */
|
||||||
if (prebuilt->table != NULL && table->found_next_number_field != NULL) {
|
if (prebuilt->table != NULL && table->found_next_number_field != NULL) {
|
||||||
dict_table_autoinc_lock(prebuilt->table);
|
dict_table_autoinc_lock(prebuilt->table);
|
||||||
@ -2969,6 +2974,8 @@ retry:
|
|||||||
dict_table_autoinc_unlock(prebuilt->table);
|
dict_table_autoinc_unlock(prebuilt->table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3361,12 +3361,19 @@ ha_innobase::innobase_initialize_autoinc()
|
|||||||
err = row_search_max_autoinc(index, col_name, &read_auto_inc);
|
err = row_search_max_autoinc(index, col_name, &read_auto_inc);
|
||||||
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case DB_SUCCESS:
|
case DB_SUCCESS: {
|
||||||
/* At the this stage we do not know the increment
|
ulonglong col_max_value;
|
||||||
or the offset, so use a default increment of 1. */
|
|
||||||
auto_inc = read_auto_inc + 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
col_max_value = innobase_get_int_col_max_value(field);
|
||||||
|
|
||||||
|
/* At the this stage we do not know the increment
|
||||||
|
nor the offset, so use a default increment of 1. */
|
||||||
|
|
||||||
|
auto_inc = innobase_next_autoinc(
|
||||||
|
read_auto_inc, 1, 1, col_max_value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case DB_RECORD_NOT_FOUND:
|
case DB_RECORD_NOT_FOUND:
|
||||||
ut_print_timestamp(stderr);
|
ut_print_timestamp(stderr);
|
||||||
fprintf(stderr, " InnoDB: MySQL and InnoDB data "
|
fprintf(stderr, " InnoDB: MySQL and InnoDB data "
|
||||||
@ -3661,8 +3668,6 @@ retry:
|
|||||||
dict_table_get_format(prebuilt->table));
|
dict_table_get_format(prebuilt->table));
|
||||||
}
|
}
|
||||||
|
|
||||||
info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST);
|
|
||||||
|
|
||||||
/* Only if the table has an AUTOINC column. */
|
/* Only if the table has an AUTOINC column. */
|
||||||
if (prebuilt->table != NULL && table->found_next_number_field != NULL) {
|
if (prebuilt->table != NULL && table->found_next_number_field != NULL) {
|
||||||
dict_table_autoinc_lock(prebuilt->table);
|
dict_table_autoinc_lock(prebuilt->table);
|
||||||
@ -3679,6 +3684,8 @@ retry:
|
|||||||
dict_table_autoinc_unlock(prebuilt->table);
|
dict_table_autoinc_unlock(prebuilt->table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user