Commit 08973f5c 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).
  It cant be put on commit because ALTER TABLE will commit on every 10000 rows.
  Therefore, this change must be done when a new temporary table is created
  in the ALTER TABLE.
parent 3bee8907
Loading
Loading
Loading
Loading
+15 −41
Original line number Diff line number Diff line
@@ -1327,12 +1327,6 @@ 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"));
@@ -1367,41 +1361,6 @@ 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)))) {
	        
@@ -3871,6 +3830,7 @@ ha_innobase::create(
	char		name2[FN_REFLEN];
	char		norm_name[FN_REFLEN];
	THD		*thd= current_thd;
	ib_longlong     auto_inc_value;

  	DBUG_ENTER("ha_innobase::create");

@@ -4041,6 +4001,20 @@ ha_innobase::create(

	DBUG_ASSERT(innobase_table != 0);

	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. */

		auto_inc_value = thd->lex->create_info.auto_increment_value;
		dict_table_autoinc_initialize(innobase_table, auto_inc_value);
	}

	/* Tell the InnoDB server that there might be work for
	utility threads: */