diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2022-04-06 09:31:59 +0200 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2022-04-06 09:35:58 +0200 |
commit | 16f2cf8f6fff884d75c5680230e2a54009ae5097 (patch) | |
tree | 116d781590c61e2c59e2e3e0f98910068eec2b6e /sql/table.cc | |
parent | 75b9014fedd8bb85d15501a2281fbade6b56fe78 (diff) | |
download | mariadb-git-bb-10.2-MDEV-25638.tar.gz |
MDEV-25638 Assertion `!result' failed in convert_const_to_intbb-10.2-MDEV-25638
The test suite triggers 3 bugs:
I. Absence of STATUS_NO_RECORD on an empty record
II. Mismatch signed and unsigned becaue parameter is not
taking from the item but was a constant.
III. Problem with rollback changes made for Items in the TABLE object:
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
So looking on the above all changes in the expressions belonged to
a TABLE object should be just ignored.
Diffstat (limited to 'sql/table.cc')
-rw-r--r-- | sql/table.cc | 25 |
1 files changed, 25 insertions, 0 deletions
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))) |