mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
SQL: insert delayed fix [#365 bug 3]
Affected tests (forced mode): rpl.rpl_timezone
This commit is contained in:
@ -89,7 +89,7 @@ set @str= concat('
|
|||||||
engine ', engine);
|
engine ', engine);
|
||||||
prepare stmt from @str; execute stmt; drop prepare stmt;
|
prepare stmt from @str; execute stmt; drop prepare stmt;
|
||||||
insert into t1(x, y) values(3, 4);
|
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);
|
insert into t1 values(40, 33);
|
||||||
set @str= concat('select x, y, ', fields, ' from t1');
|
set @str= concat('select x, y, ', fields, ' from t1');
|
||||||
prepare stmt from @str; execute stmt; drop prepare stmt;
|
prepare stmt from @str; execute stmt; drop prepare stmt;
|
||||||
|
@ -17,7 +17,7 @@ begin
|
|||||||
engine ', engine);
|
engine ', engine);
|
||||||
prepare stmt from @str; execute stmt; drop prepare stmt;
|
prepare stmt from @str; execute stmt; drop prepare stmt;
|
||||||
insert into t1(x, y) values(3, 4);
|
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);
|
insert into t1 values(40, 33);
|
||||||
set @str= concat('select x, y, ', fields, ' from t1');
|
set @str= concat('select x, y, ', fields, ' from t1');
|
||||||
prepare stmt from @str; execute stmt; drop prepare stmt;
|
prepare stmt from @str; execute stmt; drop prepare stmt;
|
||||||
|
@ -2221,7 +2221,9 @@ Field *Field::make_new_field(MEM_ROOT *root, TABLE *new_table,
|
|||||||
*/
|
*/
|
||||||
tmp->unireg_check= Field::NONE;
|
tmp->unireg_check= Field::NONE;
|
||||||
tmp->flags&= (NOT_NULL_FLAG | BLOB_FLAG | UNSIGNED_FLAG |
|
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();
|
tmp->reset_fields();
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
@ -8025,6 +8025,7 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
value=v++;
|
value=v++;
|
||||||
|
DBUG_ASSERT(value);
|
||||||
Field *rfield= field->field;
|
Field *rfield= field->field;
|
||||||
TABLE* table= rfield->table;
|
TABLE* table= rfield->table;
|
||||||
if (table->next_number_field &&
|
if (table->next_number_field &&
|
||||||
|
@ -683,7 +683,7 @@ Field **TABLE::field_to_fill()
|
|||||||
|
|
||||||
|
|
||||||
inline
|
inline
|
||||||
Field **TABLE::user_fields()
|
Field **TABLE::vers_user_field_to_fill()
|
||||||
{
|
{
|
||||||
if (versioned())
|
if (versioned())
|
||||||
{
|
{
|
||||||
@ -1019,7 +1019,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||||||
}
|
}
|
||||||
table->reset_default_fields();
|
table->reset_default_fields();
|
||||||
if (fill_record_n_invoke_before_triggers(thd, table,
|
if (fill_record_n_invoke_before_triggers(thd, table,
|
||||||
table->user_fields(),
|
table->vers_user_field_to_fill(),
|
||||||
*values, 0, TRG_EVENT_INSERT))
|
*values, 0, TRG_EVENT_INSERT))
|
||||||
{
|
{
|
||||||
if (values_list.elements != 1 && ! thd->is_error())
|
if (values_list.elements != 1 && ! thd->is_error())
|
||||||
@ -2597,6 +2597,9 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd)
|
|||||||
}
|
}
|
||||||
*field=0;
|
*field=0;
|
||||||
|
|
||||||
|
if (copy->versioned() && copy->vers_update_user_field())
|
||||||
|
goto error;
|
||||||
|
|
||||||
if (share->virtual_fields || share->default_expressions ||
|
if (share->virtual_fields || share->default_expressions ||
|
||||||
share->default_fields)
|
share->default_fields)
|
||||||
{
|
{
|
||||||
@ -3892,7 +3895,7 @@ void select_insert::store_values(List<Item> &values)
|
|||||||
fill_record_n_invoke_before_triggers(thd, table, *fields, values, 1,
|
fill_record_n_invoke_before_triggers(thd, table, *fields, values, 1,
|
||||||
TRG_EVENT_INSERT);
|
TRG_EVENT_INSERT);
|
||||||
else
|
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);
|
values, 1, TRG_EVENT_INSERT);
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
35
sql/table.cc
35
sql/table.cc
@ -3197,20 +3197,8 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
|
|||||||
|
|
||||||
if (share->versioned)
|
if (share->versioned)
|
||||||
{
|
{
|
||||||
Field **dst= (Field **) alloc_root(&outparam->mem_root,
|
if (outparam->vers_update_user_field())
|
||||||
(share->fields - VERSIONING_FIELDS + 1) *
|
|
||||||
sizeof(Field*));
|
|
||||||
if (!dst)
|
|
||||||
goto err;
|
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;
|
outparam->vers_write= true;
|
||||||
}
|
}
|
||||||
else
|
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
|
bool TABLE_LIST::vers_vtmd_name(String& out) const
|
||||||
{
|
{
|
||||||
static const char *vtmd_suffix= "_vtmd";
|
static const char *vtmd_suffix= "_vtmd";
|
||||||
|
@ -1487,7 +1487,8 @@ public:
|
|||||||
bool prepare_triggers_for_update_stmt_or_event();
|
bool prepare_triggers_for_update_stmt_or_event();
|
||||||
|
|
||||||
Field **field_to_fill();
|
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 validate_default_values_of_unset_fields(THD *thd) const;
|
||||||
|
|
||||||
bool insert_all_rows_into_tmp_table(THD *thd,
|
bool insert_all_rows_into_tmp_table(THD *thd,
|
||||||
|
Reference in New Issue
Block a user