mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Fixes after merge with 4.0
Cleaned up embedded library access and query cache handling Changed min stack size to 128K (to allow longer MyISAM keys) Fixed wrong priority for XOR (should be less than NEG to get -1^1 to work)
This commit is contained in:
275
sql/sql_parse.cc
275
sql/sql_parse.cc
@@ -51,14 +51,9 @@ extern "C" int gethostname(char *name, int namelen);
|
||||
static int check_for_max_user_connections(THD *thd, USER_CONN *uc);
|
||||
static void decrease_user_connections(USER_CONN *uc);
|
||||
static bool check_db_used(THD *thd,TABLE_LIST *tables);
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
static bool check_merge_table_access(THD *thd, char *db, TABLE_LIST *tables);
|
||||
static bool single_table_command_access(THD *thd, ulong privilege,
|
||||
TABLE_LIST *tables, int *res);
|
||||
#else
|
||||
#define check_merge_table_access(thd, db, tables) false
|
||||
#define single_table_command_access(thd, privilege, tables, res) false
|
||||
#endif
|
||||
static void remove_escape(char *name);
|
||||
static void refresh_status(void);
|
||||
static bool append_file_to_dir(THD *thd, char **filename_ptr,
|
||||
@@ -177,7 +172,6 @@ end:
|
||||
|
||||
}
|
||||
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
|
||||
/*
|
||||
Check if user exist and password supplied is correct.
|
||||
@@ -210,6 +204,11 @@ int check_user(THD *thd, enum enum_server_command command,
|
||||
{
|
||||
DBUG_ENTER("check_user");
|
||||
|
||||
#ifdef NO_EMBEDDED_ACCESS_CHECKS
|
||||
thd->master_access= GLOBAL_ACLS; // Full rights
|
||||
return 0;
|
||||
#else
|
||||
|
||||
my_bool opt_secure_auth_local;
|
||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||
opt_secure_auth_local= opt_secure_auth;
|
||||
@@ -333,7 +332,8 @@ int check_user(THD *thd, enum enum_server_command command,
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
send_ok(thd);
|
||||
else
|
||||
send_ok(thd);
|
||||
thd->password= test(passwd_len); // remember for error messages
|
||||
/* Ready to handle queries */
|
||||
DBUG_RETURN(0);
|
||||
@@ -354,11 +354,9 @@ int check_user(THD *thd, enum enum_server_command command,
|
||||
thd->host_or_ip,
|
||||
passwd_len ? ER(ER_YES) : ER(ER_NO));
|
||||
DBUG_RETURN(-1);
|
||||
#endif /* NO_EMBEDDED_ACCESS_CHECKS */
|
||||
}
|
||||
|
||||
#endif /*!NO_EMBEDDED_ACCESS_CHECKS*/
|
||||
|
||||
|
||||
/*
|
||||
Check for maximum allowable user connections, if the mysqld server is
|
||||
started with corresponding variable that is greater then 0.
|
||||
@@ -509,7 +507,6 @@ bool is_update_query(enum enum_sql_command command)
|
||||
return uc_update_queries[command];
|
||||
}
|
||||
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
/*
|
||||
Check if maximum queries per hour limit has been reached
|
||||
returns 0 if OK.
|
||||
@@ -528,6 +525,9 @@ static bool check_mqh(THD *thd, uint check_command)
|
||||
DBUG_ENTER("check_mqh");
|
||||
DBUG_ASSERT(uc != 0);
|
||||
|
||||
#ifdef NO_EMBEDDED_ACCESS_CHECKS
|
||||
DBUG_RETURN(0);
|
||||
#else
|
||||
/* If more than a hour since last check, reset resource checking */
|
||||
if (check_time - uc->intime >= 3600)
|
||||
{
|
||||
@@ -561,12 +561,13 @@ static bool check_mqh(THD *thd, uint check_command)
|
||||
}
|
||||
end:
|
||||
DBUG_RETURN(error);
|
||||
#endif /* NO_EMBEDDED_ACCESS_CHECKS */
|
||||
}
|
||||
|
||||
|
||||
static void reset_mqh(THD *thd, LEX_USER *lu, bool get_them= 0)
|
||||
{
|
||||
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
(void) pthread_mutex_lock(&LOCK_user_conn);
|
||||
if (lu) // for GRANT
|
||||
{
|
||||
@@ -590,7 +591,8 @@ static void reset_mqh(THD *thd, LEX_USER *lu, bool get_them= 0)
|
||||
{
|
||||
for (uint idx=0;idx < hash_user_connections.records; idx++)
|
||||
{
|
||||
USER_CONN *uc=(struct user_conn *) hash_element(&hash_user_connections, idx);
|
||||
USER_CONN *uc=(struct user_conn *) hash_element(&hash_user_connections,
|
||||
idx);
|
||||
if (get_them)
|
||||
get_mqh(uc->user,uc->host,uc);
|
||||
uc->questions=0;
|
||||
@@ -599,8 +601,8 @@ static void reset_mqh(THD *thd, LEX_USER *lu, bool get_them= 0)
|
||||
}
|
||||
}
|
||||
(void) pthread_mutex_unlock(&LOCK_user_conn);
|
||||
#endif /* NO_EMBEDDED_ACCESS_CHECKS */
|
||||
}
|
||||
#endif /*!NO_EMBEDDED_ACCESS_CHECKS*/
|
||||
|
||||
/*
|
||||
Perform handshake, authorize client and update thd ACL variables.
|
||||
@@ -1065,7 +1067,6 @@ extern "C" pthread_handler_decl(handle_bootstrap,arg)
|
||||
thd->query= thd->memdup_w_gap(buff, length+1, thd->db_length+1);
|
||||
thd->query[length] = '\0';
|
||||
thd->query_id=query_id++;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (mqh_used && thd->user_connect && check_mqh(thd, SQLCOM_END))
|
||||
{
|
||||
thd->net.error = 0;
|
||||
@@ -1073,7 +1074,6 @@ extern "C" pthread_handler_decl(handle_bootstrap,arg)
|
||||
free_root(&thd->mem_root,MYF(MY_KEEP_PREALLOC));
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
mysql_parse(thd,thd->query,length);
|
||||
close_thread_tables(thd); // Free tables
|
||||
if (thd->is_fatal_error)
|
||||
@@ -1137,12 +1137,10 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd)
|
||||
if (!(table=open_ltable(thd, table_list, TL_READ_NO_INSERT)))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd, SELECT_ACL, db, &table_list->grant.privilege,0,0))
|
||||
goto err;
|
||||
if (grant_option && check_grant(thd, SELECT_ACL, table_list))
|
||||
if (grant_option && check_grant(thd, SELECT_ACL, table_list, 0, 0))
|
||||
goto err;
|
||||
#endif
|
||||
thd->free_list = 0;
|
||||
thd->query_length=(uint) strlen(tbl_name);
|
||||
thd->query = tbl_name;
|
||||
@@ -1446,13 +1444,11 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
my_casedn_str(files_charset_info, table_list.real_name);
|
||||
remove_escape(table_list.real_name); // This can't have wildcards
|
||||
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,SELECT_ACL,table_list.db,&thd->col_access,0,0))
|
||||
break;
|
||||
table_list.grant.privilege=thd->col_access;
|
||||
if (grant_option && check_grant(thd,SELECT_ACL,&table_list,2))
|
||||
if (grant_option && check_grant(thd,SELECT_ACL,&table_list,2,0))
|
||||
break;
|
||||
#endif /*DONT_ALLOW_SHOW_COMMANDS*/
|
||||
mysqld_list_fields(thd,&table_list,fields);
|
||||
free_items(thd->free_list);
|
||||
break;
|
||||
@@ -1598,19 +1594,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
break;
|
||||
case COM_PROCESS_INFO:
|
||||
statistic_increment(com_stat[SQLCOM_SHOW_PROCESSLIST],&LOCK_status);
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (!thd->priv_user[0] && check_global_access(thd,PROCESS_ACL))
|
||||
break;
|
||||
#endif
|
||||
mysql_log.write(thd,command,NullS);
|
||||
mysqld_list_processes(thd,
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
thd->master_access & PROCESS_ACL ?
|
||||
NullS : thd->priv_user
|
||||
#else
|
||||
NullS
|
||||
#endif
|
||||
,0);
|
||||
NullS : thd->priv_user, 0);
|
||||
break;
|
||||
case COM_PROCESS_KILL:
|
||||
{
|
||||
@@ -1814,29 +1803,17 @@ mysql_execute_command(THD *thd)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (&lex->select_lex != lex->all_selects_list)
|
||||
{
|
||||
byte *save= lex->select_lex.table_list.first;
|
||||
if (lex->sql_command == SQLCOM_CREATE_TABLE)
|
||||
{
|
||||
/* Skip first table, which is the table we are creating */
|
||||
lex->select_lex.table_list.first= (byte*) (((TABLE_LIST *) save)->next);
|
||||
}
|
||||
if (lex->unit.create_total_list(thd, lex, &tables, 0))
|
||||
DBUG_VOID_RETURN;
|
||||
lex->select_lex.table_list.first= save;
|
||||
}
|
||||
if (&lex->select_lex != lex->all_selects_list &&
|
||||
lex->sql_command != SQLCOM_CREATE_TABLE &&
|
||||
lex->unit.create_total_list(thd, lex, &tables, 0))
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
/*
|
||||
When option readonly is set deny operations which change tables.
|
||||
Except for the replication thread and the 'super' users.
|
||||
*/
|
||||
if (opt_readonly &&
|
||||
!(thd->slave_thread
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
|| (thd->master_access & SUPER_ACL)
|
||||
#endif
|
||||
) &&
|
||||
!(thd->slave_thread || (thd->master_access & SUPER_ACL)) &&
|
||||
(uc_update_queries[lex->sql_command] > 0))
|
||||
{
|
||||
send_error(thd, ER_CANT_UPDATE_WITH_READLOCK);
|
||||
@@ -1848,7 +1825,6 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_SELECT:
|
||||
{
|
||||
select_result *result=lex->result;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (tables)
|
||||
{
|
||||
res=check_table_access(thd,
|
||||
@@ -1864,7 +1840,6 @@ mysql_execute_command(THD *thd)
|
||||
res=0;
|
||||
break; // Error message is given
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
In case of single SELECT unit->global_parameters points on first SELECT
|
||||
TODO: move counters to SELECT_LEX
|
||||
@@ -2101,7 +2076,6 @@ mysql_execute_command(THD *thd)
|
||||
{
|
||||
if (!tables->db)
|
||||
tables->db=thd->db;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,CREATE_ACL,tables->db,&tables->grant.privilege,0,0))
|
||||
goto error; /* purecov: inspected */
|
||||
if (grant_option)
|
||||
@@ -2109,12 +2083,11 @@ mysql_execute_command(THD *thd)
|
||||
/* Check that the first table has CREATE privilege */
|
||||
TABLE_LIST *tmp_table_list=tables->next;
|
||||
tables->next=0;
|
||||
bool error=check_grant(thd,CREATE_ACL,tables);
|
||||
bool error=check_grant(thd,CREATE_ACL,tables,0,0);
|
||||
tables->next=tmp_table_list;
|
||||
if (error)
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
if (strlen(tables->real_name) > NAME_LEN)
|
||||
{
|
||||
net_printf(thd,ER_WRONG_TABLE_NAME, tables->real_name);
|
||||
@@ -2137,43 +2110,34 @@ mysql_execute_command(THD *thd)
|
||||
|
||||
case SQLCOM_CREATE_TABLE:
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
/* Skip first table, which is the table we are creating */
|
||||
TABLE_LIST *create_table= tables;
|
||||
tables= tables->next;
|
||||
lex->select_lex.table_list.first= (byte*) (tables);
|
||||
create_table->next= 0;
|
||||
if (&lex->select_lex != lex->all_selects_list &&
|
||||
lex->unit.create_total_list(thd, lex, &tables, 0))
|
||||
DBUG_VOID_RETURN;
|
||||
|
||||
ulong want_priv= ((lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) ?
|
||||
CREATE_TMP_ACL : CREATE_ACL);
|
||||
#endif
|
||||
if (!tables->db)
|
||||
tables->db=thd->db;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,want_priv,tables->db,&tables->grant.privilege,0,0) ||
|
||||
check_merge_table_access(thd, tables->db,
|
||||
if (check_access(thd, want_priv, create_table->db,
|
||||
&create_table->grant.privilege, 0, 0) ||
|
||||
check_merge_table_access(thd, create_table->db,
|
||||
(TABLE_LIST *)
|
||||
lex->create_info.merge_list.first))
|
||||
goto error; /* purecov: inspected */
|
||||
if (grant_option && want_priv != CREATE_TMP_ACL)
|
||||
{
|
||||
/* Check that the first table has CREATE privilege */
|
||||
TABLE_LIST *tmp_table_list=tables->next;
|
||||
tables->next=0;
|
||||
bool error=check_grant(thd, want_priv, tables);
|
||||
tables->next=tmp_table_list;
|
||||
if (error)
|
||||
if (grant_option && want_priv != CREATE_TMP_ACL &&
|
||||
check_grant(thd, want_priv, create_table,0,0))
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
if (strlen(tables->real_name) > NAME_LEN)
|
||||
{
|
||||
net_printf(thd, ER_WRONG_TABLE_NAME, tables->alias);
|
||||
res=0;
|
||||
break;
|
||||
}
|
||||
#ifndef HAVE_READLINK
|
||||
lex->create_info.data_file_name=lex->create_info.index_file_name=0;
|
||||
#else
|
||||
/* Fix names if symlinked tables */
|
||||
if (append_file_to_dir(thd, &lex->create_info.data_file_name,
|
||||
tables->real_name) ||
|
||||
create_table->real_name) ||
|
||||
append_file_to_dir(thd,&lex->create_info.index_file_name,
|
||||
tables->real_name))
|
||||
create_table->real_name))
|
||||
{
|
||||
res=-1;
|
||||
break;
|
||||
@@ -2197,49 +2161,42 @@ mysql_execute_command(THD *thd)
|
||||
select_result *result;
|
||||
|
||||
if (!(lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) &&
|
||||
find_real_table_in_list(tables->next, tables->db, tables->real_name))
|
||||
find_real_table_in_list(tables, create_table->db,
|
||||
create_table->real_name))
|
||||
{
|
||||
net_printf(thd,ER_UPDATE_TABLE_USED,tables->real_name);
|
||||
net_printf(thd,ER_UPDATE_TABLE_USED, create_table->real_name);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (tables->next)
|
||||
{
|
||||
if (check_table_access(thd, SELECT_ACL, tables->next,0))
|
||||
goto error; // Error message is given
|
||||
}
|
||||
#endif
|
||||
if (tables && check_table_access(thd, SELECT_ACL, tables,0))
|
||||
goto error; // Error message is given
|
||||
select_lex->options|= SELECT_NO_UNLOCK;
|
||||
unit->offset_limit_cnt= select_lex->offset_limit;
|
||||
unit->select_limit_cnt= select_lex->select_limit+
|
||||
select_lex->offset_limit;
|
||||
if (unit->select_limit_cnt < select_lex->select_limit)
|
||||
unit->select_limit_cnt= HA_POS_ERROR; // No limit
|
||||
unit->select_limit_cnt= HA_POS_ERROR; // No limit
|
||||
|
||||
/* Skip first table, which is the table we are creating */
|
||||
lex->select_lex.table_list.first=
|
||||
(byte*) (((TABLE_LIST *) lex->select_lex.table_list.first)->next);
|
||||
if (!(res=open_and_lock_tables(thd,tables->next)))
|
||||
if (!(res=open_and_lock_tables(thd,tables)))
|
||||
{
|
||||
if ((result=new select_create(tables->db ? tables->db : thd->db,
|
||||
tables->real_name, &lex->create_info,
|
||||
res= -1; // If error
|
||||
if ((result=new select_create(create_table->db,
|
||||
create_table->real_name,
|
||||
&lex->create_info,
|
||||
lex->create_list,
|
||||
lex->key_list,
|
||||
select_lex->item_list,lex->duplicates)))
|
||||
res=handle_select(thd, lex, result);
|
||||
else
|
||||
res= -1;
|
||||
}
|
||||
}
|
||||
else // regular create
|
||||
{
|
||||
if (lex->name)
|
||||
res= mysql_create_like_table(thd, tables, &lex->create_info,
|
||||
res= mysql_create_like_table(thd, create_table, &lex->create_info,
|
||||
(Table_ident *)lex->name);
|
||||
else
|
||||
{
|
||||
res= mysql_create_table(thd,tables->db ? tables->db : thd->db,
|
||||
tables->real_name, &lex->create_info,
|
||||
res= mysql_create_table(thd,create_table->db,
|
||||
create_table->real_name, &lex->create_info,
|
||||
lex->create_list,
|
||||
lex->key_list,0,0,0); // do logging
|
||||
}
|
||||
@@ -2251,12 +2208,10 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_CREATE_INDEX:
|
||||
if (!tables->db)
|
||||
tables->db=thd->db;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,INDEX_ACL,tables->db,&tables->grant.privilege,0,0))
|
||||
goto error; /* purecov: inspected */
|
||||
if (grant_option && check_grant(thd,INDEX_ACL,tables))
|
||||
if (grant_option && check_grant(thd,INDEX_ACL,tables,0,0))
|
||||
goto error;
|
||||
#endif
|
||||
thd->slow_command=TRUE;
|
||||
if (end_active_trans(thd))
|
||||
res= -1;
|
||||
@@ -2324,10 +2279,9 @@ mysql_execute_command(THD *thd)
|
||||
goto error; /* purecov: inspected */
|
||||
if (!tables->db)
|
||||
tables->db=thd->db;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (grant_option)
|
||||
{
|
||||
if (check_grant(thd,ALTER_ACL,tables))
|
||||
if (check_grant(thd,ALTER_ACL,tables,0,0))
|
||||
goto error;
|
||||
if (lex->name && !test_all_bits(priv,INSERT_ACL | CREATE_ACL))
|
||||
{ // Rename of table
|
||||
@@ -2336,11 +2290,10 @@ mysql_execute_command(THD *thd)
|
||||
tmp_table.real_name=lex->name;
|
||||
tmp_table.db=select_lex->db;
|
||||
tmp_table.grant.privilege=priv;
|
||||
if (check_grant(thd,INSERT_ACL | CREATE_ACL,tables))
|
||||
if (check_grant(thd,INSERT_ACL | CREATE_ACL,tables,0,0))
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Don't yet allow changing of symlinks with ALTER TABLE */
|
||||
lex->create_info.data_file_name=lex->create_info.index_file_name=0;
|
||||
/* ALTER TABLE ends previous transaction */
|
||||
@@ -2368,7 +2321,6 @@ mysql_execute_command(THD *thd)
|
||||
TABLE_LIST *table;
|
||||
if (check_db_used(thd,tables))
|
||||
goto error;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
for (table=tables ; table ; table=table->next->next)
|
||||
{
|
||||
if (check_access(thd, ALTER_ACL | DROP_ACL, table->db,
|
||||
@@ -2382,14 +2334,13 @@ mysql_execute_command(THD *thd)
|
||||
old_list=table[0];
|
||||
new_list=table->next[0];
|
||||
old_list.next=new_list.next=0;
|
||||
if (check_grant(thd,ALTER_ACL,&old_list) ||
|
||||
if (check_grant(thd,ALTER_ACL,&old_list,0,0) ||
|
||||
(!test_all_bits(table->next->grant.privilege,
|
||||
INSERT_ACL | CREATE_ACL) &&
|
||||
check_grant(thd,INSERT_ACL | CREATE_ACL, &new_list)))
|
||||
check_grant(thd,INSERT_ACL | CREATE_ACL, &new_list,0,0)))
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
query_cache_invalidate3(thd, tables, 0);
|
||||
if (end_active_trans(thd))
|
||||
res= -1;
|
||||
@@ -2543,12 +2494,10 @@ mysql_execute_command(THD *thd)
|
||||
res= -1;
|
||||
break;
|
||||
case SQLCOM_UPDATE_MULTI:
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,UPDATE_ACL,tables->db,&tables->grant.privilege,0,0))
|
||||
goto error;
|
||||
if (grant_option && check_grant(thd,UPDATE_ACL,tables))
|
||||
if (grant_option && check_grant(thd,UPDATE_ACL,tables,0,0))
|
||||
goto error;
|
||||
#endif
|
||||
if (select_lex->item_list.elements != lex->value_list.elements)
|
||||
{
|
||||
send_error(thd,ER_WRONG_VALUE_COUNT);
|
||||
@@ -2578,16 +2527,12 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_REPLACE:
|
||||
case SQLCOM_INSERT:
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
my_bool update=(lex->value_list.elements ? UPDATE_ACL : 0);
|
||||
ulong privilege= (lex->duplicates == DUP_REPLACE ?
|
||||
INSERT_ACL | DELETE_ACL : INSERT_ACL | update);
|
||||
|
||||
if (single_table_command_access(thd, privilege, tables, &res))
|
||||
goto error;
|
||||
#else
|
||||
my_bool update=(lex->value_list.elements ? 1 : 0);
|
||||
#endif
|
||||
if (select_lex->item_list.elements != lex->value_list.elements)
|
||||
{
|
||||
send_error(thd,ER_WRONG_VALUE_COUNT);
|
||||
@@ -2607,7 +2552,6 @@ mysql_execute_command(THD *thd)
|
||||
Check that we have modify privileges for the first table and
|
||||
select privileges for the rest
|
||||
*/
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
{
|
||||
ulong privilege= (lex->duplicates == DUP_REPLACE ?
|
||||
INSERT_ACL | DELETE_ACL : INSERT_ACL);
|
||||
@@ -2615,18 +2559,17 @@ mysql_execute_command(THD *thd)
|
||||
tables->next=0;
|
||||
if (check_access(thd, privilege,
|
||||
tables->db,&tables->grant.privilege,0,0) ||
|
||||
(grant_option && check_grant(thd, privilege, tables)))
|
||||
(grant_option && check_grant(thd, privilege, tables,0,0)))
|
||||
goto error;
|
||||
|
||||
tables->next=save_next;
|
||||
if ((res=check_table_access(thd, SELECT_ACL, save_next,0)))
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Fix lock for first table */
|
||||
if (tables->lock_type == TL_WRITE_DELAYED)
|
||||
tables->lock_type == TL_WRITE;
|
||||
tables->lock_type = TL_WRITE;
|
||||
|
||||
/* Don't unlock tables until command is written to binary log */
|
||||
select_lex->options|= SELECT_NO_UNLOCK;
|
||||
@@ -2661,12 +2604,10 @@ mysql_execute_command(THD *thd)
|
||||
break;
|
||||
}
|
||||
case SQLCOM_TRUNCATE:
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,DELETE_ACL,tables->db,&tables->grant.privilege,0,0))
|
||||
goto error; /* purecov: inspected */
|
||||
if (grant_option && check_grant(thd,DELETE_ACL,tables))
|
||||
if (grant_option && check_grant(thd,DELETE_ACL,tables,0,0))
|
||||
goto error;
|
||||
#endif
|
||||
/*
|
||||
Don't allow this within a transaction because we want to use
|
||||
re-generate table
|
||||
@@ -2680,12 +2621,10 @@ mysql_execute_command(THD *thd)
|
||||
break;
|
||||
case SQLCOM_DELETE:
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (single_table_command_access(thd, DELETE_ACL, tables, &res))
|
||||
goto error;
|
||||
// Set privilege for the WHERE clause
|
||||
tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege);
|
||||
#endif
|
||||
res = mysql_delete(thd,tables, select_lex->where,
|
||||
(ORDER*) select_lex->order_list.first,
|
||||
select_lex->select_limit, select_lex->options);
|
||||
@@ -2807,12 +2746,10 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_DROP_INDEX:
|
||||
if (!tables->db)
|
||||
tables->db=thd->db;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,INDEX_ACL,tables->db,&tables->grant.privilege,0,0))
|
||||
goto error; /* purecov: inspected */
|
||||
if (grant_option && check_grant(thd,INDEX_ACL,tables))
|
||||
if (grant_option && check_grant(thd,INDEX_ACL,tables,0,0))
|
||||
goto error;
|
||||
#endif
|
||||
if (end_active_trans(thd))
|
||||
res= -1;
|
||||
else
|
||||
@@ -2830,18 +2767,11 @@ mysql_execute_command(THD *thd)
|
||||
break;
|
||||
#endif
|
||||
case SQLCOM_SHOW_PROCESSLIST:
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (!thd->priv_user[0] && check_global_access(thd,PROCESS_ACL))
|
||||
break;
|
||||
#endif
|
||||
mysqld_list_processes(thd,
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
thd->master_access & PROCESS_ACL ? NullS :
|
||||
thd->priv_user
|
||||
#else
|
||||
NullS
|
||||
#endif
|
||||
,lex->verbose);
|
||||
thd->priv_user,lex->verbose);
|
||||
break;
|
||||
case SQLCOM_SHOW_TABLE_TYPES:
|
||||
res= mysqld_show_table_types(thd);
|
||||
@@ -2867,10 +2797,8 @@ mysql_execute_command(THD *thd)
|
||||
DBUG_VOID_RETURN;
|
||||
#else
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (grant_option && check_access(thd, FILE_ACL, any_db,0,0,0))
|
||||
goto error;
|
||||
#endif
|
||||
res= mysqld_show_logs(thd);
|
||||
break;
|
||||
}
|
||||
@@ -2894,7 +2822,6 @@ mysql_execute_command(THD *thd)
|
||||
net_printf(thd,ER_WRONG_DB_NAME, db);
|
||||
goto error;
|
||||
}
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,SELECT_ACL,db,&thd->col_access,0,0))
|
||||
goto error; /* purecov: inspected */
|
||||
if (!thd->col_access && check_grant_db(thd,db))
|
||||
@@ -2905,7 +2832,6 @@ mysql_execute_command(THD *thd)
|
||||
db);
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
/* grant is checked in mysqld_show_tables */
|
||||
if (select_lex->options & SELECT_DESCRIBE)
|
||||
res= mysqld_extend_show_tables(thd,db,
|
||||
@@ -2939,13 +2865,11 @@ mysql_execute_command(THD *thd)
|
||||
}
|
||||
remove_escape(db); // Fix escaped '_'
|
||||
remove_escape(tables->real_name);
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,&thd->col_access,0,0))
|
||||
goto error; /* purecov: inspected */
|
||||
tables->grant.privilege=thd->col_access;
|
||||
if (grant_option && check_grant(thd,SELECT_ACL,tables,2))
|
||||
if (grant_option && check_grant(thd,SELECT_ACL,tables,2,0))
|
||||
goto error;
|
||||
#endif
|
||||
res= mysqld_show_fields(thd,tables,
|
||||
(lex->wild ? lex->wild->ptr() : NullS),
|
||||
lex->verbose);
|
||||
@@ -2968,13 +2892,11 @@ mysql_execute_command(THD *thd)
|
||||
remove_escape(tables->real_name);
|
||||
if (!tables->db)
|
||||
tables->db=thd->db;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (check_access(thd,SELECT_ACL,db,&thd->col_access,0,0))
|
||||
goto error; /* purecov: inspected */
|
||||
tables->grant.privilege=thd->col_access;
|
||||
if (grant_option && check_grant(thd,SELECT_ACL,tables,2))
|
||||
if (grant_option && check_grant(thd,SELECT_ACL,tables,2,0))
|
||||
goto error;
|
||||
#endif
|
||||
res= mysqld_show_keys(thd,tables);
|
||||
break;
|
||||
}
|
||||
@@ -2985,7 +2907,6 @@ mysql_execute_command(THD *thd)
|
||||
|
||||
case SQLCOM_LOAD:
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
uint privilege= (lex->duplicates == DUP_REPLACE ?
|
||||
INSERT_ACL | DELETE_ACL : INSERT_ACL);
|
||||
|
||||
@@ -3002,11 +2923,11 @@ mysql_execute_command(THD *thd)
|
||||
send_error(thd,ER_NOT_ALLOWED_COMMAND);
|
||||
goto error;
|
||||
}
|
||||
if (check_access(thd,privilege,tables->db,&tables->grant.privilege,0,0) ||
|
||||
grant_option && check_grant(thd,privilege,tables))
|
||||
if (check_access(thd,privilege,tables->db,&tables->grant.privilege,0,
|
||||
0) ||
|
||||
grant_option && check_grant(thd,privilege,tables,0,0))
|
||||
goto error;
|
||||
}
|
||||
#endif /*NO_EMBEDDED_ACCESS_CHECKS*/
|
||||
res=mysql_load(thd, lex->exchange, tables, lex->field_list,
|
||||
lex->duplicates, (bool) lex->local_file, lex->lock_option);
|
||||
break;
|
||||
@@ -3250,7 +3171,7 @@ mysql_execute_command(THD *thd)
|
||||
if (grant_option && check_grant(thd,
|
||||
(lex->grant | lex->grant_tot_col |
|
||||
GRANT_ACL),
|
||||
tables))
|
||||
tables,0,0))
|
||||
goto error;
|
||||
if (!(res = mysql_table_grant(thd,tables,lex->users_list, lex->columns,
|
||||
lex->grant,
|
||||
@@ -3458,7 +3379,6 @@ error:
|
||||
}
|
||||
|
||||
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
/*
|
||||
Check grants for commands which work only with one table and all other
|
||||
tables belong to subselects.
|
||||
@@ -3479,23 +3399,23 @@ static bool single_table_command_access(THD *thd, ulong privilege,
|
||||
TABLE_LIST *tables, int *res)
|
||||
|
||||
{
|
||||
if (check_access(thd, privilege, tables->db, &tables->grant.privilege,0,0))
|
||||
return 1;
|
||||
if (check_access(thd, privilege, tables->db, &tables->grant.privilege,0,0))
|
||||
return 1;
|
||||
|
||||
// Show only 1 table for check_grant
|
||||
TABLE_LIST *subselects_tables= tables->next;
|
||||
tables->next= 0;
|
||||
if (grant_option && check_grant(thd, privilege, tables))
|
||||
return 1;
|
||||
// Show only 1 table for check_grant
|
||||
TABLE_LIST *subselects_tables= tables->next;
|
||||
tables->next= 0;
|
||||
if (grant_option && check_grant(thd, privilege, tables, 0, 0))
|
||||
return 1;
|
||||
|
||||
// check rights on tables of subselect (if exists)
|
||||
if (subselects_tables)
|
||||
{
|
||||
tables->next= subselects_tables;
|
||||
if ((*res= check_table_access(thd, SELECT_ACL, subselects_tables,0)))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
// check rights on tables of subselect (if exists)
|
||||
if (subselects_tables)
|
||||
{
|
||||
tables->next= subselects_tables;
|
||||
if ((*res= check_table_access(thd, SELECT_ACL, subselects_tables,0)))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -3538,6 +3458,9 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
||||
DBUG_RETURN(TRUE); /* purecov: tested */
|
||||
}
|
||||
|
||||
#ifdef NO_EMBEDDED_ACCESS_CHECKS
|
||||
DBUG_RETURN(0);
|
||||
#else
|
||||
if ((thd->master_access & want_access) == want_access)
|
||||
{
|
||||
/*
|
||||
@@ -3587,6 +3510,7 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
||||
thd->priv_host,
|
||||
db ? db : thd->db ? thd->db : "unknown"); /* purecov: tested */
|
||||
DBUG_RETURN(TRUE); /* purecov: tested */
|
||||
#endif /* NO_EMBEDDED_ACCESS_CHECKS */
|
||||
}
|
||||
|
||||
|
||||
@@ -3611,6 +3535,9 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
||||
|
||||
bool check_global_access(THD *thd, ulong want_access)
|
||||
{
|
||||
#ifdef NO_EMBEDDED_ACCESS_CHECKS
|
||||
return 0;
|
||||
#else
|
||||
char command[128];
|
||||
if ((thd->master_access & want_access))
|
||||
return 0;
|
||||
@@ -3618,6 +3545,7 @@ bool check_global_access(THD *thd, ulong want_access)
|
||||
net_printf(thd,ER_SPECIFIC_ACCESS_DENIED_ERROR,
|
||||
command);
|
||||
return 1;
|
||||
#endif /* NO_EMBEDDED_ACCESS_CHECKS */
|
||||
}
|
||||
|
||||
|
||||
@@ -3682,7 +3610,6 @@ static bool check_merge_table_access(THD *thd, char *db,
|
||||
return error;
|
||||
}
|
||||
|
||||
#endif /*!NO_EMBEDDED_ACCESS_CHECKS*/
|
||||
|
||||
static bool check_db_used(THD *thd,TABLE_LIST *tables)
|
||||
{
|
||||
@@ -3941,9 +3868,7 @@ mysql_parse(THD *thd, char *inBuf, uint length)
|
||||
else
|
||||
{
|
||||
mysql_execute_command(thd);
|
||||
#ifndef EMBEDDED_LIBRARY /* TODO query cache in embedded library*/
|
||||
query_cache_end_of_result(&thd->net);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3951,9 +3876,7 @@ mysql_parse(THD *thd, char *inBuf, uint length)
|
||||
{
|
||||
DBUG_PRINT("info",("Command aborted. Fatal_error: %d",
|
||||
thd->is_fatal_error));
|
||||
#ifndef EMBEDDED_LIBRARY /* TODO query cache in embedded library*/
|
||||
query_cache_abort(&thd->net);
|
||||
#endif
|
||||
}
|
||||
thd->proc_info="freeing items";
|
||||
free_items(thd->free_list); /* Free strings used by items */
|
||||
@@ -4005,7 +3928,7 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
|
||||
{
|
||||
if (type == FIELD_TYPE_TIMESTAMP)
|
||||
{
|
||||
net_printf(&thd->net, ER_INVALID_DEFAULT, field_name);
|
||||
net_printf(thd, ER_INVALID_DEFAULT, field_name);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
else if (default_value->type() == Item::NULL_ITEM)
|
||||
@@ -4674,10 +4597,8 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
|
||||
UNLOCK_ACTIVE_MI;
|
||||
}
|
||||
#endif
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (options & REFRESH_USER_RESOURCES)
|
||||
reset_mqh(thd,(LEX_USER *) NULL);
|
||||
#endif
|
||||
if (write_to_binlog)
|
||||
*write_to_binlog= tmp_write_to_binlog;
|
||||
return result;
|
||||
@@ -4712,18 +4633,14 @@ void kill_one_thread(THD *thd, ulong id)
|
||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||
if (tmp)
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if ((thd->master_access & SUPER_ACL) ||
|
||||
!strcmp(thd->user,tmp->user))
|
||||
#endif
|
||||
{
|
||||
tmp->awake(1 /*prepare to die*/);
|
||||
error=0;
|
||||
}
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
else
|
||||
error=ER_KILL_DENIED_ERROR;
|
||||
#endif
|
||||
pthread_mutex_unlock(&tmp->LOCK_delete);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user