summaryrefslogtreecommitdiff
path: root/sql/sql_table.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_table.cc')
-rw-r--r--sql/sql_table.cc25
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;