Remove check_merge_table_access().
check_merge_table_access() used to do two things: - set proper database for every merge table child; - check SELECT | UPDATE | DELETE for merge table children. Setting database is not needed anymore, since it's done on the parsing stage. Thus, check_merge_table_access() can be removed; needed privileges can be checked using check_table_access().
This commit is contained in:
parent
6b9371bd45
commit
53e566a42a
@ -13,8 +13,7 @@
|
|||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
||||||
|
|
||||||
#include "sql_parse.h" // check_access,
|
#include "sql_parse.h" // check_access
|
||||||
// check_merge_table_access
|
|
||||||
#include "sql_table.h" // mysql_alter_table,
|
#include "sql_table.h" // mysql_alter_table,
|
||||||
// mysql_exchange_partition
|
// mysql_exchange_partition
|
||||||
#include "sql_alter.h"
|
#include "sql_alter.h"
|
||||||
@ -60,11 +59,15 @@ bool Alter_table_statement::execute(THD *thd)
|
|||||||
check_access(thd, INSERT_ACL | CREATE_ACL, select_lex->db,
|
check_access(thd, INSERT_ACL | CREATE_ACL, select_lex->db,
|
||||||
&priv,
|
&priv,
|
||||||
NULL, /* Don't use first_tab->grant with sel_lex->db */
|
NULL, /* Don't use first_tab->grant with sel_lex->db */
|
||||||
0, 0) ||
|
0, 0))
|
||||||
check_merge_table_access(thd, first_table->db,
|
|
||||||
create_info.merge_list.first))
|
|
||||||
DBUG_RETURN(TRUE); /* purecov: inspected */
|
DBUG_RETURN(TRUE); /* purecov: inspected */
|
||||||
|
|
||||||
|
/* If it is a merge table, check privileges for merge children. */
|
||||||
|
if (create_info.merge_list.first &&
|
||||||
|
check_table_access(thd, SELECT_ACL | UPDATE_ACL | DELETE_ACL,
|
||||||
|
create_info.merge_list.first, FALSE, UINT_MAX, FALSE))
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
if (check_grant(thd, priv_needed, first_table, FALSE, UINT_MAX, FALSE))
|
if (check_grant(thd, priv_needed, first_table, FALSE, UINT_MAX, FALSE))
|
||||||
DBUG_RETURN(TRUE); /* purecov: inspected */
|
DBUG_RETURN(TRUE); /* purecov: inspected */
|
||||||
|
|
||||||
|
@ -642,45 +642,6 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
@brief Check access privs for a MERGE table and fix children lock types.
|
|
||||||
|
|
||||||
@param[in] thd thread handle
|
|
||||||
@param[in] db database name
|
|
||||||
@param[in,out] table_list list of child tables (merge_list)
|
|
||||||
lock_type and optionally db set per table
|
|
||||||
|
|
||||||
@return status
|
|
||||||
@retval 0 OK
|
|
||||||
@retval != 0 Error
|
|
||||||
|
|
||||||
@detail
|
|
||||||
This function is used for write access to MERGE tables only
|
|
||||||
(CREATE TABLE, ALTER TABLE ... UNION=(...)). Set TL_WRITE for
|
|
||||||
every child. Set 'db' for every child if not present.
|
|
||||||
*/
|
|
||||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
|
||||||
bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *table_list)
|
|
||||||
{
|
|
||||||
int error= 0;
|
|
||||||
|
|
||||||
if (table_list)
|
|
||||||
{
|
|
||||||
/* Check that all tables use the current database */
|
|
||||||
TABLE_LIST *tlist;
|
|
||||||
|
|
||||||
for (tlist= table_list; tlist; tlist= tlist->next_local)
|
|
||||||
{
|
|
||||||
if (!tlist->db || !tlist->db[0])
|
|
||||||
tlist->db= db; /* purecov: inspected */
|
|
||||||
}
|
|
||||||
error= check_table_access(thd, SELECT_ACL | UPDATE_ACL | DELETE_ACL,
|
|
||||||
table_list, FALSE, UINT_MAX, FALSE);
|
|
||||||
}
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This works because items are allocated with sql_alloc() */
|
/* This works because items are allocated with sql_alloc() */
|
||||||
|
|
||||||
void free_items(Item *item)
|
void free_items(Item *item)
|
||||||
@ -6963,10 +6924,16 @@ bool create_table_precheck(THD *thd, TABLE_LIST *tables,
|
|||||||
if (check_access(thd, want_priv, create_table->db,
|
if (check_access(thd, want_priv, create_table->db,
|
||||||
&create_table->grant.privilege,
|
&create_table->grant.privilege,
|
||||||
&create_table->grant.m_internal,
|
&create_table->grant.m_internal,
|
||||||
0, 0) ||
|
0, 0))
|
||||||
check_merge_table_access(thd, create_table->db,
|
|
||||||
lex->create_info.merge_list.first))
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
/* If it is a merge table, check privileges for merge children. */
|
||||||
|
if (lex->create_info.merge_list.first &&
|
||||||
|
check_table_access(thd, SELECT_ACL | UPDATE_ACL | DELETE_ACL,
|
||||||
|
lex->create_info.merge_list.first,
|
||||||
|
FALSE, UINT_MAX, FALSE))
|
||||||
|
goto err;
|
||||||
|
|
||||||
if (want_priv != CREATE_TMP_ACL &&
|
if (want_priv != CREATE_TMP_ACL &&
|
||||||
check_grant(thd, want_priv, create_table, FALSE, 1, FALSE))
|
check_grant(thd, want_priv, create_table, FALSE, 1, FALSE))
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -153,7 +153,6 @@ bool check_single_table_access(THD *thd, ulong privilege,
|
|||||||
bool check_routine_access(THD *thd,ulong want_access,char *db,char *name,
|
bool check_routine_access(THD *thd,ulong want_access,char *db,char *name,
|
||||||
bool is_proc, bool no_errors);
|
bool is_proc, bool no_errors);
|
||||||
bool check_some_access(THD *thd, ulong want_access, TABLE_LIST *table);
|
bool check_some_access(THD *thd, ulong want_access, TABLE_LIST *table);
|
||||||
bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *table_list);
|
|
||||||
bool check_some_routine_access(THD *thd, const char *db, const char *name, bool is_proc);
|
bool check_some_routine_access(THD *thd, const char *db, const char *name, bool is_proc);
|
||||||
bool check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
bool check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
||||||
GRANT_INTERNAL_INFO *grant_internal_info,
|
GRANT_INTERNAL_INFO *grant_internal_info,
|
||||||
@ -176,8 +175,6 @@ inline bool check_some_access(THD *thd, ulong want_access, TABLE_LIST *table)
|
|||||||
table->grant.privilege= want_access;
|
table->grant.privilege= want_access;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
inline bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *table_list)
|
|
||||||
{ return false; }
|
|
||||||
inline bool check_some_routine_access(THD *thd, const char *db,
|
inline bool check_some_routine_access(THD *thd, const char *db,
|
||||||
const char *name, bool is_proc)
|
const char *name, bool is_proc)
|
||||||
{ return false; }
|
{ return false; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user