--- a/mysql-test/r/mysql_upgrade.result +++ b/mysql-test/r/mysql_upgrade.result @@ -357,4 +357,58 @@ test Phase 3/3: Running 'mysql_fix_privilege_tables'... OK +# +# Test that mysql_upgrade doesn't break on long user names. +# +GRANT SELECT ON mysql.* TO very_long_user_name_number_1; +GRANT SELECT ON mysql.* TO very_long_user_name_number_2; +GRANT INSERT ON mysql.user TO very_long_user_name_number_1; +GRANT INSERT ON mysql.user TO very_long_user_name_number_2; +GRANT UPDATE (User) ON mysql.db TO very_long_user_name_number_1; +GRANT UPDATE (User) ON mysql.db TO very_long_user_name_number_2; +Phase 1/3: Fixing table and database names +Phase 2/3: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_expected OK +mtr.test_suppressions OK +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.host OK +mysql.index_stats OK +mysql.innodb_index_stats OK +mysql.innodb_table_stats OK +mysql.mapped_user OK +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.servers OK +mysql.sniper_settings OK +mysql.system_user OK +mysql.table_stats 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 +performance_schema +test +Phase 3/3: Running 'mysql_fix_privilege_tables'... +OK +DROP USER very_long_user_name_number_1, very_long_user_name_number_2; End of tests --- a/mysql-test/t/mysql_upgrade.test +++ b/mysql-test/t/mysql_upgrade.test @@ -131,4 +131,22 @@ # so the following command should never fail. --remove_file $MYSQLD_DATADIR/mysql_upgrade_info + +--echo # +--echo # Test that mysql_upgrade doesn't break on long user names. +--echo # + +connection default; +GRANT SELECT ON mysql.* TO very_long_user_name_number_1; +GRANT SELECT ON mysql.* TO very_long_user_name_number_2; +GRANT INSERT ON mysql.user TO very_long_user_name_number_1; +GRANT INSERT ON mysql.user TO very_long_user_name_number_2; +GRANT UPDATE (User) ON mysql.db TO very_long_user_name_number_1; +GRANT UPDATE (User) ON mysql.db TO very_long_user_name_number_2; + +--replace_result $MYSQLTEST_VARDIR var +--exec $MYSQL_UPGRADE --force 2>&1 + +DROP USER very_long_user_name_number_1, very_long_user_name_number_2; + --echo End of tests --- a/scripts/mysql_system_tables_fix.sql +++ b/scripts/mysql_system_tables_fix.sql @@ -62,7 +62,6 @@ ALTER TABLE tables_priv MODIFY Host char(60) NOT NULL default '', MODIFY Db char(64) NOT NULL default '', - MODIFY User char(16) NOT NULL default '', MODIFY Table_name char(64) NOT NULL default '', MODIFY Grantor char(77) NOT NULL default '', ENGINE=InnoDB, @@ -90,7 +89,6 @@ ALTER TABLE columns_priv MODIFY Host char(60) NOT NULL default '', MODIFY Db char(64) NOT NULL default '', - MODIFY User char(16) NOT NULL default '', MODIFY Table_name char(64) NOT NULL default '', MODIFY Column_name char(64) NOT NULL default '', ENGINE=InnoDB, @@ -161,7 +159,6 @@ # and reset all char columns to correct width ALTER TABLE user MODIFY Host char(60) NOT NULL default '', - MODIFY User char(16) NOT NULL default '', ENGINE=InnoDB, CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; ALTER TABLE user MODIFY Password char(41) character set latin1 collate latin1_bin NOT NULL default '', @@ -191,7 +188,6 @@ ALTER TABLE db MODIFY Host char(60) NOT NULL default '', MODIFY Db char(64) NOT NULL default '', - MODIFY User char(16) NOT NULL default '', ENGINE=InnoDB, CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; ALTER TABLE db MODIFY Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,