Commit 3c879732 authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-14990 mysql_upgrade fails with ERROR 1408 (HY000) at line 566: Event...

MDEV-14990 mysql_upgrade fails with ERROR 1408 (HY000) at line 566: Event Scheduler: An error occurred when initializing system tables

Don't check mysql.db and mysql.user from event schedule on startup.

Event schedule should only check its own mysql.event table, it has
no business checking other system tables. In particular, it's ridiculous
for event schedule to fail when privilege tables are not the newest,
because sql_acl.cc supports old privilege tables just fine.
parent f7621f17
...@@ -581,7 +581,7 @@ CREATE USER 'user3'@'%'; ...@@ -581,7 +581,7 @@ CREATE USER 'user3'@'%';
GRANT USAGE ON *.* TO 'user3'@'%'; GRANT USAGE ON *.* TO 'user3'@'%';
GRANT ALL PRIVILEGES ON `roelt`.`test2` TO 'user3'@'%'; GRANT ALL PRIVILEGES ON `roelt`.`test2` TO 'user3'@'%';
alter table mysql.user drop column Delete_history_priv; alter table mysql.user drop column Delete_history_priv;
flush privileges; alter table mysql.db drop column Delete_history_priv;
Run mysql_upgrade with all privileges on a user Run mysql_upgrade with all privileges on a user
flush privileges; flush privileges;
SHOW GRANTS FOR 'user3'@'%'; SHOW GRANTS FOR 'user3'@'%';
...@@ -589,3 +589,4 @@ Grants for user3@% ...@@ -589,3 +589,4 @@ Grants for user3@%
GRANT USAGE ON *.* TO 'user3'@'%' GRANT USAGE ON *.* TO 'user3'@'%'
GRANT ALL PRIVILEGES ON `roelt`.`test2` TO 'user3'@'%' GRANT ALL PRIVILEGES ON `roelt`.`test2` TO 'user3'@'%'
DROP USER 'user3'@'%'; DROP USER 'user3'@'%';
update mysql.db set Delete_history_priv='Y' where db like 'test%';
...@@ -232,10 +232,12 @@ CREATE USER 'user3'@'%'; ...@@ -232,10 +232,12 @@ CREATE USER 'user3'@'%';
GRANT USAGE ON *.* TO 'user3'@'%'; GRANT USAGE ON *.* TO 'user3'@'%';
GRANT ALL PRIVILEGES ON `roelt`.`test2` TO 'user3'@'%'; GRANT ALL PRIVILEGES ON `roelt`.`test2` TO 'user3'@'%';
alter table mysql.user drop column Delete_history_priv; alter table mysql.user drop column Delete_history_priv;
flush privileges; alter table mysql.db drop column Delete_history_priv;
--source include/restart_mysqld.inc
--echo Run mysql_upgrade with all privileges on a user --echo Run mysql_upgrade with all privileges on a user
--exec $MYSQL_UPGRADE --force --silent 2>&1 --exec $MYSQL_UPGRADE --force --silent 2>&1
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info --remove_file $MYSQLD_DATADIR/mysql_upgrade_info
flush privileges; flush privileges;
SHOW GRANTS FOR 'user3'@'%'; SHOW GRANTS FOR 'user3'@'%';
DROP USER 'user3'@'%'; DROP USER 'user3'@'%';
update mysql.db set Delete_history_priv='Y' where db like 'test%';
...@@ -1186,46 +1186,9 @@ Event_db_repository::check_system_tables(THD *thd) ...@@ -1186,46 +1186,9 @@ Event_db_repository::check_system_tables(THD *thd)
{ {
TABLE_LIST tables; TABLE_LIST tables;
int ret= FALSE; int ret= FALSE;
const unsigned int event_priv_column_position= 29;
DBUG_ENTER("Event_db_repository::check_system_tables"); DBUG_ENTER("Event_db_repository::check_system_tables");
DBUG_PRINT("enter", ("thd: %p", thd)); DBUG_PRINT("enter", ("thd: %p", thd));
/* Check mysql.db */
tables.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_DB_NAME, 0, TL_READ);
if (open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
{
ret= 1;
sql_print_error("Cannot open mysql.db");
}
else
{
if (table_intact.check(tables.table, &mysql_db_table_def))
ret= 1;
close_mysql_tables(thd);
}
/* Check mysql.user */
tables.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_USER_NAME, 0, TL_READ);
if (open_and_lock_tables(thd, &tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
{
ret= 1;
sql_print_error("Cannot open mysql.user");
}
else
{
if (tables.table->s->fields < event_priv_column_position ||
strncmp(tables.table->field[event_priv_column_position]->field_name.str,
STRING_WITH_LEN("Event_priv")))
{
sql_print_error("mysql.user has no `Event_priv` column at position %d",
event_priv_column_position);
ret= 1;
}
close_mysql_tables(thd);
}
/* Check mysql.event */ /* Check mysql.event */
tables.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_EVENT_NAME, 0, TL_READ); tables.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_EVENT_NAME, 0, TL_READ);
......
...@@ -59,128 +59,6 @@ ...@@ -59,128 +59,6 @@
bool mysql_user_table_is_in_short_password_format= false; bool mysql_user_table_is_in_short_password_format= false;
static const
TABLE_FIELD_TYPE mysql_db_table_fields[MYSQL_DB_FIELD_COUNT] = {
{
{ STRING_WITH_LEN("Host") },
{ STRING_WITH_LEN("char(60)") },
{NULL, 0}
},
{
{ STRING_WITH_LEN("Db") },
{ STRING_WITH_LEN("char(64)") },
{NULL, 0}
},
{
{ STRING_WITH_LEN("User") },
{ STRING_WITH_LEN("char(") },
{NULL, 0}
},
{
{ STRING_WITH_LEN("Select_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Insert_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Update_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Delete_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Create_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Drop_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Grant_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("References_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Index_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Alter_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Create_tmp_table_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Lock_tables_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Create_view_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Show_view_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Create_routine_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Alter_routine_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Execute_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Event_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Trigger_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
},
{
{ STRING_WITH_LEN("Truncate_versioning_priv") },
{ STRING_WITH_LEN("enum('N','Y')") },
{ STRING_WITH_LEN("utf8") }
}
};
const TABLE_FIELD_DEF
mysql_db_table_def= {MYSQL_DB_FIELD_COUNT, mysql_db_table_fields, 0, (uint*) 0 };
static LEX_CSTRING native_password_plugin_name= { static LEX_CSTRING native_password_plugin_name= {
STRING_WITH_LEN("mysql_native_password") STRING_WITH_LEN("mysql_native_password")
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment