Commit f2f5fd36 authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

merge LP BUG#68606

parents 69027708 1d8cfe3c
...@@ -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(); {
/* No fields to update, quite strange!*/
DBUG_RETURN(0);
}
/*
On INSERT or UPDATE fields are checked to be from the same table,
thus we safely can take table from the first field.
*/
table= (*ptr)->table;
/* /*
Reset the table->auto_increment_field_not_null as it is valid for Reset the table->auto_increment_field_not_null as it is valid for
only one row. only one row.
*/ */
if (*ptr) table->auto_increment_field_not_null= FALSE;
{
/*
On INSERT or UPDATE fields are checked to be from the same table,
thus we safely can take table from the first field.
*/
table= (*ptr)->table;
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,45 +8508,23 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors, ...@@ -8503,45 +8508,23 @@ 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))
{ goto err;
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;
}
}
}
}
}
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