diff options
Diffstat (limited to 'sql/sql_parse.cc')
-rw-r--r-- | sql/sql_parse.cc | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8b7e16709c0..97e67127fd0 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1170,9 +1170,8 @@ mysql_execute_command(void) #endif case SQLCOM_REPAIR: { - if (!tables->db) - tables->db=thd->db; - if (check_table_access(thd,SELECT_ACL | INSERT_ACL, tables)) + if (check_db_used(thd,tables) || + check_table_access(thd,SELECT_ACL | INSERT_ACL, tables)) goto error; /* purecov: inspected */ res = mysql_repair_table(thd, tables, &lex->check_opt); break; @@ -1695,6 +1694,10 @@ error: ** Get the user (global) and database privileges for all used tables ** Returns true (error) if we can't get the privileges and we don't use ** table/column grants. +** The idea of EXTRA_ACL is that one will be granted access to the table if +** one has the asked privilege on any column combination of the table; For +** example to be able to check a table one needs to have SELECT privilege on +** any column of the table. ****************************************************************************/ bool @@ -1760,7 +1763,8 @@ check_table_access(THD *thd,uint want_access,TABLE_LIST *tables) TABLE_LIST *org_tables=tables; for (; tables ; tables=tables->next) { - if ((thd->master_access & want_access) == want_access && thd->db) + if ((thd->master_access & want_access) == (want_access & ~EXTRA_ACL) && + thd->db) tables->grant.privilege= want_access; else if (tables->db && tables->db == thd->db) { |