mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
merge LP BUG#68606
This commit is contained in:
@@ -8467,28 +8467,33 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors,
|
||||
List<TABLE> tbl_list;
|
||||
Item *value;
|
||||
TABLE *table= 0;
|
||||
Field *field;
|
||||
bool abort_on_warning_saved= thd->abort_on_warning;
|
||||
DBUG_ENTER("fill_record");
|
||||
|
||||
Field *field;
|
||||
tbl_list.empty();
|
||||
if (!*ptr)
|
||||
{
|
||||
/* 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
|
||||
only one row.
|
||||
*/
|
||||
if (*ptr)
|
||||
{
|
||||
/*
|
||||
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;
|
||||
}
|
||||
table->auto_increment_field_not_null= FALSE;
|
||||
while ((field = *ptr++) && ! thd->is_error())
|
||||
{
|
||||
/* Ensure that all fields are from the same table */
|
||||
DBUG_ASSERT(field->table == table);
|
||||
|
||||
value=v++;
|
||||
table= field->table;
|
||||
if (field == table->next_number_field)
|
||||
table->auto_increment_field_not_null= TRUE;
|
||||
if (field->vcol_info &&
|
||||
@@ -8503,45 +8508,23 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors,
|
||||
field->field_name, table->s->table_name.str);
|
||||
thd->abort_on_warning= abort_on_warning_saved;
|
||||
}
|
||||
|
||||
if (use_value)
|
||||
value->save_val(field);
|
||||
else
|
||||
if (value->save_in_field(field, 0) < 0)
|
||||
goto err;
|
||||
tbl_list.push_back(table);
|
||||
}
|
||||
/* Update virtual fields*/
|
||||
thd->abort_on_warning= FALSE;
|
||||
if (tbl_list.head())
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (table->vfield && update_virtual_fields(thd, table, TRUE))
|
||||
goto err;
|
||||
thd->abort_on_warning= abort_on_warning_saved;
|
||||
DBUG_RETURN(thd->is_error());
|
||||
|
||||
err:
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user