1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-05 13:16:09 +03:00

Merge branch '10.7' into bb-10.7-release

This commit is contained in:
Oleksandr Byelkin
2022-11-07 18:53:30 +01:00
7 changed files with 117 additions and 45 deletions

View File

@@ -1,4 +1,4 @@
MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MAJOR=10
MYSQL_VERSION_MINOR=7 MYSQL_VERSION_MINOR=7
MYSQL_VERSION_PATCH=7 MYSQL_VERSION_PATCH=8
SERVER_MATURITY=stable SERVER_MATURITY=stable

View File

@@ -150,7 +150,7 @@ partition by system_time limit 1;
alter table t1 change x big int; alter table t1 change x big int;
create or replace table t1 (i int) engine myisam partition by hash(i) partitions 2; create or replace table t1 (i int) engine myisam partition by hash(i) partitions 2;
alter table t1 add partition (partition px history); alter table t1 add partition (partition px history);
ERROR HY000: Wrong partitioning type, expected type: `SYSTEM_TIME` ERROR HY000: Wrong partition type `SYSTEM_TIME` for partitioning by `HASH`
## INSERT, UPDATE, DELETE ## INSERT, UPDATE, DELETE
create or replace table t1 (x int) create or replace table t1 (x int)
with system versioning with system versioning
@@ -1105,7 +1105,7 @@ drop table t1;
create table t1 (a int) with system versioning partition by system_time create table t1 (a int) with system versioning partition by system_time
(partition p1 history, partition pn current); (partition p1 history, partition pn current);
alter table t1 add partition (partition p2); alter table t1 add partition (partition p2);
ERROR HY000: Wrong partitioning type, expected type: `SYSTEM_TIME` ERROR HY000: Wrong partition type `HASH` for partitioning by `SYSTEM_TIME`
# MDEV-17891 Assertion failures in select_insert::abort_result_set and # MDEV-17891 Assertion failures in select_insert::abort_result_set and
# mysql_load upon attempt to replace into a full table # mysql_load upon attempt to replace into a full table
set @@max_heap_table_size= 1024*1024; set @@max_heap_table_size= 1024*1024;
@@ -2151,6 +2151,15 @@ t1 CREATE TABLE `t1` (
PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X) PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X)
drop tables t1, tp1; drop tables t1, tp1;
# #
# MDEV-29841 Partition by system_time can be converted into table but not back
#
create or replace table t (a int) with system versioning
partition by system_time limit 10 partitions 3;
alter table t convert partition p0 to table tp;
alter table t convert table tp to partition p0;
ERROR HY000: CONVERT TABLE TO PARTITION can only be used on RANGE/LIST partitions
drop tables t, tp;
#
# End of 10.7 tests # End of 10.7 tests
# #
set global innodb_stats_persistent= @save_persistent; set global innodb_stats_persistent= @save_persistent;

View File

@@ -1752,6 +1752,16 @@ show create table t1;
drop tables t1, tp1; drop tables t1, tp1;
} }
--echo #
--echo # MDEV-29841 Partition by system_time can be converted into table but not back
--echo #
create or replace table t (a int) with system versioning
partition by system_time limit 10 partitions 3;
alter table t convert partition p0 to table tp;
--error ER_ONLY_ON_RANGE_LIST_PARTITION
alter table t convert table tp to partition p0;
drop tables t, tp;
--echo # --echo #
--echo # End of 10.7 tests --echo # End of 10.7 tests
--echo # --echo #

View File

@@ -429,8 +429,13 @@ public:
return NULL; return NULL;
} }
uint next_part_no(uint new_parts) const; uint next_part_no(uint new_parts) const;
int gen_part_type(THD *thd, String *str) const;
}; };
void part_type_error(THD *thd, partition_info *work_part_info,
const char *part_type, partition_info *tab_part_info);
uint32 get_next_partition_id_range(struct st_partition_iter* part_iter); uint32 get_next_partition_id_range(struct st_partition_iter* part_iter);
bool check_partition_dirs(partition_info *part_info); bool check_partition_dirs(partition_info *part_info);

View File

@@ -9773,9 +9773,9 @@ ER_UNUSED_23
spa "Nunca debería vd de ver esto" spa "Nunca debería vd de ver esto"
ER_PARTITION_WRONG_TYPE ER_PARTITION_WRONG_TYPE
chi "错误的分区类型,预期类型:%`s" chi "错误的分区类型,预期类型:%`s for partitioning by %`s"
eng "Wrong partitioning type, expected type: %`s" eng "Wrong partition type %`s for partitioning by %`s"
spa "Tipo de partición equivocada, tipo esperado: %`s" spa "Tipo de partición equivocada, tipo esperado: %`s for partitioning by %`s"
WARN_VERS_PART_FULL WARN_VERS_PART_FULL
chi "版本化表%`s.%`spartition%`s已满添加更多历史分区(out of %s)" chi "版本化表%`s.%`spartition%`s已满添加更多历史分区(out of %s)"

View File

@@ -9740,7 +9740,7 @@ bool LEX::part_values_current(THD *thd)
{ {
if (unlikely(part_info->part_type != VERSIONING_PARTITION)) if (unlikely(part_info->part_type != VERSIONING_PARTITION))
{ {
my_error(ER_PARTITION_WRONG_TYPE, MYF(0), "SYSTEM_TIME"); part_type_error(thd, NULL, "CURRENT", part_info);
return true; return true;
} }
} }
@@ -9767,7 +9767,7 @@ bool LEX::part_values_history(THD *thd)
{ {
if (unlikely(part_info->part_type != VERSIONING_PARTITION)) if (unlikely(part_info->part_type != VERSIONING_PARTITION))
{ {
my_error(ER_PARTITION_WRONG_TYPE, MYF(0), "SYSTEM_TIME"); part_type_error(thd, NULL, "HISTORY", part_info);
return true; return true;
} }
} }

View File

@@ -2455,7 +2455,7 @@ end:
@retval != 0 Failure @retval != 0 Failure
*/ */
static int add_key_with_algorithm(String *str, partition_info *part_info) static int add_key_with_algorithm(String *str, const partition_info *part_info)
{ {
int err= 0; int err= 0;
err+= str->append(STRING_WITH_LEN("KEY ")); err+= str->append(STRING_WITH_LEN("KEY "));
@@ -2484,6 +2484,78 @@ char *generate_partition_syntax_for_frm(THD *thd, partition_info *part_info,
return res; return res;
} }
/*
Generate the partition type syntax from the partition data structure.
@return Operation status.
@retval 0 Success
@retval > 0 Failure
@retval -1 Fatal error
*/
int partition_info::gen_part_type(THD *thd, String *str) const
{
int err= 0;
switch (part_type)
{
case RANGE_PARTITION:
err+= str->append(STRING_WITH_LEN("RANGE "));
break;
case LIST_PARTITION:
err+= str->append(STRING_WITH_LEN("LIST "));
break;
case HASH_PARTITION:
if (linear_hash_ind)
err+= str->append(STRING_WITH_LEN("LINEAR "));
if (list_of_part_fields)
{
err+= add_key_with_algorithm(str, this);
err+= add_part_field_list(thd, str, part_field_list);
}
else
err+= str->append(STRING_WITH_LEN("HASH "));
break;
case VERSIONING_PARTITION:
err+= str->append(STRING_WITH_LEN("SYSTEM_TIME "));
break;
default:
DBUG_ASSERT(0);
/* We really shouldn't get here, no use in continuing from here */
my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATAL));
return -1;
}
return err;
}
void part_type_error(THD *thd, partition_info *work_part_info,
const char *part_type,
partition_info *tab_part_info)
{
StringBuffer<256> tab_part_type;
if (tab_part_info->gen_part_type(thd, &tab_part_type) < 0)
return;
tab_part_type.length(tab_part_type.length() - 1);
if (work_part_info)
{
DBUG_ASSERT(!part_type);
StringBuffer<256> work_part_type;
if (work_part_info->gen_part_type(thd, &work_part_type) < 0)
return;
work_part_type.length(work_part_type.length() - 1);
my_error(ER_PARTITION_WRONG_TYPE, MYF(0), work_part_type.c_ptr(),
tab_part_type.c_ptr());
}
else
{
DBUG_ASSERT(part_type);
my_error(ER_PARTITION_WRONG_TYPE, MYF(0), part_type,
tab_part_type.c_ptr());
}
}
/* /*
Generate the partition syntax from the partition data structure. Generate the partition syntax from the partition data structure.
Useful for support of generating defaults, SHOW CREATE TABLES Useful for support of generating defaults, SHOW CREATE TABLES
@@ -2527,34 +2599,10 @@ char *generate_partition_syntax(THD *thd, partition_info *part_info,
DBUG_ENTER("generate_partition_syntax"); DBUG_ENTER("generate_partition_syntax");
err+= str.append(STRING_WITH_LEN(" PARTITION BY ")); err+= str.append(STRING_WITH_LEN(" PARTITION BY "));
switch (part_info->part_type) int err2= part_info->gen_part_type(thd, &str);
{ if (err2 < 0)
case RANGE_PARTITION: DBUG_RETURN(NULL);
err+= str.append(STRING_WITH_LEN("RANGE ")); err+= err2;
break;
case LIST_PARTITION:
err+= str.append(STRING_WITH_LEN("LIST "));
break;
case HASH_PARTITION:
if (part_info->linear_hash_ind)
err+= str.append(STRING_WITH_LEN("LINEAR "));
if (part_info->list_of_part_fields)
{
err+= add_key_with_algorithm(&str, part_info);
err+= add_part_field_list(thd, &str, part_info->part_field_list);
}
else
err+= str.append(STRING_WITH_LEN("HASH "));
break;
case VERSIONING_PARTITION:
err+= str.append(STRING_WITH_LEN("SYSTEM_TIME "));
break;
default:
DBUG_ASSERT(0);
/* We really shouldn't get here, no use in continuing from here */
my_error(ER_OUT_OF_RESOURCES, MYF(ME_FATAL));
DBUG_RETURN(NULL);
}
if (part_info->part_type == VERSIONING_PARTITION) if (part_info->part_type == VERSIONING_PARTITION)
{ {
Vers_part_info *vers_info= part_info->vers_info; Vers_part_info *vers_info= part_info->vers_info;
@@ -5009,6 +5057,13 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
if ((alter_info->partition_flags & ALTER_PARTITION_ADD) || if ((alter_info->partition_flags & ALTER_PARTITION_ADD) ||
(alter_info->partition_flags & ALTER_PARTITION_REORGANIZE)) (alter_info->partition_flags & ALTER_PARTITION_REORGANIZE))
{ {
if ((alter_info->partition_flags & ALTER_PARTITION_CONVERT_IN) &&
!(tab_part_info->part_type == RANGE_PARTITION ||
tab_part_info->part_type == LIST_PARTITION))
{
my_error(ER_ONLY_ON_RANGE_LIST_PARTITION, MYF(0), "CONVERT TABLE TO");
goto err;
}
if (thd->work_part_info->part_type != tab_part_info->part_type) if (thd->work_part_info->part_type != tab_part_info->part_type)
{ {
if (thd->work_part_info->part_type == NOT_A_PARTITION) if (thd->work_part_info->part_type == NOT_A_PARTITION)
@@ -5044,7 +5099,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
else if (thd->work_part_info->part_type == VERSIONING_PARTITION || else if (thd->work_part_info->part_type == VERSIONING_PARTITION ||
tab_part_info->part_type == VERSIONING_PARTITION) tab_part_info->part_type == VERSIONING_PARTITION)
{ {
my_error(ER_PARTITION_WRONG_TYPE, MYF(0), "SYSTEM_TIME"); part_type_error(thd, thd->work_part_info, NULL, tab_part_info);
} }
else else
{ {
@@ -5078,13 +5133,6 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
} }
if (alter_info->partition_flags & ALTER_PARTITION_ADD) if (alter_info->partition_flags & ALTER_PARTITION_ADD)
{ {
if ((alter_info->partition_flags & ALTER_PARTITION_CONVERT_IN) &&
!(tab_part_info->part_type == RANGE_PARTITION ||
tab_part_info->part_type == LIST_PARTITION))
{
my_error(ER_ONLY_ON_RANGE_LIST_PARTITION, MYF(0), "CONVERT TABLE TO");
goto err;
}
if (*fast_alter_table && thd->locked_tables_mode) if (*fast_alter_table && thd->locked_tables_mode)
{ {
MEM_ROOT *old_root= thd->mem_root; MEM_ROOT *old_root= thd->mem_root;