BUG#21658: Crash partition test in prepared statement protocol

Review fixes
parent cb77c9b7
...@@ -869,12 +869,9 @@ bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table, ...@@ -869,12 +869,9 @@ bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table,
bool is_sub_part, bool is_field_to_be_setup) bool is_sub_part, bool is_field_to_be_setup)
{ {
MEM_ROOT new_mem_root; MEM_ROOT new_mem_root;
Query_arena partition_arena(&new_mem_root, Query_arena::INITIALIZED);
Query_arena backup_arena;
partition_info *part_info= table->part_info; partition_info *part_info= table->part_info;
uint dir_length, home_dir_length; uint dir_length, home_dir_length;
bool result= TRUE; bool result= TRUE;
bool is_prepare;
TABLE_LIST tables; TABLE_LIST tables;
TABLE_LIST *save_table_list, *save_first_table, *save_last_table; TABLE_LIST *save_table_list, *save_first_table, *save_last_table;
int error; int error;
...@@ -1424,7 +1421,6 @@ bool fix_partition_func(THD *thd, TABLE *table, ...@@ -1424,7 +1421,6 @@ bool fix_partition_func(THD *thd, TABLE *table,
bool result= TRUE; bool result= TRUE;
partition_info *part_info= table->part_info; partition_info *part_info= table->part_info;
enum_mark_columns save_mark_used_columns= thd->mark_used_columns; enum_mark_columns save_mark_used_columns= thd->mark_used_columns;
Item *thd_free_list= thd->free_list;
DBUG_ENTER("fix_partition_func"); DBUG_ENTER("fix_partition_func");
if (part_info->fixed) if (part_info->fixed)
...@@ -3426,8 +3422,7 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf, ...@@ -3426,8 +3422,7 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf,
DBUG_PRINT("info", ("Parse: %s", part_buf)); DBUG_PRINT("info", ("Parse: %s", part_buf));
if (MYSQLparse((void*)thd) || thd->is_fatal_error) if (MYSQLparse((void*)thd) || thd->is_fatal_error)
{ {
free_items(thd->free_list); thd->free_items();
thd->free_list= NULL;
goto end; goto end;
} }
/* /*
...@@ -3485,9 +3480,8 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf, ...@@ -3485,9 +3480,8 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf,
just to ensure we don't get into strange situations with the just to ensure we don't get into strange situations with the
item objects. item objects.
*/ */
free_items(thd->free_list); thd->free_items();
part_info= thd->work_part_info; part_info= thd->work_part_info;
thd->free_list= NULL;
table->s->version= 0UL; table->s->version= 0UL;
} }
} }
...@@ -3517,8 +3511,7 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf, ...@@ -3517,8 +3511,7 @@ bool mysql_unpack_partition(THD *thd, const uchar *part_buf,
!((subpart_func_string= thd->alloc(subpart_func_len))))) !((subpart_func_string= thd->alloc(subpart_func_len)))))
{ {
mem_alloc_error(part_func_len); mem_alloc_error(part_func_len);
free_items(thd->free_list); thd->free_items();
thd->free_list= NULL;
goto end; goto end;
} }
if (part_func_len) if (part_func_len)
......
...@@ -1499,10 +1499,10 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias, ...@@ -1499,10 +1499,10 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
DBUG_PRINT("info", ("autopartitioned: %u", share->auto_partitioned)); DBUG_PRINT("info", ("autopartitioned: %u", share->auto_partitioned));
if (!tmp) if (!tmp)
tmp= fix_partition_func(thd, outparam, is_create_table); tmp= fix_partition_func(thd, outparam, is_create_table);
if (!tmp)
outparam->part_info->item_free_list= part_func_arena.free_list;
thd->stmt_arena= backup_stmt_arena_ptr; thd->stmt_arena= backup_stmt_arena_ptr;
thd->restore_active_arena(&part_func_arena, &backup_arena); thd->restore_active_arena(&part_func_arena, &backup_arena);
if (!tmp)
outparam->part_info->item_free_list= part_func_arena.free_list;
if (tmp) if (tmp)
{ {
if (is_create_table) if (is_create_table)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment