Commit e61eed60 authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

merge LP BUG#68606

parents e3ed7463 f1976319
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
# cover tables mysqltest.$mms_tname1,...$mms_tnameN # cover tables mysqltest.$mms_tname1,...$mms_tnameN
connection admin; connection admin;
--source include/wait_until_connected_again.inc
let $mms_table_to_use=$mms_tables; let $mms_table_to_use=$mms_tables;
let $mms_purpose=comparison; let $mms_purpose=comparison;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
connection admin; connection admin;
--source include/wait_until_connected_again.inc
let $mms_table_to_use=$mms_tables; let $mms_table_to_use=$mms_tables;
let $mms_purpose=feeding_recovery; let $mms_purpose=feeding_recovery;
......
...@@ -8467,28 +8467,33 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors, ...@@ -8467,28 +8467,33 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors,
List<TABLE> tbl_list; List<TABLE> tbl_list;
Item *value; Item *value;
TABLE *table= 0; TABLE *table= 0;
Field *field;
bool abort_on_warning_saved= thd->abort_on_warning; bool abort_on_warning_saved= thd->abort_on_warning;
DBUG_ENTER("fill_record"); DBUG_ENTER("fill_record");
Field *field; if (!*ptr)
tbl_list.empty();
/*
Reset the table->auto_increment_field_not_null as it is valid for
only one row.
*/
if (*ptr)
{ {
/* No fields to update, quite strange!*/
DBUG_RETURN(0);
}
/* /*
On INSERT or UPDATE fields are checked to be from the same table, On INSERT or UPDATE fields are checked to be from the same table,
thus we safely can take table from the first field. thus we safely can take table from the first field.
*/ */
table= (*ptr)->table; table= (*ptr)->table;
/*
Reset the table->auto_increment_field_not_null as it is valid for
only one row.
*/
table->auto_increment_field_not_null= FALSE; table->auto_increment_field_not_null= FALSE;
}
while ((field = *ptr++) && ! thd->is_error()) while ((field = *ptr++) && ! thd->is_error())
{ {
/* Ensure that all fields are from the same table */
DBUG_ASSERT(field->table == table);
value=v++; value=v++;
table= field->table;
if (field == table->next_number_field) if (field == table->next_number_field)
table->auto_increment_field_not_null= TRUE; table->auto_increment_field_not_null= TRUE;
if (field->vcol_info && if (field->vcol_info &&
...@@ -8503,44 +8508,22 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors, ...@@ -8503,44 +8508,22 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors,
field->field_name, table->s->table_name.str); field->field_name, table->s->table_name.str);
thd->abort_on_warning= abort_on_warning_saved; thd->abort_on_warning= abort_on_warning_saved;
} }
if (use_value) if (use_value)
value->save_val(field); value->save_val(field);
else else
if (value->save_in_field(field, 0) < 0) if (value->save_in_field(field, 0) < 0)
goto err; goto err;
tbl_list.push_back(table);
} }
/* Update virtual fields*/ /* Update virtual fields*/
thd->abort_on_warning= FALSE; thd->abort_on_warning= FALSE;
if (tbl_list.head()) if (table->vfield && update_virtual_fields(thd, table, TRUE))
{
List_iterator_fast<TABLE> t(tbl_list);
TABLE *prev_table= 0;
while ((table= t++))
{
/*
Do simple optimization to prevent unnecessary re-generating
values for virtual fields
*/
if (table != prev_table)
{
prev_table= table;
if (table->vfield)
{
if (update_virtual_fields(thd, table, TRUE))
{
goto err; goto err;
}
}
}
}
}
thd->abort_on_warning= abort_on_warning_saved; thd->abort_on_warning= abort_on_warning_saved;
DBUG_RETURN(thd->is_error()); DBUG_RETURN(thd->is_error());
err: err:
thd->abort_on_warning= abort_on_warning_saved; thd->abort_on_warning= abort_on_warning_saved;
if (table)
table->auto_increment_field_not_null= FALSE; table->auto_increment_field_not_null= FALSE;
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment