diff options
Diffstat (limited to 'sql/sql_table.cc')
-rw-r--r-- | sql/sql_table.cc | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 3d5aaf0c2ec..7505dec0ab6 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3300,13 +3300,14 @@ copy_data_between_tables(TABLE *from,TABLE *to, List<Item> all_fields; ha_rows examined_rows; bool auto_increment_field_copied= 0; - ulong old_sql_mode; - bool no_auto_on_zero; + ulong save_sql_mode; DBUG_ENTER("copy_data_between_tables"); if (!(copy= new Copy_field[to->fields])) DBUG_RETURN(-1); /* purecov: inspected */ + save_sql_mode= thd->variables.sql_mode; + to->file->external_lock(thd,F_WRLCK); from->file->info(HA_STATUS_VARIABLE); to->file->start_bulk_insert(from->file->records); @@ -3320,7 +3321,17 @@ copy_data_between_tables(TABLE *from,TABLE *to, if (def->field) { if (*ptr == to->next_number_field) + { auto_increment_field_copied= TRUE; + /* + If we are going to copy contents of one auto_increment column to + another auto_increment column it is sensible to preserve zeroes. + This condition also covers case when we are don't actually alter + auto_increment column. + */ + if (def->field == from->found_next_number_field) + thd->variables.sql_mode|= MODE_NO_AUTO_VALUE_ON_ZERO; + } (copy_end++)->set(*ptr,def->field,0); } @@ -3360,11 +3371,6 @@ copy_data_between_tables(TABLE *from,TABLE *to, goto err; } - /* Turn on NO_AUTO_VALUE_ON_ZERO if not already on */ - old_sql_mode= thd->variables.sql_mode; - if (!(no_auto_on_zero= thd->variables.sql_mode & MODE_NO_AUTO_VALUE_ON_ZERO)) - thd->variables.sql_mode|= MODE_NO_AUTO_VALUE_ON_ZERO; - /* Handler must be told explicitly to retrieve all columns, because this function does not set field->query_id in the columns to the current query id */ @@ -3422,10 +3428,6 @@ copy_data_between_tables(TABLE *from,TABLE *to, ha_enable_transaction(thd,TRUE); - /* Turn off NO_AUTO_VALUE_ON_ZERO if it was not already off */ - if (!no_auto_on_zero) - thd->variables.sql_mode= old_sql_mode; - /* Ensure that the new table is saved properly to disk so that we can do a rename @@ -3437,6 +3439,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, if (to->file->external_lock(thd,F_UNLCK)) error=1; err: + thd->variables.sql_mode= save_sql_mode; free_io_cache(from); *copied= found_count; *deleted=delete_count; |