• Alexander Barkov's avatar
    MDEV-28835 Assertion `(length % 4) == 0' failed in my_lengthsp_utf32 on INSERT · e2da748c
    Alexander Barkov authored
    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.
    e2da748c
spd_db_include.h 52.6 KB