diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item_cmpfunc.cc | 2 | ||||
-rw-r--r-- | sql/sql_class.h | 1 | ||||
-rw-r--r-- | sql/table.cc | 25 |
3 files changed, 27 insertions, 1 deletions
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 3a76982d80e..0907ec64232 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -471,7 +471,7 @@ static bool convert_const_to_int(THD *thd, Item_field *field_item, /* Restore the original field value. */ if (save_field_value) { - result= field->store(orig_field_val, TRUE); + result= field->store(orig_field_val, field_item->unsigned_flag); /* orig_field_val must be a valid value that can be restored back. */ DBUG_ASSERT(!result); } diff --git a/sql/sql_class.h b/sql/sql_class.h index d3d54e11671..6d9118cf0c4 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1342,6 +1342,7 @@ public: change_list.move_elements_to(&to->change_list); } bool is_empty() { return change_list.is_empty(); } + void empty_change_list() { change_list.empty(); } }; diff --git a/sql/table.cc b/sql/table.cc index 1f7b6452303..662b2b0830a 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1016,6 +1016,7 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table, Virtual_column_info **check_constraint_ptr= table->check_constraints; sql_mode_t saved_mode= thd->variables.sql_mode; Query_arena backup_arena; + Item_change_list change_list_backup; Virtual_column_info *vcol= 0; StringBuffer<MAX_FIELD_WIDTH> expr_str; bool res= 1; @@ -1039,6 +1040,8 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table, thd->set_n_backup_active_arena(table->expr_arena, &backup_arena); thd->stmt_arena= table->expr_arena; + // see following comment after end: label and near thd->empty_change_list() + thd->move_elements_to(&change_list_backup); thd->update_charset(&my_charset_utf8mb4_general_ci, table->s->table_charset); expr_str.append(&parse_vcol_keyword); thd->variables.sql_mode &= ~MODE_NO_BACKSLASH_ESCAPES; @@ -1167,6 +1170,27 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table, end: thd->restore_active_arena(table->expr_arena, &backup_arena); thd->stmt_arena= backup_stmt_arena_ptr; + /* + A cycle of live of Items (expressions) in table is following: + + 1) Parsed in the query arena of the table + 2) Prepared with the permanent query arena of the table be active as a + runtime and stmt (permanent) arena (here is difference from usual + execution) + 3) usage (can be sorter of one query live (CREATE TABLE for example) or + longer then several queries (SELECT and using table cache), it is not a + problem because all fields are local to the table). + 4) cleanup and deallocate with the TABLE object + + With such live cycle we do not need to rollback temporary changes in + this item tree so can just remove them to avoid problem of a try to be + rollback with current query (if the cycle was sorter then the query it + will lead to changes in freed memory, in the other case it will + rollback changes after the first query which will not be redone for + the next query). + */ + thd->empty_change_list(); + change_list_backup.move_elements_to(thd); if (save_character_set_client) thd->update_charset(save_character_set_client, save_collation); thd->variables.sql_mode= saved_mode; @@ -3104,6 +3128,7 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share, outparam->s= share; outparam->db_stat= db_stat; outparam->write_row_record= NULL; + outparam->status= STATUS_NO_RECORD; if (share->incompatible_version && !(ha_open_flags & (HA_OPEN_FOR_ALTER | HA_OPEN_FOR_REPAIR))) |