Commit 3bee8907 authored by unknown's avatar unknown
Browse files

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.
parent 89e77b65
Loading
Loading
Loading
Loading
+42 −1
Original line number Diff line number Diff line
@@ -1327,6 +1327,12 @@ innobase_commit(
			that the current SQL statement ended */
{
	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)))) {