Commit 1679fe1c authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-3834 Crossgrade from MySQL 5.6.7 to MariaDB 10.0 fails due to non-existing mysql.host table

Treat the host table as optional, don't abort when it's missing
parent 47f5632d
...@@ -750,55 +750,58 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables) ...@@ -750,55 +750,58 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
acl_cache->clear(1); // Clear locked hostname cache acl_cache->clear(1); // Clear locked hostname cache
init_sql_alloc(&mem, ACL_ALLOC_BLOCK_SIZE, 0); init_sql_alloc(&mem, ACL_ALLOC_BLOCK_SIZE, 0);
if (init_read_record(&read_record_info, thd, table= tables[0].table,
NULL, 1, 1, FALSE))
goto end;
table->use_all_columns();
(void) my_init_dynamic_array(&acl_hosts,sizeof(ACL_HOST),20,50); (void) my_init_dynamic_array(&acl_hosts,sizeof(ACL_HOST),20,50);
while (!(read_record_info.read_record(&read_record_info))) if (tables[0].table) // "host" table may not exist (e.g. in MySQL 5.6.7+)
{ {
ACL_HOST host; if (init_read_record(&read_record_info, thd, table= tables[0].table,
update_hostname(&host.host,get_field(&mem, table->field[0])); NULL, 1, 1, FALSE))
host.db= get_field(&mem, table->field[1]); goto end;
if (lower_case_table_names && host.db) table->use_all_columns();
while (!(read_record_info.read_record(&read_record_info)))
{ {
/* ACL_HOST host;
convert db to lower case and give a warning if the db wasn't update_hostname(&host.host,get_field(&mem, table->field[0]));
already in lower case host.db= get_field(&mem, table->field[1]);
*/ if (lower_case_table_names && host.db)
(void) strmov(tmp_name, host.db); {
my_casedn_str(files_charset_info, host.db); /*
if (strcmp(host.db, tmp_name) != 0) convert db to lower case and give a warning if the db wasn't
sql_print_warning("'host' entry '%s|%s' had database in mixed " already in lower case
"case that has been forced to lowercase because " */
"lower_case_table_names is set. It will not be " (void) strmov(tmp_name, host.db);
"possible to remove this privilege using REVOKE.", my_casedn_str(files_charset_info, host.db);
if (strcmp(host.db, tmp_name) != 0)
sql_print_warning("'host' entry '%s|%s' had database in mixed "
"case that has been forced to lowercase because "
"lower_case_table_names is set. It will not be "
"possible to remove this privilege using REVOKE.",
host.host.hostname ? host.host.hostname : "",
host.db ? host.db : "");
}
host.access= get_access(table,2);
host.access= fix_rights_for_db(host.access);
host.sort= get_sort(2,host.host.hostname,host.db);
if (check_no_resolve && hostname_requires_resolving(host.host.hostname))
{
sql_print_warning("'host' entry '%s|%s' "
"ignored in --skip-name-resolve mode.",
host.host.hostname ? host.host.hostname : "", host.host.hostname ? host.host.hostname : "",
host.db ? host.db : ""); host.db ? host.db : "");
} continue;
host.access= get_access(table,2); }
host.access= fix_rights_for_db(host.access);
host.sort= get_sort(2,host.host.hostname,host.db);
if (check_no_resolve && hostname_requires_resolving(host.host.hostname))
{
sql_print_warning("'host' entry '%s|%s' "
"ignored in --skip-name-resolve mode.",
host.host.hostname ? host.host.hostname : "",
host.db ? host.db : "");
continue;
}
#ifndef TO_BE_REMOVED #ifndef TO_BE_REMOVED
if (table->s->fields == 8) if (table->s->fields == 8)
{ // Without grant { // Without grant
if (host.access & CREATE_ACL) if (host.access & CREATE_ACL)
host.access|=REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL; host.access|=REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL;
} }
#endif #endif
(void) push_dynamic(&acl_hosts,(uchar*) &host); (void) push_dynamic(&acl_hosts,(uchar*) &host);
}
my_qsort((uchar*) dynamic_element(&acl_hosts,0,ACL_HOST*),acl_hosts.elements,
sizeof(ACL_HOST),(qsort_cmp) acl_compare);
end_read_record(&read_record_info);
} }
my_qsort((uchar*) dynamic_element(&acl_hosts,0,ACL_HOST*),acl_hosts.elements,
sizeof(ACL_HOST),(qsort_cmp) acl_compare);
end_read_record(&read_record_info);
freeze_size(&acl_hosts); freeze_size(&acl_hosts);
if (init_read_record(&read_record_info, thd, table=tables[1].table, if (init_read_record(&read_record_info, thd, table=tables[1].table,
...@@ -1173,7 +1176,7 @@ my_bool acl_reload(THD *thd) ...@@ -1173,7 +1176,7 @@ my_bool acl_reload(THD *thd)
tables[2].next_local= tables[2].next_global= tables + 3; tables[2].next_local= tables[2].next_global= tables + 3;
tables[0].open_type= tables[1].open_type= tables[2].open_type= tables[0].open_type= tables[1].open_type= tables[2].open_type=
tables[3].open_type= OT_BASE_ONLY; tables[3].open_type= OT_BASE_ONLY;
tables[3].open_strategy= TABLE_LIST::OPEN_IF_EXISTS; tables[0].open_strategy= tables[3].open_strategy= TABLE_LIST::OPEN_IF_EXISTS;
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT)) if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
{ {
......
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