diff options
author | unknown <holyfoot/hf@hfmain.(none)> | 2007-06-25 14:28:30 +0500 |
---|---|---|
committer | unknown <holyfoot/hf@hfmain.(none)> | 2007-06-25 14:28:30 +0500 |
commit | 7a310d32344d97b265bfffdc89897b6727e45b97 (patch) | |
tree | 92ebe1a8c370f4ac63a8cf0804e3d98447a08cf3 /sql | |
parent | 475a08a2f77092781539fc013255f0aab62ca5dd (diff) | |
parent | 50563d39309ba82448a31f6a98e40181422f5147 (diff) | |
download | mariadb-git-7a310d32344d97b265bfffdc89897b6727e45b97.tar.gz |
Merge bk@192.168.21.1:mysql-5.1-opt
into mysql.com:/home/hf/work/27084/my51-27084
sql/item_cmpfunc.cc:
Auto merged
sql/item_cmpfunc.h:
Auto merged
sql/sql_partition.h:
Auto merged
sql/table.cc:
Auto merged
mysql-test/r/partition.result:
merging
mysql-test/t/partition.test:
merging
sql/sql_partition.cc:
SCCS merged
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item_cmpfunc.cc | 15 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 13 | ||||
-rw-r--r-- | sql/sql_partition.cc | 7 | ||||
-rw-r--r-- | sql/sql_partition.h | 3 | ||||
-rw-r--r-- | sql/table.cc | 13 |
5 files changed, 35 insertions, 16 deletions
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 543bc827c48..3477ce84b21 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -2586,6 +2586,21 @@ void Item_func_case::print(String *str) str->append(STRING_WITH_LEN("end)")); } + +void Item_func_case::cleanup() +{ + uint i; + DBUG_ENTER("Item_func_case::cleanup"); + Item_func::cleanup(); + for (i= 0; i <= (uint)DECIMAL_RESULT; i++) + { + delete cmp_items[i]; + cmp_items[i]= 0; + } + DBUG_VOID_RETURN; +} + + /* Coalesce - return first not NULL argument. */ diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 60f2ac6321d..1bc52ea093c 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -1142,18 +1142,7 @@ public: Item *find_item(String *str); CHARSET_INFO *compare_collation() { return cmp_collation.collation; } bool check_partition_func_processor(uchar *bool_arg) { return FALSE;} - void cleanup() - { - uint i; - DBUG_ENTER("Item_func_case::cleanup"); - Item_func::cleanup(); - for (i= 0; i <= (uint)DECIMAL_RESULT; i++) - { - delete cmp_items[i]; - cmp_items[i]= 0; - } - DBUG_VOID_RETURN; - } + void cleanup(); }; /* diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 407a0b3dcf2..ad3cf2d3e7a 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -3663,6 +3663,8 @@ void get_partition_set(const TABLE *table, uchar *buf, const uint index, table Table object of partitioned table create_table_ind Is it called from CREATE TABLE default_db_type What is the default engine of the table + work_part_info_used Flag is raised if we don't create new + part_info, but used thd->work_part_info RETURN VALUE TRUE Error @@ -3683,7 +3685,8 @@ bool mysql_unpack_partition(THD *thd, const char *part_buf, uint part_info_len, const char *part_state, uint part_state_len, TABLE* table, bool is_create_table_ind, - handlerton *default_db_type) + handlerton *default_db_type, + bool *work_part_info_used) { bool result= TRUE; partition_info *part_info; @@ -3698,6 +3701,7 @@ bool mysql_unpack_partition(THD *thd, Lex_input_stream lip(thd, part_buf, part_info_len); lex_start(thd); + *work_part_info_used= false; /* We need to use the current SELECT_LEX since I need to keep the Name_resolution_context object which is referenced from the @@ -3782,6 +3786,7 @@ bool mysql_unpack_partition(THD *thd, thd->free_items(); part_info= thd->work_part_info; table->s->version= 0UL; + *work_part_info_used= true; } } table->part_info= part_info; diff --git a/sql/sql_partition.h b/sql/sql_partition.h index d0c66083768..56f24181b93 100644 --- a/sql/sql_partition.h +++ b/sql/sql_partition.h @@ -81,7 +81,8 @@ bool mysql_unpack_partition(THD *thd, const char *part_buf, uint part_info_len, const char *part_state, uint part_state_len, TABLE *table, bool is_create_table_ind, - handlerton *default_db_type); + handlerton *default_db_type, + bool *work_part_info_used); void make_used_partitions_str(partition_info *part_info, String *parts_str); uint32 get_list_array_idx_for_endpoint(partition_info *part_info, bool left_endpoint, diff --git a/sql/table.cc b/sql/table.cc index eab4d175fd8..45ca17afce4 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1589,21 +1589,30 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias, thd->set_n_backup_active_arena(&part_func_arena, &backup_arena); thd->stmt_arena= &part_func_arena; bool tmp; + bool work_part_info_used; tmp= mysql_unpack_partition(thd, share->partition_info, share->partition_info_len, share->part_state, share->part_state_len, outparam, is_create_table, - share->default_part_db_type); + share->default_part_db_type, + &work_part_info_used); outparam->part_info->is_auto_partitioned= share->auto_partitioned; DBUG_PRINT("info", ("autopartitioned: %u", share->auto_partitioned)); - if (!tmp) + /* we should perform the fix_partition_func in either local or + caller's arena depending on work_part_info_used value + */ + if (!tmp && !work_part_info_used) tmp= fix_partition_func(thd, outparam, is_create_table); thd->stmt_arena= backup_stmt_arena_ptr; thd->restore_active_arena(&part_func_arena, &backup_arena); if (!tmp) + { + if (work_part_info_used) + tmp= fix_partition_func(thd, outparam, is_create_table); outparam->part_info->item_free_list= part_func_arena.free_list; + } if (tmp) { if (is_create_table) |