• Ramil Kalimullin's avatar
    Fix for · 53e42d9e
    Ramil Kalimullin authored
    bug#33094: Error in upgrading from 5.0 to 5.1 when table contains
    triggers
    and
    #41385: Crash when attempting to repair a #mysql50# upgraded table
    with triggers.
    
    Problem:
    1. trigger code didn't assume a table name may have
    a "#mysql50#" prefix, that may lead to a failing ASSERT().
    2. "ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME" failed
    for databases with "#mysql50#" prefix if any trigger.
    3. mysqlcheck --fix-table-name didn't use UTF8 as a default
    character set that resulted in (parsing) errors for tables with
    non-latin symbols in their names and definitions of triggers.
    
    Fix:
    1. properly handle table/database names with "#mysql50#" prefix.
    2. handle --default-character-set mysqlcheck option;
    if mysqlcheck is launched with --fix-table-name or --fix-db-name
    set default character set to UTF8 if no --default-character-set
    option given.
    
    Note: if given --fix-table-name or --fix-db-name option,
    without --default-character-set mysqlcheck option
    default character set is UTF8.
    
    
    client/mysqlcheck.c:
      Fix for
      bug#33094: Error in upgrading from 5.0 to 5.1 when table contains
      triggers
      and
      #41385: Crash when attempting to repair a #mysql50# upgraded table
      with triggers.
        - check and set default charset if --default-character-set option
          given.
        - set default charset to "utf8" if there's
          --fix-table-name or --fix-db-name and no --default-character-set.
    mysql-test/r/mysqlcheck.result:
      Fix for
      bug#33094: Error in upgrading from 5.0 to 5.1 when table contains
      triggers
      and
      #41385: Crash when attempting to repair a #mysql50# upgraded table
      with triggers.
        - test result.
    mysql-test/t/mysqlcheck.test:
      Fix for
      bug#33094: Error in upgrading from 5.0 to 5.1 when table contains
      triggers
      and
      #41385: Crash when attempting to repair a #mysql50# upgraded table
      with triggers.
        - test case.
    sql/mysql_priv.h:
      Fix for
      bug#33094: Error in upgrading from 5.0 to 5.1 when table contains
      triggers
      and
      #41385: Crash when attempting to repair a #mysql50# upgraded table
      with triggers.
        - check_n_cut_mysql50_prefix() introduced.
    sql/sql_table.cc:
      Fix for
      bug#33094: Error in upgrading from 5.0 to 5.1 when table contains
      triggers
      and
      #41385: Crash when attempting to repair a #mysql50# upgraded table
      with triggers.
        - tablename_to_filename() code split into 2 parts
        - check_n_cut_mysql50_prefix() introduced to cut #mysql50# prefixes,
          used in the trigger code as well.
    sql/sql_trigger.cc:
      Fix for
      bug#33094: Error in upgrading from 5.0 to 5.1 when table contains
      triggers
      and
      #41385: Crash when attempting to repair a #mysql50# upgraded table
      with triggers.
        - Table_triggers_list::check_n_load() - checking triggers assume
          a table/database name given may have "#mysql50#" prefix in some cases.
        - Table_triggers_list::change_table_name_in_triggers() -
          create .TRG file in new database directory and delete it in old one,
          as they may differ in case of
          "ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME"
        - Table_triggers_list::change_table_name_in_trignames() - remove stale .TRN
          files in #mysql50#dbname directory in case of database upgrade
        - Table_triggers_list::change_table_name() - allow changing trigger's
          database in case of its upgrading
    sql/sql_trigger.h:
      Fix for
      bug#33094: Error in upgrading from 5.0 to 5.1 when table contains
      triggers
      and
      #41385: Crash when attempting to repair a #mysql50# upgraded table
      with triggers.
        - new old_db_name parameter added in
          Table_triggers_list::change_table_name_in_trignames() and
          Table_triggers_list::change_table_name_in_triggers()
    53e42d9e
mysql_priv.h 94.7 KB