summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <holyfoot/hf@hfmain.(none)>2007-06-25 14:28:30 +0500
committerunknown <holyfoot/hf@hfmain.(none)>2007-06-25 14:28:30 +0500
commit7a310d32344d97b265bfffdc89897b6727e45b97 (patch)
tree92ebe1a8c370f4ac63a8cf0804e3d98447a08cf3 /sql
parent475a08a2f77092781539fc013255f0aab62ca5dd (diff)
parent50563d39309ba82448a31f6a98e40181422f5147 (diff)
downloadmariadb-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.cc15
-rw-r--r--sql/item_cmpfunc.h13
-rw-r--r--sql/sql_partition.cc7
-rw-r--r--sql/sql_partition.h3
-rw-r--r--sql/table.cc13
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)