Commit 09eb23d5 authored by Sunny Bains's avatar Sunny Bains

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
parent b37256b1
...@@ -1244,3 +1244,16 @@ t1 CREATE TABLE `t1` ( ...@@ -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); ...@@ -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() ...@@ -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: {
ulonglong col_max_value;
col_max_value = innobase_get_int_col_max_value(field);
/* At the this stage we do not know the increment /* At the this stage we do not know the increment
or the offset, so use a default increment of 1. */ nor the offset, so use a default increment of 1. */
auto_inc = read_auto_inc + 1;
break; 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 @@ ha_innobase::open( ...@@ -2951,8 +2958,6 @@ ha_innobase::open(
/* 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 @@ ha_innobase::open( ...@@ -2969,6 +2974,8 @@ ha_innobase::open(
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() ...@@ -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: {
ulonglong col_max_value;
col_max_value = innobase_get_int_col_max_value(field);
/* At the this stage we do not know the increment /* At the this stage we do not know the increment
or the offset, so use a default increment of 1. */ nor the offset, so use a default increment of 1. */
auto_inc = read_auto_inc + 1;
break; 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 @@ ha_innobase::open( ...@@ -3661,8 +3668,6 @@ ha_innobase::open(
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 @@ ha_innobase::open( ...@@ -3679,6 +3684,8 @@ ha_innobase::open(
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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment