エンジンを変えると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の際に使用するスキーマ情報を保持する構造体。で、ここにコピーすれば情報を喪失しないっと。