summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <jan@hundin.mysql.fi>2004-12-13 10:57:26 +0200
committerunknown <jan@hundin.mysql.fi>2004-12-13 10:57:26 +0200
commit3bee89076ee2a18ce73f2283db44fdb76fa4145d (patch)
tree31664aa590a218b6b9fa121ae357bee0bcd754eb /sql
parent89e77b65cd6999d1b6567f1744fbd35659d9d7b7 (diff)
downloadmariadb-git-3bee89076ee2a18ce73f2283db44fdb76fa4145d.tar.gz
Fixed a bug no error message for ALTER with InnoDB and AUTO_INCREMENT (Bug #7061).
sql/ha_innodb.cc: Fixed a bug no error message for ALTER with InnoDB and AUTO_INCREMENT (Bug #7061). If AUTO_INCREMENT is given in the ALTER TABLE, this value is now set to the auto increment value of the table if the new value is creater or equal than the current value of the auto increment value. If the new value is less than the old value no error message is given and the old value is not changed.
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_innodb.cc43
1 files changed, 42 insertions, 1 deletions
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index 0c7fc23ee49..ff6239cf4ce 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -1326,7 +1326,13 @@ innobase_commit(
&innodb_dummy_stmt_trx_handle: the latter means
that the current SQL statement ended */
{
- trx_t* trx;
+ trx_t* trx;
+ dict_table_t* table;
+ ib_longlong auto_inc_value;
+ ib_longlong aic_new;
+ char table_name[1000];
+ ulint db_name_len;
+ ulint table_name_len;
DBUG_ENTER("innobase_commit");
DBUG_PRINT("trans", ("ending transaction"));
@@ -1361,6 +1367,41 @@ innobase_commit(
"InnoDB: but trx->conc_state != TRX_NOT_STARTED\n");
}
+ if (thd->lex->sql_command == SQLCOM_ALTER_TABLE &&
+ (thd->lex->create_info.used_fields & HA_CREATE_USED_AUTO) &&
+ (thd->lex->create_info.auto_increment_value != 0)) {
+
+ /* Query was ALTER TABLE...AUTO_INC = x; Find out a table
+ definition from the dictionary and get the current value
+ of the auto increment field. Set a new value to the
+ auto increment field if the new value is creater than
+ the current value. */
+
+ aic_new = thd->lex->create_info.auto_increment_value;
+ db_name_len = strlen(thd->lex->query_tables->db);
+ table_name_len = strlen(thd->lex->query_tables->real_name);
+
+ ut_ad((db_name_len + 1 + table_name_len) < 999);
+ strcpy(table_name, thd->lex->query_tables->db);
+ strcat(table_name, "/");
+ strcat(table_name, thd->lex->query_tables->real_name);
+
+ table = dict_table_get(table_name, trx);
+
+ if (table) {
+ auto_inc_value = dict_table_autoinc_peek(table);
+
+ if( auto_inc_value < aic_new) {
+
+ /* We have to decrease the new auto increment
+ value by one because this function will increase
+ the value given by one. */
+
+ dict_table_autoinc_update(table, aic_new - 1);
+ }
+ }
+ }
+
if (trx_handle != (void*)&innodb_dummy_stmt_trx_handle
|| (!(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)))) {