• Marko Mäkelä's avatar
    MDEV-12873 InnoDB SYS_TABLES.TYPE incompatibility for PAGE_COMPRESSED=YES in... · 72378a25
    Marko Mäkelä authored
    MDEV-12873 InnoDB SYS_TABLES.TYPE incompatibility for PAGE_COMPRESSED=YES in MariaDB 10.2.2 to 10.2.6
    
    Remove the SHARED_SPACE flag that was erroneously introduced in
    MariaDB 10.2.2, and shift the SYS_TABLES.TYPE flags back to where
    they were before MariaDB 10.2.2. While doing this, ensure that
    tables created with affected MariaDB versions can be loaded,
    and also ensure that tables created with MySQL 5.7 using the
    TABLESPACE attribute cannot be loaded.
    
    MariaDB 10.2.2 picked the SHARED_SPACE flag from MySQL 5.7,
    shifting the MariaDB 10.1 flags PAGE_COMPRESSION, PAGE_COMPRESSION_LEVEL,
    ATOMIC_WRITES by one bit. The SHARED_SPACE flag would always
    be written as 0 by MariaDB, because MariaDB does not support
    CREATE TABLESPACE or CREATE TABLE...TABLESPACE for InnoDB.
    
    So, instead of the bits AALLLLCxxxxxxx we would have
    AALLLLC0xxxxxxx if the table was created with MariaDB 10.2.2
    to 10.2.6. (AA=ATOMIC_WRITES, LLLL=PAGE_COMPRESSION_LEVEL,
    C=PAGE_COMPRESSED, xxxxxxx=7 bits that were not moved.)
    
    PAGE_COMPRESSED=NO implies LLLLC=00000. That is not a problem.
    
    If someone created a table in MariaDB 10.2.2 or 10.2.3 with
    the attribute ATOMIC_WRITES=OFF (value 2; AA=10) and without
    PAGE_COMPRESSED=YES or PAGE_COMPRESSION_LEVEL, the table should be
    rejected. We ignore this problem, because it should be unlikely
    for anyone to specify ATOMIC_WRITES=OFF, and because 10.2.2 and
    10.2.2 were not mature releases. The value ATOMIC_WRITES=ON (1)
    would be interpreted as ATOMIC_WRITES=OFF, but starting with
    MariaDB 10.2.4 the ATOMIC_WRITES attribute is ignored.
    
    PAGE_COMPRESSED=YES implies that PAGE_COMPRESSION_LEVEL be between
    1 and 9 and that ROW_FORMAT be COMPACT or DYNAMIC. Thus, the affected
    wrong bit pattern in SYS_TABLES.TYPE is of the form AALLLL10DB00001
    where D signals the presence of a DATA DIRECTORY attribute and B is 1
    for ROW_FORMAT=DYNAMIC and 0 for ROW_FORMAT=COMPACT. We must interpret
    this bit pattern as AALLLL1DB00001 (discarding the extraneous 0 bit).
    
    dict_sys_tables_rec_read(): Adjust the affected bit pattern when
    reading the SYS_TABLES.TYPE column. In case of invalid flags,
    report both SYS_TABLES.TYPE (after possible adjustment) and
    SYS_TABLES.MIX_LEN.
    
    dict_load_table_one(): Replace an unreachable condition on
    !dict_tf2_is_valid() with a debug assertion. The flags will already
    have been validated by dict_sys_tables_rec_read(); if that validation
    fails, dict_load_table_low() will have failed.
    
    fil_ibd_create(): Shorten an error message about a file pre-existing.
    
    Datafile::validate_to_dd(): Clarify an error message about tablespace
    flags mismatch.
    
    ha_innobase::open(): Remove an unnecessary warning message.
    
    dict_tf_is_valid(): Simplify and stricten the logic. Validate the
    values of PAGE_COMPRESSION. Remove error log output; let the callers
    handle that.
    
    DICT_TF_BITS: Remove ATOMIC_WRITES, PAGE_ENCRYPTION, PAGE_ENCRYPTION_KEY.
    The ATOMIC_WRITES is ignored once the SYS_TABLES.TYPE has been validated;
    there is no need to store it in dict_table_t::flags. The PAGE_ENCRYPTION
    and PAGE_ENCRYPTION_KEY are unused since MariaDB 10.1.4 (the GA release
    was 10.1.8).
    
    DICT_TF_BIT_MASK: Remove (unused).
    
    FSP_FLAGS_MEM_ATOMIC_WRITES: Remove (the flags are never read).
    
    row_import_read_v1(): Display an error if dict_tf_is_valid() fails.
    72378a25
fsp0file.cc 26.9 KB