diff options
author | unknown <holyfoot@vva.(none)> | 2006-03-18 18:48:21 +0400 |
---|---|---|
committer | unknown <holyfoot@vva.(none)> | 2006-03-18 18:48:21 +0400 |
commit | 6a421c56cc425513901d141312bed9c744673b50 (patch) | |
tree | 352cfbefcb9f3e256bd081941ca8d1b73ef7e718 /sql/partition_info.cc | |
parent | 4ac5afa3b991654a38b39ad44880e74da06a02c3 (diff) | |
download | mariadb-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.cc | 42 |
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 |