diff --git a/mysql-test/suite/versioning/r/insert.result b/mysql-test/suite/versioning/r/insert.result index f01ba09584e..33ae4b14bcd 100644 --- a/mysql-test/suite/versioning/r/insert.result +++ b/mysql-test/suite/versioning/r/insert.result @@ -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; diff --git a/mysql-test/suite/versioning/t/insert.test b/mysql-test/suite/versioning/t/insert.test index cf5d1659223..b7fda5db1b5 100644 --- a/mysql-test/suite/versioning/t/insert.test +++ b/mysql-test/suite/versioning/t/insert.test @@ -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; diff --git a/sql/field.cc b/sql/field.cc index 6edce708436..1de7df47d16 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -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; } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 1eb4dfc9c29..d4de5bf1405 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -8025,6 +8025,7 @@ fill_record(THD *thd, TABLE *table_arg, List &fields, List &values, goto err; } value=v++; + DBUG_ASSERT(value); Field *rfield= field->field; TABLE* table= rfield->table; if (table->next_number_field && diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index cb652d5f446..032ed66c9ac 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -683,7 +683,7 @@ Field **TABLE::field_to_fill() inline -Field **TABLE::user_fields() +Field **TABLE::vers_user_field_to_fill() { if (versioned()) { @@ -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()) @@ -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) { @@ -3892,7 +3895,7 @@ void select_insert::store_values(List &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; diff --git a/sql/table.cc b/sql/table.cc index d5baada386f..65035acce9f 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -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 @@ -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"; diff --git a/sql/table.h b/sql/table.h index 1bc4a6151b7..4a8dacc79bd 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1487,7 +1487,8 @@ public: 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,