summaryrefslogtreecommitdiff
path: root/sql/partition_info.cc
diff options
context:
space:
mode:
authorunknown <holyfoot@vva.(none)>2006-03-18 18:48:21 +0400
committerunknown <holyfoot@vva.(none)>2006-03-18 18:48:21 +0400
commit6a421c56cc425513901d141312bed9c744673b50 (patch)
tree352cfbefcb9f3e256bd081941ca8d1b73ef7e718 /sql/partition_info.cc
parent4ac5afa3b991654a38b39ad44880e74da06a02c3 (diff)
downloadmariadb-git-6a421c56cc425513901d141312bed9c744673b50.tar.gz
bug 17290 and bug 14350
added THD::work_part_info member where we now store modified partition_info structure. It allows no solve problem when different parts of the part_info get into different mem_roots sql/partition_info.cc: get_clone implementation sql/partition_info.h: get_clone() declared sql/sql_class.h: THD::work_part_info added sql/sql_partition.cc: thd->work_part_info instead of lex->part_info sql/sql_table.cc: thd->work_part_info instad of lex->part_info sql/unireg.cc: thd->work_part_info instad of lex->part_info
Diffstat (limited to 'sql/partition_info.cc')
-rw-r--r--sql/partition_info.cc42
1 files changed, 42 insertions, 0 deletions
diff --git a/sql/partition_info.cc b/sql/partition_info.cc
index 66e0d366116..10725878d51 100644
--- a/sql/partition_info.cc
+++ b/sql/partition_info.cc
@@ -25,6 +25,48 @@
#ifdef WITH_PARTITION_STORAGE_ENGINE
+partition_info *partition_info::get_clone()
+{
+ if (!this)
+ return 0;
+ List_iterator<partition_element> part_it(partitions);
+ partition_element *part;
+ partition_info *clone= new partition_info();
+ if (!clone)
+ {
+ mem_alloc_error(sizeof(partition_info));
+ return NULL;
+ }
+ memcpy(clone, this, sizeof(partition_info));
+ clone->partitions.empty();
+
+ while ((part= (part_it++)))
+ {
+ List_iterator<partition_element> subpart_it(part->subpartitions);
+ partition_element *subpart;
+ partition_element *part_clone= new partition_element();
+ if (!part_clone)
+ {
+ mem_alloc_error(sizeof(partition_element));
+ return NULL;
+ }
+ memcpy(part_clone, part, sizeof(partition_element));
+ part_clone->subpartitions.empty();
+ while ((subpart= (subpart_it++)))
+ {
+ partition_element *subpart_clone= new partition_element();
+ if (!subpart_clone)
+ {
+ mem_alloc_error(sizeof(partition_element));
+ return NULL;
+ }
+ memcpy(subpart_clone, subpart, sizeof(partition_element));
+ part_clone->subpartitions.push_back(subpart_clone);
+ }
+ clone->partitions.push_back(part_clone);
+ }
+ return clone;
+}
/*
Create a memory area where default partition names are stored and fill it