mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-28835 Assertion `(length % 4) == 0' failed in my_lengthsp_utf32 on INSERT
Problem: Item_func_date_format::val_str() and make_date_time() did not take into account that the format string and the result string (separately or at the same time) can be of a tricky character set like UCS2, UTF16, UTF32. As a result, DATE_FORMAT() could generate an ill-formed result which crashed on DBUG_ASSERTs testing well-formedness in other parts of the code. Fix: 1. class String changes Removing String::append_with_prefill(). It was not compatible with tricky character sets. Also it was inconvenient to use and required too much duplicate code on the caller side. Adding String::append_zerofill() instead. It's compatible with tricky character sets and is easier to use. Adding helper methods Static_binary_string::q_append_wc() and String::append_wc(), to append a single wide character (a Unicode code point in my_wc_t). 2. storage/spider changes Removing spider_string::append_with_prefill(). It used String::append_with_prefix() inside, but it was unused itself. 3. Changing tricky charset incompatible code pieces in make_date_time() to compatible replacements: - Fixing the loop scanning the format string to iterate in terms of Unicode code points (using mb_wc()) rather than in terms of "char" items. - Using append_wc(my_wc_t) instead of append(char) to append a single character to the result string. - Using append_zerofill() instead of append_with_prefill() to append date/time numeric components to the result string.
This commit is contained in:
@@ -941,23 +941,6 @@ bool spider_string::append(
|
||||
DBUG_RETURN(res);
|
||||
}
|
||||
|
||||
bool spider_string::append_with_prefill(
|
||||
const char *s,
|
||||
uint32 arg_length,
|
||||
uint32 full_length,
|
||||
char fill_char
|
||||
) {
|
||||
DBUG_ENTER("spider_string::append_with_prefill");
|
||||
DBUG_PRINT("info",("spider this=%p", this));
|
||||
DBUG_ASSERT(mem_calc_inited);
|
||||
DBUG_ASSERT((!current_alloc_mem && !str.is_alloced()) ||
|
||||
current_alloc_mem == str.alloced_length());
|
||||
bool res = str.append_with_prefill(s, arg_length, full_length,
|
||||
fill_char);
|
||||
SPIDER_STRING_CALC_MEM;
|
||||
DBUG_RETURN(res);
|
||||
}
|
||||
|
||||
int spider_string::strstr(
|
||||
const String &search,
|
||||
uint32 offset
|
||||
|
Reference in New Issue
Block a user