mirror of
https://github.com/MariaDB/server.git
synced 2025-12-03 05:41:09 +03:00
MDEV-20856 Bad values in metadata views for partitions on VARBINARY
The old code to print partition values was too complicated:
- it created new Items for character set conversion purposes.
- it mixed string conversion and partition error reporting
in the same code blocks.
Simplifying the code as follows:
- Adding helper methods String::can_be_safely_convert_to() and
String::append_introducer_and_hex().
- Adding DBUG_EXECUTE_IF("generate_partition_syntax_for_frm", push_warning...)
into generate_partition_syntax_for_frm(), to test the PARTITON
clause written to FRM. Adding test partition_utf8-debug.test for this.
- Removing functions get_cs_converted_part_value_from_string() and
get_cs_converted_string_value. Changing get_partition_column_description()
to use Type_handler::partition_field_append_value() instead.
This makes SHOW CREATE TABLE and SELECT FROM I_S.PARTITIONS
use the same code path.
- Changing Type_handler::partition_field_append_value() not to
call convert_charset_partition_constant(), to avoid creating a new Item
for string conversion pursposes.
Rewritting the code to use only String methods.
- Removing error reporting code (ER_PARTITION_FUNCTION_IS_NOT_ALLOWED)
from Type_handler::partition_field_append_value().
The error is correctly detected and reported on the caller level.
So error reporting was redundant here.
Also:
- Moving methods Type_handler::partition_field_*() from sql_partition.cc
to sql_type.cc. This fixes compilation problem with -DPLUGIN_PARTITION=NO,
earlier introduced by the patch for MDEV-20831.
This commit is contained in:
@@ -840,6 +840,15 @@ public:
|
||||
bool copy_aligned(const char *s, size_t arg_length, size_t offset,
|
||||
CHARSET_INFO *cs);
|
||||
bool set_or_copy_aligned(const char *s, size_t arg_length, CHARSET_INFO *cs);
|
||||
bool can_be_safely_converted_to(CHARSET_INFO *tocs) const
|
||||
{
|
||||
if (charset() == &my_charset_bin)
|
||||
return Well_formed_prefix(tocs, ptr(), length()).length() == length();
|
||||
String try_val;
|
||||
uint try_conv_error= 0;
|
||||
try_val.copy(ptr(), length(), charset(), tocs, &try_conv_error);
|
||||
return try_conv_error == 0;
|
||||
}
|
||||
bool copy(const char*s, size_t arg_length, CHARSET_INFO *csfrom,
|
||||
CHARSET_INFO *csto, uint *errors);
|
||||
bool copy(const String *str, CHARSET_INFO *tocs, uint *errors)
|
||||
@@ -874,6 +883,14 @@ public:
|
||||
{
|
||||
return Binary_string::append_hex((const char*)src, srclen);
|
||||
}
|
||||
bool append_introducer_and_hex(CHARSET_INFO *cs, const LEX_CSTRING &str)
|
||||
{
|
||||
return
|
||||
append(STRING_WITH_LEN("_")) ||
|
||||
append(cs->csname) ||
|
||||
append(STRING_WITH_LEN(" 0x")) ||
|
||||
append_hex(str.str, (uint32) str.length);
|
||||
}
|
||||
bool append(IO_CACHE* file, uint32 arg_length)
|
||||
{
|
||||
return Binary_string::append(file, arg_length);
|
||||
|
||||
Reference in New Issue
Block a user