Skip to content
Permalink
Browse files
MDEV-29841 More descriptive text for ER_PARTITION_WRONG_TYPE
For commands

  (1) alter table t1 add partition (partition p2);
  (2) alter table t1 add partition (partition px history);

It printed the same error message:

   Wrong partitioning type, expected type: `SYSTEM_TIME`

For (1) it is not clear from the syntax that we are trying to add
HASH partition. For (2) it is not clear that the table partitioning is
different than SYSTEM_TIME. Now it prints what type we are trying to
add to what type of partitioning.
  • Loading branch information
midenok committed Oct 31, 2022
1 parent dd9da61 commit 6f8fb41
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 37 deletions.
@@ -150,7 +150,7 @@ partition by system_time limit 1;
alter table t1 change x big int;
create or replace table t1 (i int) engine myisam partition by hash(i) partitions 2;
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
create or replace table t1 (x int)
with system versioning
@@ -1105,7 +1105,7 @@ drop table t1;
create table t1 (a int) with system versioning partition by system_time
(partition p1 history, partition pn current);
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
# mysql_load upon attempt to replace into a full table
set @@max_heap_table_size= 1024*1024;
@@ -429,8 +429,13 @@ class partition_info : public DDL_LOG_STATE, public Sql_alloc
return NULL;
}
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);

This comment has been minimized.

Copy link
@dr-m

dr-m Nov 10, 2022

Contributor

The declaration of part_type_error() is missing a guard:

#ifdef WITH_PARTITION_STORAGE_ENGINE
void part_type_error(THD *thd, partition_info *work_part_info,
                     const char *part_type, partition_info *tab_part_info);
#endif

uint32 get_next_partition_id_range(struct st_partition_iter* part_iter);
bool check_partition_dirs(partition_info *part_info);

@@ -9773,9 +9773,9 @@ ER_UNUSED_23
spa "Nunca debería vd de ver esto"

ER_PARTITION_WRONG_TYPE
chi "错误的分区类型,预期类型:%`s"
eng "Wrong partitioning type, expected type: %`s"
spa "Tipo de partición equivocada, tipo esperado: %`s"
chi "错误的分区类型,预期类型:%`s for partitioning by %`s"
eng "Wrong partition type %`s for partitioning by %`s"
spa "Tipo de partición equivocada, tipo esperado: %`s for partitioning by %`s"

This comment has been minimized.

Copy link
@dr-m

dr-m Nov 10, 2022

Contributor

The Chinese and Spanish error messages now include some English text.

This comment has been minimized.

Copy link
@dr-m

dr-m Nov 10, 2022

Contributor

@jesusaplsoftware @haidong Could you please suggest correct translations?

This comment has been minimized.

Copy link
@haidong

haidong Nov 11, 2022

Contributor

I think this "错误分区类型%s,应当是%s" should do for the Chinese translation. @dr-m @midenok .

This comment has been minimized.

Copy link
@jesusaplsoft

jesusaplsoft Nov 11, 2022

spa "Tipo de partición equivocada %s para particionado mediante %s"

This comment has been minimized.

Copy link
@dr-m

dr-m Nov 28, 2022

Contributor

@haidong @jesusaplsoft Thank you, I fixed this up in 091ac53.


WARN_VERS_PART_FULL
chi "版本化表%`s.%`s:partition%`s已满,添加更多历史分区(out of %s)"
@@ -9739,7 +9739,7 @@ bool LEX::part_values_current(THD *thd)
{
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);

This comment has been minimized.

Copy link
@dr-m

dr-m Nov 10, 2022

Contributor

part_type_error() is not defined if the code is configured with cmake -DPLUGIN_PARTITION=NO.

The word CURRENT does not occur anywhere in the changed .result files of this commit. Only SYSTEM_TIME does (before and after this code change).

return true;
}
}
@@ -9766,7 +9766,7 @@ bool LEX::part_values_history(THD *thd)
{
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);

This comment has been minimized.

Copy link
@dr-m

dr-m Nov 10, 2022

Contributor

The word HISTORY does not occur anywhere else in this commit.

return true;
}
}
@@ -2455,7 +2455,7 @@ static int add_partition_values(String *str, partition_info *part_info,
@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;
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;
}


/*
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.
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");

err+= str.append(STRING_WITH_LEN(" PARTITION BY "));
switch (part_info->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 (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);
}
int err2= part_info->gen_part_type(thd, &str);
if (err2 < 0)
DBUG_RETURN(NULL);
err+= err2;
if (part_info->part_type == VERSIONING_PARTITION)
{
Vers_part_info *vers_info= part_info->vers_info;
@@ -5044,7 +5092,7 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info,
else if (thd->work_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
{

0 comments on commit 6f8fb41

Please sign in to comment.