summaryrefslogtreecommitdiff
path: root/sql/sql_string.h
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2019-10-18 08:07:40 +0400
committerAlexander Barkov <bar@mariadb.com>2019-10-18 10:15:17 +0400
commit9a833dc6881b896e65cf76c9699faa6c324e1775 (patch)
tree25b3daa904d7fb75a50c08d777ae3fce025684f2 /sql/sql_string.h
parent9c9606152505792fcb8f4b7386e5b6a25e2790b4 (diff)
downloadmariadb-git-9a833dc6881b896e65cf76c9699faa6c324e1775.tar.gz
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.
Diffstat (limited to 'sql/sql_string.h')
-rw-r--r--sql/sql_string.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/sql/sql_string.h b/sql/sql_string.h
index deff81f3333..8ced35657e8 100644
--- a/sql/sql_string.h
+++ b/sql/sql_string.h
@@ -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);