Skip to content

Commit

Permalink
SQL: insert delayed fix [#365 bug 3]
Browse files Browse the repository at this point in the history
Affected tests (forced mode): rpl.rpl_timezone
  • Loading branch information
midenok committed Nov 29, 2017
1 parent 8d548f8 commit 2305666
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 20 deletions.
2 changes: 1 addition & 1 deletion mysql-test/suite/versioning/r/insert.result
Expand Up @@ -89,7 +89,7 @@ set @str= concat('
engine ', engine);
prepare stmt from @str; execute stmt; drop prepare stmt;
insert into t1(x, y) values(3, 4);
insert into t1(x, y) values(2, 3);
insert delayed into t1(x, y) values(2, 3);
insert into t1 values(40, 33);
set @str= concat('select x, y, ', fields, ' from t1');
prepare stmt from @str; execute stmt; drop prepare stmt;
Expand Down
2 changes: 1 addition & 1 deletion mysql-test/suite/versioning/t/insert.test
Expand Up @@ -17,7 +17,7 @@ begin
engine ', engine);
prepare stmt from @str; execute stmt; drop prepare stmt;
insert into t1(x, y) values(3, 4);
insert into t1(x, y) values(2, 3);
insert delayed into t1(x, y) values(2, 3);
insert into t1 values(40, 33);
set @str= concat('select x, y, ', fields, ' from t1');
prepare stmt from @str; execute stmt; drop prepare stmt;
Expand Down
4 changes: 3 additions & 1 deletion sql/field.cc
Expand Up @@ -2221,7 +2221,9 @@ Field *Field::make_new_field(MEM_ROOT *root, TABLE *new_table,
*/
tmp->unireg_check= Field::NONE;
tmp->flags&= (NOT_NULL_FLAG | BLOB_FLAG | UNSIGNED_FLAG |
ZEROFILL_FLAG | BINARY_FLAG | ENUM_FLAG | SET_FLAG);
ZEROFILL_FLAG | BINARY_FLAG | ENUM_FLAG | SET_FLAG |
VERS_SYS_START_FLAG | VERS_SYS_END_FLAG |
VERS_UPDATE_UNVERSIONED_FLAG | HIDDEN_FLAG);
tmp->reset_fields();
return tmp;
}
Expand Down
1 change: 1 addition & 0 deletions sql/sql_base.cc
Expand Up @@ -8025,6 +8025,7 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
goto err;
}
value=v++;
DBUG_ASSERT(value);
Field *rfield= field->field;
TABLE* table= rfield->table;
if (table->next_number_field &&
Expand Down
9 changes: 6 additions & 3 deletions sql/sql_insert.cc
Expand Up @@ -683,7 +683,7 @@ Field **TABLE::field_to_fill()


inline
Field **TABLE::user_fields()
Field **TABLE::vers_user_field_to_fill()
{
if (versioned())
{
Expand Down Expand Up @@ -1019,7 +1019,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
}
table->reset_default_fields();
if (fill_record_n_invoke_before_triggers(thd, table,
table->user_fields(),
table->vers_user_field_to_fill(),
*values, 0, TRG_EVENT_INSERT))
{
if (values_list.elements != 1 && ! thd->is_error())
Expand Down Expand Up @@ -2597,6 +2597,9 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
}
*field=0;

if (copy->versioned() && copy->vers_update_user_field())
goto error;

if (share->virtual_fields || share->default_expressions ||
share->default_fields)
{
Expand Down Expand Up @@ -3892,7 +3895,7 @@ void select_insert::store_values(List<Item> &values)
fill_record_n_invoke_before_triggers(thd, table, *fields, values, 1,
TRG_EVENT_INSERT);
else
fill_record_n_invoke_before_triggers(thd, table, table->user_fields(),
fill_record_n_invoke_before_triggers(thd, table, table->vers_user_field_to_fill(),
values, 1, TRG_EVENT_INSERT);

DBUG_VOID_RETURN;
Expand Down
35 changes: 22 additions & 13 deletions sql/table.cc
Expand Up @@ -3197,20 +3197,8 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,

if (share->versioned)
{
Field **dst= (Field **) alloc_root(&outparam->mem_root,
(share->fields - VERSIONING_FIELDS + 1) *
sizeof(Field*));
if (!dst)
if (outparam->vers_update_user_field())
goto err;

outparam->vers_user_field= dst;
for (Field **src= outparam->field; *src; src++)
{
if ((*src)->vers_sys_field())
continue;
*dst++= *src;
}
(*dst)= NULL;
outparam->vers_write= true;
}
else
Expand Down Expand Up @@ -7714,6 +7702,27 @@ void TABLE::vers_update_fields()
}


bool TABLE::vers_update_user_field()
{
DBUG_ASSERT(versioned());
Field **dst= (Field **) alloc_root(&mem_root,
(s->fields - VERSIONING_FIELDS + 1) *
sizeof(Field*));
if (!dst)
return true;

vers_user_field= dst;
for (Field **src= field; *src; src++)
{
if ((*src)->vers_sys_field())
continue;
*dst++= *src;
}
(*dst)= NULL;
return false;
}


bool TABLE_LIST::vers_vtmd_name(String& out) const
{
static const char *vtmd_suffix= "_vtmd";
Expand Down
3 changes: 2 additions & 1 deletion sql/table.h
Expand Up @@ -1487,7 +1487,8 @@ struct TABLE
bool prepare_triggers_for_update_stmt_or_event();

Field **field_to_fill();
Field **user_fields();
Field **vers_user_field_to_fill();
bool vers_update_user_field();
bool validate_default_values_of_unset_fields(THD *thd) const;

bool insert_all_rows_into_tmp_table(THD *thd,
Expand Down

0 comments on commit 2305666

Please sign in to comment.