• Marko Mäkelä's avatar
    MDEV-14637: Fix hang due to persistent statistics · de469a2f
    Marko Mäkelä authored
    Similar to the tables SYS_FOREIGN and SYS_FOREIGN_COLS,
    the tables mysql.innodb_table_stats and mysql.innodb_index_stats
    are updated by the InnoDB internal SQL parser, which fails to
    enforce the size limits of the data. Due to this, it is possible
    for InnoDB to hang when there are persistent statistics defined on
    partitioned tables where the total length of table name,
    partition name and subpartition name exceeds the incorrectly
    defined limit VARCHAR(64). That column should have been defined
    as VARCHAR(199).
    
    btr_node_ptr_max_size(): Interpret the VARCHAR(64) as VARCHAR(199),
    to prevent a hang in the case that the upgrade script has not been
    run.
    
    dict_table_schema_check(): Ignore difference in the length of the
    table_name column.
    
    ha_innobase::max_supported_key_length(): For innodb_page_size=4k,
    return a larger value so that the table mysql.innodb_index_stats
    can be created. This could allow "impossible" tables to be created,
    such that it is not possible to insert anything into a secondary
    index when both the secondary key and the primary key are long,
    but this is the easiest and most consistent way. The Oracle fix
    would only ignore the maximum length violation for the two
    statistics tables.
    
    os_file_get_status_posix(), os_file_get_status_win32(): Handle
    ENAMETOOLONG as well.
    
    This patch is based on the following change in MySQL 5.7.23.
    Not all changes were applied, and our variant allows persistent
    statistics to work without hangs even if the table definitions
    were not upgraded.
    
    From fdbdce701ab8145ae234c9d401109dff4e4106cb Mon Sep 17 00:00:00 2001
    From: Aditya A <aditya.a@oracle.com>
    Date: Thu, 17 May 2018 16:11:43 +0530
    Subject: [PATCH] Bug #26390736 THE FIELD TABLE_NAME (VARCHAR(64)) FROM
               MYSQL.INNODB_TABLE_STATS CAN OVERFLOW.
    
        In mysql.innodb_index_stats and mysql.innodb_table_stats
        tables the table name column didn't take into consideration
        partition names which can be more than varchar(64).
    de469a2f
create_spatial_index.test 42.1 KB