summaryrefslogtreecommitdiff
path: root/sql/sql_partition.cc
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2021-12-20 20:14:56 +0300
committerAleksey Midenkov <midenok@gmail.com>2021-12-21 00:23:11 +0300
commit394f68f8adb0406bb283228ad77305eebd349a8b (patch)
tree00c188b7de3c2f47d90bb03473b0e2831db4cb18 /sql/sql_partition.cc
parent86a5c6fcfe7347622337cec7ae963f7c387f1296 (diff)
downloadmariadb-git-bb-10.7-midenok-MDEV-17554.tar.gz
MDEV-27328 Change of SYSTEM_TIME partitioning options is not possible without data copybb-10.7-midenok-MDEV-17554
When we need to add/remove or change LIMIT, INTERVAL, AUTO (10.8 and more) we have to recreate partitioning from scratch. Such operations should be done fast. To remove options like LIMIT or INTERVAL one should write: alter table t1 partition by system_time; The command checks whether it is new or existing SYSTEM_TIME partitioning. And in the case of new it behaves as CREATE would do: adds default number of partitions (2). If SYSTEM_TIME partitioning already existed it just changes its options: removes unspecified ones and adds/changes those specified explicitly. In case when partitions list was supplied it behaves as usual: does full repartitioning.
Diffstat (limited to 'sql/sql_partition.cc')
-rw-r--r--sql/sql_partition.cc31
1 files changed, 30 insertions, 1 deletions
diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc
index 2e23662349f..9f939ec93d0 100644
--- a/sql/sql_partition.cc
+++ b/sql/sql_partition.cc
@@ -5046,6 +5046,10 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
my_error(ER_PARTITION_WRONG_VALUES_ERROR, MYF(0),
"LIST", "IN");
}
+ /*
+ Adding history partitions to non-history partitioning or
+ non-history parittions to history partitioning is prohibited.
+ */
else if (thd->work_part_info->part_type == VERSIONING_PARTITION ||
tab_part_info->part_type == VERSIONING_PARTITION)
{
@@ -5328,6 +5332,7 @@ that are reorganised.
{
if (el->type == partition_element::CURRENT)
{
+ /* now_part is always last partition, we add it to the end of partitions list. */
it.remove();
now_part= el;
}
@@ -5957,11 +5962,35 @@ the generated partition syntax in a correct manner.
{
partition_info *part_info= thd->work_part_info;
bool is_native_partitioned= FALSE;
+ if (tab_part_info && tab_part_info->part_type == VERSIONING_PARTITION &&
+ tab_part_info != part_info && part_info->part_type == VERSIONING_PARTITION &&
+ part_info->num_parts == 0)
+ {
+ if (part_info->vers_info->interval.is_set() &&
+ /* TODO: equivalent intervals like 1 hour and 60 mins should be considered equal */
+ memcmp(&part_info->vers_info->interval,
+ &tab_part_info->vers_info->interval,
+ sizeof(Vers_part_info::interval)))
+ {
+ /* If interval is changed we can not do fast alter */
+ tab_part_info= tab_part_info->get_clone(thd);
+ }
+ else
+ {
+ /* NOTE: fast_alter_partition_table() works on existing TABLE data. */
+ *fast_alter_table= true;
+ table->mark_table_for_reopen();
+ }
+ *tab_part_info->vers_info= *part_info->vers_info;
+ thd->work_part_info= part_info= tab_part_info;
+ *partition_changed= true;
+ }
+
/*
Need to cater for engine types that can handle partition without
using the partition handler.
*/
- if (part_info != tab_part_info)
+ else if (part_info != tab_part_info)
{
if (part_info->fix_parser_data(thd))
{