エンジンを変えるとAUTO_INCREMENT値を喪失するバグの修正

ここ数日、面白いcommitログがこないのでマイナーネタでも。

alter table foo auto_increment = 50;

こんな感じでauto_increment値を設定した直後にALTER TABLEでエンジンを変更すると、この値がコピーされないというバグがあったようです。
http://bugs.mysql.com/bug.php?id=25262

で、それが修正されたようです。ver5.0系ですね。
http://lists.mysql.com/commits/19486
以下はbugfixパッチ。関数名書いてないけど、多分mysql_alter_table関数にて。

--- 1.333/sql/sql_table.cc	2007-01-26 13:36:47 +01:00
+++ 1.334/sql/sql_table.cc	2007-02-07 14:58:49 +01:00
@@ -3274,6 +3274,12 @@
     create_info->avg_row_length= table->s->avg_row_length;
   if (!(used_fields & HA_CREATE_USED_DEFAULT_CHARSET))
     create_info->default_table_charset= table->s->table_charset;
+  if (!(used_fields & HA_CREATE_USED_AUTO) &&
table->found_next_number_field)
+  {
+    /* Table has an autoincrement, copy value to new table */
+    table->file->info(HA_STATUS_AUTO);
+    create_info->auto_increment_value= table->file->auto_increment_value;
+  }
 
   restore_record(table, s->default_values);     // Empty record for DEFAULT
   List_iterator<Alter_drop> drop_it(alter_info->drop_list);

tableってのが、上位層でのテーブル構造体。fileってのがhandlerオブジェクト。handler::info関数は引数にフラグを渡してあげると、そのフラグに対応した情報をエンジン内部で取得してくれる。この文脈では、infoよびだしによって、handler::auto_increment_valueに値が格納されていると思われる。

create_infoはCREATE TABLEやALTER TABLEの際に使用するスキーマ情報を保持する構造体。で、ここにコピーすれば情報を喪失しないっと。