• Alexander Barkov's avatar
    MDEV-18156 Assertion `0' failed or `btr_validate_index(index, 0, false)' in... · dc719597
    Alexander Barkov authored
    MDEV-18156 Assertion `0' failed or `btr_validate_index(index, 0, false)' in row_upd_sec_index_entry or error code 126: Index is corrupted upon DELETE with PAD_CHAR_TO_FULL_LENGTH
    
    This change takes into account a column's GENERATED ALWAYS AS
    expression dependcy on sql_mode's PAD_CHAR_TO_FULL_LENGTH and
    NO_UNSIGNED_SUBTRACTION flags.
    
    Indexed virtual columns as well as persistent generated columns are
    now not allowed to have such dependencies to avoid inconsistent data
    or index files on sql_mode changes.
    So an error is now returned in cases like this:
    
      CREATE OR REPLACE TABLE t1
      (
        a CHAR(5),
        v VARCHAR(5) AS (a) PERSISTENT -- CHAR->VARCHAR or CHAR->TEXT = ERROR
      );
    
    Functions RPAD() and RTRIM() can now remove dependency on
    PAD_CHAR_TO_FULL_LENGTH. So this can be used instead:
    
      CREATE OR REPLACE TABLE t1
      (
        a CHAR(5),
        v VARCHAR(5) AS (RTRIM(a)) PERSISTENT
      );
    
    Note, unlike CHAR->VARCHAR and CHAR->TEXT this still works,
    not RPAD(a) is needed:
    
      CREATE OR REPLACE TABLE t1
      (
        a CHAR(5),
        v CHAR(5) AS (a) PERSISTENT -- CHAR->CHAR is OK
      );
    
    More sql_mode flags may affect values of generated columns.
    They will be addressed separately.
    
    See comments in sql_mode.h for implementation details.
    dc719597
sys_vars.cc 223 KB