• Daniel Black's avatar
    MDEV-23201: mysql_upgrade order mysql.user for 5.7 cross-upgrade · ff8ffef3
    Daniel Black authored
    As MariaDB tables are expected in a fixed order, the cross upgrade
    previously placed roles, default_role and max_statement_time after
    now unused mysql-5.7 columns.
    
    Test:
    
    $ cp -a /usr/local/mysql-5.7.31/data/ /tmp/m57data
    $ sql/mysqld --no-defaults --skip-networking --datadir=/tmp/m57data  --socket=/tmp/${PWD##*/}.sock   --verbose --lc-messages-dir=$PWD/sql/share
    2020-10-02 11:02:05 140135193212864 [Note] sql/mysqld (mysqld 10.2.34-MariaDB) starting as process 1457667 ...
    2020-10-02 11:02:05 140135193212864 [Note] InnoDB: Mutexes and rw_locks use GCC atomic built
    
    $ client/mysql_upgrade --no-defaults -u root -pbob  -S /tmp/build-mariadb-server-10.2.sock
    MySQL upgrade detected
    Phase 1/7: Checking and upgrading mysql database
    Processing databases
    mysql
    mysql.columns_priv                                 OK
    mysql.db                                           OK
    mysql.engine_cost                                  OK
    mysql.event                                        OK
    mysql.func                                         OK
    mysql.gtid_executed                                OK
    mysql.help_category                                OK
    mysql.help_keyword                                 OK
    mysql.help_relation                                OK
    mysql.help_topic                                   OK
    mysql.innodb_index_stats                           OK
    mysql.innodb_table_stats                           OK
    mysql.ndb_binlog_index                             OK
    mysql.plugin                                       OK
    mysql.proc                                         OK
    mysql.procs_priv                                   OK
    mysql.proxies_priv                                 OK
    mysql.server_cost                                  OK
    mysql.servers                                      OK
    mysql.slave_master_info                            OK
    mysql.slave_relay_log_info                         OK
    mysql.slave_worker_info                            OK
    mysql.tables_priv                                  OK
    mysql.time_zone                                    OK
    mysql.time_zone_leap_second                        OK
    mysql.time_zone_name                               OK
    mysql.time_zone_transition                         OK
    mysql.time_zone_transition_type                    OK
    mysql.user                                         OK
    Upgrading from a version before MariaDB-10.1
    Phase 2/7: Installing used storage engines
    
    Result:
    
    | user  | CREATE TABLE `user` (
      `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
      `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
      `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
      `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',
      `ssl_cipher` blob NOT NULL,
      `x509_issuer` blob NOT NULL,
      `x509_subject` blob NOT NULL,
      `max_questions` int(11) unsigned NOT NULL DEFAULT 0,
      `max_updates` int(11) unsigned NOT NULL DEFAULT 0,
      `max_connections` int(11) unsigned NOT NULL DEFAULT 0,
      `max_user_connections` int(11) NOT NULL DEFAULT 0,
      `plugin` char(64) CHARACTER SET latin1 NOT NULL DEFAULT '',
      `authentication_string` text COLLATE utf8_bin NOT NULL,
      `password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `is_role` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
      `default_role` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',
      `max_statement_time` decimal(12,6) NOT NULL DEFAULT 0.000000,
      `password_last_changed` timestamp NULL DEFAULT NULL,
      `password_lifetime` smallint(5) unsigned DEFAULT NULL,
      `account_locked` enum('N','Y') COLLATE utf8_bin NOT NULL DEFAULT 'N',
      PRIMARY KEY (`Host`,`User`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges' |
    
    MariaDB [(none)]>  CREATE ROLE `aRole`;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> SET ROLE `aRole`;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> SET ROLE `aRole`;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> SELECT `User`, `is_role` FROM `mysql`.`user`;
    +---------------+---------+
    | User          | is_role |
    +---------------+---------+
    | root          | N       |
    | mysql.session | N       |
    | mysql.sys     | N       |
    | dan           | N       |
    | aRole         | Y       |
    +---------------+---------+
    5 rows in set (0.00 sec)
    
    Reviewer: Anel Husakovic
    ff8ffef3