mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
Merge work:/my/mysql-3.23 into mashka.mysql.fi:/home/my/mysql-3.23
This commit is contained in:
commit
c4302b0beb
12 changed files with 90 additions and 62 deletions
|
@ -46931,10 +46931,16 @@ not yet 100% confident in this code.
|
||||||
@item
|
@item
|
||||||
Fixed core dump bug when using the @code{BINARY} cast on a @code{NULL} value.
|
Fixed core dump bug when using the @code{BINARY} cast on a @code{NULL} value.
|
||||||
@item
|
@item
|
||||||
|
Fixed race condition when someone did a @code{GRANT} at the same time a new
|
||||||
|
user logged in or did a @code{USE DATABASE}.
|
||||||
|
@item
|
||||||
Fixed bug in @code{ALTER TABLE} and @code{RENAME TABLE} when running with
|
Fixed bug in @code{ALTER TABLE} and @code{RENAME TABLE} when running with
|
||||||
@code{-O lower_case_table_names=1} (typically on windows) when giving the
|
@code{-O lower_case_table_names=1} (typically on windows) when giving the
|
||||||
table name in uppercase.
|
table name in uppercase.
|
||||||
@item
|
@item
|
||||||
|
Fixed that @code{-O lower_case_table_names=1} also converts database
|
||||||
|
names to lower case.
|
||||||
|
@item
|
||||||
Fixed unlikely core dump with @code{SELECT ... ORDER BY ... LIMIT}.
|
Fixed unlikely core dump with @code{SELECT ... ORDER BY ... LIMIT}.
|
||||||
@item
|
@item
|
||||||
Changed @code{AND/OR} to report that they can return NULL. This fixes a
|
Changed @code{AND/OR} to report that they can return NULL. This fixes a
|
||||||
|
|
|
@ -419,7 +419,7 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list)
|
||||||
uint key_length;
|
uint key_length;
|
||||||
DBUG_ENTER("lock_table_name");
|
DBUG_ENTER("lock_table_name");
|
||||||
|
|
||||||
key_length=(uint) (strmov(strmov(key,table_list->db)+1,table_list->name)
|
key_length=(uint) (strmov(strmov(key,table_list->db)+1,table_list->real_name)
|
||||||
-key)+ 1;
|
-key)+ 1;
|
||||||
|
|
||||||
/* Only insert the table if we haven't insert it already */
|
/* Only insert the table if we haven't insert it already */
|
||||||
|
@ -447,7 +447,7 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list)
|
||||||
my_free((gptr) table,MYF(0));
|
my_free((gptr) table,MYF(0));
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
if (remove_table_from_cache(thd, table_list->db, table_list->name))
|
if (remove_table_from_cache(thd, table_list->db, table_list->real_name))
|
||||||
DBUG_RETURN(1); // Table is in use
|
DBUG_RETURN(1); // Table is in use
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -399,7 +399,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db,
|
||||||
|
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables.db = (char*)db;
|
tables.db = (char*)db;
|
||||||
tables.name = tables.real_name = (char*)table_name;
|
tables.alias= tables.real_name= (char*)table_name;
|
||||||
tables.lock_type = TL_WRITE;
|
tables.lock_type = TL_WRITE;
|
||||||
thd->proc_info = "Opening master dump table";
|
thd->proc_info = "Opening master dump table";
|
||||||
if (!open_ltable(thd, &tables, TL_WRITE))
|
if (!open_ltable(thd, &tables, TL_WRITE))
|
||||||
|
@ -1073,7 +1073,7 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
|
||||||
TABLE_LIST tables;
|
TABLE_LIST tables;
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables.db = thd->db;
|
tables.db = thd->db;
|
||||||
tables.name = tables.real_name = (char*)lev->table_name;
|
tables.alias= tables.real_name= (char*)lev->table_name;
|
||||||
tables.lock_type = TL_WRITE;
|
tables.lock_type = TL_WRITE;
|
||||||
// the table will be opened in mysql_load
|
// the table will be opened in mysql_load
|
||||||
if(table_rules_on && !tables_ok(thd, &tables))
|
if(table_rules_on && !tables_ok(thd, &tables))
|
||||||
|
|
|
@ -130,9 +130,9 @@ int acl_init(bool dont_read_acl_tables)
|
||||||
thd->open_tables=0;
|
thd->open_tables=0;
|
||||||
thd->db=my_strdup("mysql",MYF(0));
|
thd->db=my_strdup("mysql",MYF(0));
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables[0].name=tables[0].real_name=(char*) "host";
|
tables[0].alias=tables[0].real_name=(char*) "host";
|
||||||
tables[1].name=tables[1].real_name=(char*) "user";
|
tables[1].alias=tables[1].real_name=(char*) "user";
|
||||||
tables[2].name=tables[2].real_name=(char*) "db";
|
tables[2].alias=tables[2].real_name=(char*) "db";
|
||||||
tables[0].next=tables+1;
|
tables[0].next=tables+1;
|
||||||
tables[1].next=tables+2;
|
tables[1].next=tables+2;
|
||||||
tables[0].lock_type=tables[1].lock_type=tables[2].lock_type=TL_READ;
|
tables[0].lock_type=tables[1].lock_type=tables[2].lock_type=TL_READ;
|
||||||
|
@ -922,7 +922,7 @@ static bool update_user_table(THD *thd, const char *host, const char *user,
|
||||||
DBUG_PRINT("enter",("user: %s host: %s",user,host));
|
DBUG_PRINT("enter",("user: %s host: %s",user,host));
|
||||||
|
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables.name=tables.real_name=(char*) "user";
|
tables.alias=tables.real_name=(char*) "user";
|
||||||
tables.db=(char*) "mysql";
|
tables.db=(char*) "mysql";
|
||||||
if (!(table=open_ltable(thd,&tables,TL_WRITE)))
|
if (!(table=open_ltable(thd,&tables,TL_WRITE)))
|
||||||
DBUG_RETURN(1); /* purecov: deadcode */
|
DBUG_RETURN(1); /* purecov: deadcode */
|
||||||
|
@ -1653,7 +1653,7 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
|
||||||
check->column.length(),0,0))
|
check->column.length(),0,0))
|
||||||
{
|
{
|
||||||
my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0),
|
my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0),
|
||||||
check->column.c_ptr(),table_list->name);
|
check->column.c_ptr(),table_list->alias);
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
column_priv |= check->rights | (rights & COL_ACLS);
|
column_priv |= check->rights | (rights & COL_ACLS);
|
||||||
|
@ -1664,11 +1664,11 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
|
||||||
{
|
{
|
||||||
char buf[FN_REFLEN];
|
char buf[FN_REFLEN];
|
||||||
sprintf(buf,"%s/%s/%s.frm",mysql_data_home,table_list->db,
|
sprintf(buf,"%s/%s/%s.frm",mysql_data_home,table_list->db,
|
||||||
table_list->name);
|
table_list->real_name);
|
||||||
fn_format(buf,buf,"","",4+16+32);
|
fn_format(buf,buf,"","",4+16+32);
|
||||||
if (access(buf,F_OK))
|
if (access(buf,F_OK))
|
||||||
{
|
{
|
||||||
my_error(ER_NO_SUCH_TABLE,MYF(0),table_list->db,table_list->name);
|
my_error(ER_NO_SUCH_TABLE,MYF(0),table_list->db,table_list->real_name);
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1676,9 +1676,9 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
|
||||||
/* open the mysql.tables_priv and mysql.columns_priv tables */
|
/* open the mysql.tables_priv and mysql.columns_priv tables */
|
||||||
|
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables[0].name=tables[0].real_name= (char*) "user";
|
tables[0].alias=tables[0].real_name= (char*) "user";
|
||||||
tables[1].name=tables[1].real_name= (char*) "tables_priv";
|
tables[1].alias=tables[1].real_name= (char*) "tables_priv";
|
||||||
tables[2].name=tables[2].real_name= (char*) "columns_priv";
|
tables[2].alias=tables[2].real_name= (char*) "columns_priv";
|
||||||
tables[0].next=tables+1;
|
tables[0].next=tables+1;
|
||||||
/* Don't open column table if we don't need it ! */
|
/* Don't open column table if we don't need it ! */
|
||||||
tables[1].next=((column_priv ||
|
tables[1].next=((column_priv ||
|
||||||
|
@ -1702,6 +1702,7 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
|
||||||
|
|
||||||
while ((Str = str_list++))
|
while ((Str = str_list++))
|
||||||
{
|
{
|
||||||
|
int error;
|
||||||
GRANT_TABLE *grant_table;
|
GRANT_TABLE *grant_table;
|
||||||
if (!Str->host.str)
|
if (!Str->host.str)
|
||||||
{
|
{
|
||||||
|
@ -1716,11 +1717,14 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* Create user if needed */
|
/* Create user if needed */
|
||||||
if (replace_user_table(tables[0].table,
|
pthread_mutex_lock(&acl_cache->lock);
|
||||||
*Str,
|
error=replace_user_table(tables[0].table,
|
||||||
0,
|
*Str,
|
||||||
revoke_grant ? 'N' : 'Y',
|
0,
|
||||||
create_new_users))
|
revoke_grant ? 'N' : 'Y',
|
||||||
|
create_new_users);
|
||||||
|
pthread_mutex_unlock(&acl_cache->lock);
|
||||||
|
if (error)
|
||||||
{
|
{
|
||||||
result= -1; // Remember error
|
result= -1; // Remember error
|
||||||
continue; // Add next user
|
continue; // Add next user
|
||||||
|
@ -1729,20 +1733,20 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
|
||||||
/* Find/create cached table grant */
|
/* Find/create cached table grant */
|
||||||
grant_table= table_hash_search(Str->host.str,NullS,table_list->db,
|
grant_table= table_hash_search(Str->host.str,NullS,table_list->db,
|
||||||
Str->user.str,
|
Str->user.str,
|
||||||
table_list->name,1);
|
table_list->real_name,1);
|
||||||
if (!grant_table)
|
if (!grant_table)
|
||||||
{
|
{
|
||||||
if (revoke_grant)
|
if (revoke_grant)
|
||||||
{
|
{
|
||||||
my_printf_error(ER_NONEXISTING_TABLE_GRANT,
|
my_printf_error(ER_NONEXISTING_TABLE_GRANT,
|
||||||
ER(ER_NONEXISTING_TABLE_GRANT),MYF(0),
|
ER(ER_NONEXISTING_TABLE_GRANT),MYF(0),
|
||||||
Str->user.str, Str->host.str,table_list->name);
|
Str->user.str, Str->host.str, table_list->real_name);
|
||||||
result= -1;
|
result= -1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
grant_table = new GRANT_TABLE (Str->host.str,table_list->db,
|
grant_table = new GRANT_TABLE (Str->host.str,table_list->db,
|
||||||
Str->user.str,
|
Str->user.str,
|
||||||
table_list->name,
|
table_list->real_name,
|
||||||
rights,
|
rights,
|
||||||
column_priv);
|
column_priv);
|
||||||
if (!grant_table) // end of memory
|
if (!grant_table) // end of memory
|
||||||
|
@ -1789,7 +1793,7 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
|
||||||
|
|
||||||
if (replace_table_table(thd,grant_table,tables[1].table,*Str,
|
if (replace_table_table(thd,grant_table,tables[1].table,*Str,
|
||||||
table_list->db,
|
table_list->db,
|
||||||
table_list->name,
|
table_list->real_name,
|
||||||
rights, column_priv, revoke_grant))
|
rights, column_priv, revoke_grant))
|
||||||
{ // Crashend table ??
|
{ // Crashend table ??
|
||||||
result= -1; /* purecov: deadcode */
|
result= -1; /* purecov: deadcode */
|
||||||
|
@ -1799,7 +1803,7 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
|
||||||
if ((replace_column_table(grant_table,tables[2].table, *Str,
|
if ((replace_column_table(grant_table,tables[2].table, *Str,
|
||||||
columns,
|
columns,
|
||||||
table_list->db,
|
table_list->db,
|
||||||
table_list->name,
|
table_list->real_name,
|
||||||
rights, revoke_grant)))
|
rights, revoke_grant)))
|
||||||
{
|
{
|
||||||
result= -1;
|
result= -1;
|
||||||
|
@ -1836,8 +1840,8 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, uint rights,
|
||||||
|
|
||||||
/* open the mysql.user and mysql.db tables */
|
/* open the mysql.user and mysql.db tables */
|
||||||
|
|
||||||
tables[0].name=tables[0].real_name=(char*) "user";
|
tables[0].alias=tables[0].real_name=(char*) "user";
|
||||||
tables[1].name=tables[1].real_name=(char*) "db";
|
tables[1].alias=tables[1].real_name=(char*) "db";
|
||||||
tables[0].next=tables+1;
|
tables[0].next=tables+1;
|
||||||
tables[1].next=0;
|
tables[1].next=0;
|
||||||
tables[0].lock_type=tables[1].lock_type=TL_WRITE;
|
tables[0].lock_type=tables[1].lock_type=TL_WRITE;
|
||||||
|
@ -1930,8 +1934,8 @@ int grant_init (void)
|
||||||
thd->open_tables=0;
|
thd->open_tables=0;
|
||||||
thd->db=my_strdup("mysql",MYF(0));
|
thd->db=my_strdup("mysql",MYF(0));
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables[0].name=tables[0].real_name= (char*) "tables_priv";
|
tables[0].alias=tables[0].real_name= (char*) "tables_priv";
|
||||||
tables[1].name=tables[1].real_name= (char*) "columns_priv";
|
tables[1].alias=tables[1].real_name= (char*) "columns_priv";
|
||||||
tables[0].next=tables+1;
|
tables[0].next=tables+1;
|
||||||
tables[0].lock_type=tables[1].lock_type=TL_READ;
|
tables[0].lock_type=tables[1].lock_type=TL_READ;
|
||||||
tables[0].db=tables[1].db=thd->db;
|
tables[0].db=tables[1].db=thd->db;
|
||||||
|
@ -2270,6 +2274,7 @@ bool check_grant_db(THD *thd,const char *db)
|
||||||
|
|
||||||
uint get_table_grant(THD *thd, TABLE_LIST *table)
|
uint get_table_grant(THD *thd, TABLE_LIST *table)
|
||||||
{
|
{
|
||||||
|
uint privilege;
|
||||||
char *user = thd->priv_user;
|
char *user = thd->priv_user;
|
||||||
const char *db = table->db ? table->db : thd->db;
|
const char *db = table->db ? table->db : thd->db;
|
||||||
GRANT_TABLE *grant_table;
|
GRANT_TABLE *grant_table;
|
||||||
|
@ -2281,8 +2286,9 @@ uint get_table_grant(THD *thd, TABLE_LIST *table)
|
||||||
table->grant.version=grant_version;
|
table->grant.version=grant_version;
|
||||||
if (grant_table)
|
if (grant_table)
|
||||||
table->grant.privilege|= grant_table->privs;
|
table->grant.privilege|= grant_table->privs;
|
||||||
|
privilege= table->grant.privilege;
|
||||||
pthread_mutex_unlock(&LOCK_grant);
|
pthread_mutex_unlock(&LOCK_grant);
|
||||||
return table->grant.privilege;
|
return privilege;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2335,7 +2341,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
||||||
int error = 0;
|
int error = 0;
|
||||||
ACL_USER *acl_user; ACL_DB *acl_db;
|
ACL_USER *acl_user; ACL_DB *acl_db;
|
||||||
char buff[1024];
|
char buff[1024];
|
||||||
DBUG_ENTER("mysql_grant");
|
DBUG_ENTER("mysql_show_grants");
|
||||||
|
|
||||||
LINT_INIT(acl_user);
|
LINT_INIT(acl_user);
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
|
@ -2384,6 +2390,7 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
||||||
if (send_fields(thd,field_list,1))
|
if (send_fields(thd,field_list,1))
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&LOCK_grant);
|
||||||
VOID(pthread_mutex_lock(&acl_cache->lock));
|
VOID(pthread_mutex_lock(&acl_cache->lock));
|
||||||
|
|
||||||
/* Add first global access grants */
|
/* Add first global access grants */
|
||||||
|
@ -2578,13 +2585,16 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
||||||
thd->packet.length()))
|
thd->packet.length()))
|
||||||
{
|
{
|
||||||
error=-1;
|
error=-1;
|
||||||
goto end;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
VOID(pthread_mutex_unlock(&acl_cache->lock));
|
VOID(pthread_mutex_unlock(&acl_cache->lock));
|
||||||
|
pthread_mutex_unlock(&LOCK_grant);
|
||||||
|
|
||||||
send_eof(&thd->net);
|
send_eof(&thd->net);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
|
|
@ -354,7 +354,7 @@ bool close_cached_tables(THD *thd, bool if_wait_for_refresh,
|
||||||
bool found=0;
|
bool found=0;
|
||||||
for (TABLE_LIST *table=tables ; table ; table=table->next)
|
for (TABLE_LIST *table=tables ; table ; table=table->next)
|
||||||
{
|
{
|
||||||
if (remove_table_from_cache(thd, table->db, table->name, 1))
|
if (remove_table_from_cache(thd, table->db, table->real_name, 1))
|
||||||
found=1;
|
found=1;
|
||||||
}
|
}
|
||||||
if (!found)
|
if (!found)
|
||||||
|
@ -715,7 +715,7 @@ TABLE *reopen_name_locked_table(THD* thd, TABLE_LIST* table_list)
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
char* db = thd->db ? thd->db : table_list->db;
|
char* db = thd->db ? thd->db : table_list->db;
|
||||||
char* table_name = table_list->name;
|
char* table_name = table_list->real_name;
|
||||||
char key[MAX_DBKEY_LENGTH];
|
char key[MAX_DBKEY_LENGTH];
|
||||||
uint key_length;
|
uint key_length;
|
||||||
key_length=(uint) (strmov(strmov(key,db)+1,table_name)-key)+1;
|
key_length=(uint) (strmov(strmov(key,db)+1,table_name)-key)+1;
|
||||||
|
@ -1285,7 +1285,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
|
||||||
|
|
||||||
TABLE_LIST table_list;
|
TABLE_LIST table_list;
|
||||||
table_list.db=(char*) db;
|
table_list.db=(char*) db;
|
||||||
table_list.name=(char*) name;
|
table_list.real_name=(char*) name;
|
||||||
table_list.next=0;
|
table_list.next=0;
|
||||||
if ((error=lock_table_name(thd,&table_list)))
|
if ((error=lock_table_name(thd,&table_list)))
|
||||||
{
|
{
|
||||||
|
@ -1356,7 +1356,7 @@ int open_tables(THD *thd,TABLE_LIST *start)
|
||||||
!(tables->table=open_table(thd,
|
!(tables->table=open_table(thd,
|
||||||
tables->db ? tables->db : thd->db,
|
tables->db ? tables->db : thd->db,
|
||||||
tables->real_name,
|
tables->real_name,
|
||||||
tables->name, &refresh)))
|
tables->alias, &refresh)))
|
||||||
{
|
{
|
||||||
if (refresh) // Refresh in progress
|
if (refresh) // Refresh in progress
|
||||||
{
|
{
|
||||||
|
@ -1412,7 +1412,7 @@ TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type)
|
||||||
|
|
||||||
thd->proc_info="Opening table";
|
thd->proc_info="Opening table";
|
||||||
while (!(table=open_table(thd,table_list->db ? table_list->db : thd->db,
|
while (!(table=open_table(thd,table_list->db ? table_list->db : thd->db,
|
||||||
table_list->real_name,table_list->name,
|
table_list->real_name, table_list->alias,
|
||||||
&refresh)) && refresh) ;
|
&refresh)) && refresh) ;
|
||||||
if (table)
|
if (table)
|
||||||
{
|
{
|
||||||
|
@ -1440,7 +1440,7 @@ TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type)
|
||||||
{
|
{
|
||||||
my_printf_error(ER_TABLE_NOT_LOCKED_FOR_WRITE,
|
my_printf_error(ER_TABLE_NOT_LOCKED_FOR_WRITE,
|
||||||
ER(ER_TABLE_NOT_LOCKED_FOR_WRITE),
|
ER(ER_TABLE_NOT_LOCKED_FOR_WRITE),
|
||||||
MYF(0),table_list->name);
|
MYF(0),table_list->alias);
|
||||||
table=0;
|
table=0;
|
||||||
}
|
}
|
||||||
else if ((error=table->file->start_stmt(thd)))
|
else if ((error=table->file->start_stmt(thd)))
|
||||||
|
@ -1642,7 +1642,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables)
|
||||||
bool found_table=0;
|
bool found_table=0;
|
||||||
for (; tables ; tables=tables->next)
|
for (; tables ; tables=tables->next)
|
||||||
{
|
{
|
||||||
if (!strcmp(tables->name,table_name) &&
|
if (!strcmp(tables->alias,table_name) &&
|
||||||
(!db ||
|
(!db ||
|
||||||
(tables->db && !strcmp(db,tables->db)) ||
|
(tables->db && !strcmp(db,tables->db)) ||
|
||||||
(!tables->db && !strcmp(db,thd->db))))
|
(!tables->db && !strcmp(db,thd->db))))
|
||||||
|
@ -1882,7 +1882,7 @@ insert_fields(THD *thd,TABLE_LIST *tables, const char *db_name,
|
||||||
if (grant_option && !thd->master_access &&
|
if (grant_option && !thd->master_access &&
|
||||||
check_grant_all_columns(thd,SELECT_ACL,table) )
|
check_grant_all_columns(thd,SELECT_ACL,table) )
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
if (!table_name || (!strcmp(table_name,tables->name) &&
|
if (!table_name || (!strcmp(table_name,tables->alias) &&
|
||||||
(!db_name || !tables->db ||
|
(!db_name || !tables->db ||
|
||||||
!strcmp(tables->db,db_name))))
|
!strcmp(tables->db,db_name))))
|
||||||
{
|
{
|
||||||
|
|
|
@ -73,7 +73,7 @@ check_insert_fields(THD *thd,TABLE *table,List<Item> &fields,
|
||||||
}
|
}
|
||||||
TABLE_LIST table_list;
|
TABLE_LIST table_list;
|
||||||
bzero((char*) &table_list,sizeof(table_list));
|
bzero((char*) &table_list,sizeof(table_list));
|
||||||
table_list.name=table->table_name;
|
table_list.alias= table_list.real_name= table->table_name;
|
||||||
table_list.table=table;
|
table_list.table=table;
|
||||||
table_list.grant=table->grant;
|
table_list.grant=table->grant;
|
||||||
|
|
||||||
|
@ -615,7 +615,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list)
|
||||||
}
|
}
|
||||||
tmp->table_list= *table_list; // Needed to open table
|
tmp->table_list= *table_list; // Needed to open table
|
||||||
tmp->table_list.db= tmp->thd.db;
|
tmp->table_list.db= tmp->thd.db;
|
||||||
tmp->table_list.name= tmp->table_list.real_name=tmp->thd.query;
|
tmp->table_list.alias= tmp->table_list.real_name= tmp->thd.query;
|
||||||
tmp->lock();
|
tmp->lock();
|
||||||
pthread_mutex_lock(&tmp->mutex);
|
pthread_mutex_lock(&tmp->mutex);
|
||||||
if ((error=pthread_create(&tmp->thd.real_id,&connection_attrib,
|
if ((error=pthread_create(&tmp->thd.real_id,&connection_attrib,
|
||||||
|
|
|
@ -671,7 +671,7 @@ int mysql_table_dump(THD* thd, char* db, char* tbl_name, int fd)
|
||||||
if (!(table_list = (TABLE_LIST*) sql_calloc(sizeof(TABLE_LIST))))
|
if (!(table_list = (TABLE_LIST*) sql_calloc(sizeof(TABLE_LIST))))
|
||||||
DBUG_RETURN(1); // out of memory
|
DBUG_RETURN(1); // out of memory
|
||||||
table_list->db = db;
|
table_list->db = db;
|
||||||
table_list->real_name = table_list->name = tbl_name;
|
table_list->real_name = table_list->alias = tbl_name;
|
||||||
table_list->lock_type = TL_READ_NO_INSERT;
|
table_list->lock_type = TL_READ_NO_INSERT;
|
||||||
table_list->next = 0;
|
table_list->next = 0;
|
||||||
remove_escape(table_list->real_name);
|
remove_escape(table_list->real_name);
|
||||||
|
@ -857,7 +857,7 @@ bool do_command(THD *thd)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
thd->free_list=0;
|
thd->free_list=0;
|
||||||
table_list.name=table_list.real_name=thd->strdup(packet+1);
|
table_list.alias= table_list.real_name= thd->strdup(packet+1);
|
||||||
thd->query=fields=thd->strdup(strend(packet+1)+1);
|
thd->query=fields=thd->strdup(strend(packet+1)+1);
|
||||||
mysql_log.write(thd,command,"%s %s",table_list.real_name,fields);
|
mysql_log.write(thd,command,"%s %s",table_list.real_name,fields);
|
||||||
remove_escape(table_list.real_name); // This can't have wildcards
|
remove_escape(table_list.real_name); // This can't have wildcards
|
||||||
|
@ -889,6 +889,8 @@ bool do_command(THD *thd)
|
||||||
net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL");
|
net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (lower_case_table_names)
|
||||||
|
casedn_str(db);
|
||||||
if (check_access(thd,CREATE_ACL,db,0,1))
|
if (check_access(thd,CREATE_ACL,db,0,1))
|
||||||
break;
|
break;
|
||||||
mysql_log.write(thd,command,packet+1);
|
mysql_log.write(thd,command,packet+1);
|
||||||
|
@ -905,6 +907,8 @@ bool do_command(THD *thd)
|
||||||
net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL");
|
net_printf(&thd->net,ER_WRONG_DB_NAME, db ? db : "NULL");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (lower_case_table_names)
|
||||||
|
casedn_str(db);
|
||||||
if (check_access(thd,DROP_ACL,db,0,1) || end_active_trans(thd))
|
if (check_access(thd,DROP_ACL,db,0,1) || end_active_trans(thd))
|
||||||
break;
|
break;
|
||||||
mysql_log.write(thd,command,db);
|
mysql_log.write(thd,command,db);
|
||||||
|
@ -1261,9 +1265,9 @@ mysql_execute_command(void)
|
||||||
if (error)
|
if (error)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (strlen(tables->name) > NAME_LEN)
|
if (strlen(tables->real_name) > NAME_LEN)
|
||||||
{
|
{
|
||||||
net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->name);
|
net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->real_name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1292,9 +1296,9 @@ mysql_execute_command(void)
|
||||||
if (error)
|
if (error)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (strlen(tables->name) > NAME_LEN)
|
if (strlen(tables->real_name) > NAME_LEN)
|
||||||
{
|
{
|
||||||
net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->name);
|
net_printf(&thd->net,ER_WRONG_TABLE_NAME,tables->real_name);
|
||||||
res=0;
|
res=0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1767,7 +1771,7 @@ mysql_execute_command(void)
|
||||||
goto error; /* purecov: inspected */
|
goto error; /* purecov: inspected */
|
||||||
}
|
}
|
||||||
remove_escape(db); // Fix escaped '_'
|
remove_escape(db); // Fix escaped '_'
|
||||||
remove_escape(tables->name);
|
remove_escape(tables->real_name);
|
||||||
if (!tables->db)
|
if (!tables->db)
|
||||||
tables->db=thd->db;
|
tables->db=thd->db;
|
||||||
if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,&thd->col_access))
|
if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,&thd->col_access))
|
||||||
|
@ -1794,7 +1798,7 @@ mysql_execute_command(void)
|
||||||
goto error; /* purecov: inspected */
|
goto error; /* purecov: inspected */
|
||||||
}
|
}
|
||||||
remove_escape(db); // Fix escaped '_'
|
remove_escape(db); // Fix escaped '_'
|
||||||
remove_escape(tables->name);
|
remove_escape(tables->real_name);
|
||||||
if (!tables->db)
|
if (!tables->db)
|
||||||
tables->db=thd->db;
|
tables->db=thd->db;
|
||||||
if (check_access(thd,SELECT_ACL,db,&thd->col_access))
|
if (check_access(thd,SELECT_ACL,db,&thd->col_access))
|
||||||
|
@ -1923,6 +1927,8 @@ mysql_execute_command(void)
|
||||||
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
|
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (lower_case_table_names)
|
||||||
|
casedn_str(lex->name);
|
||||||
if (check_access(thd,CREATE_ACL,lex->name,0,1))
|
if (check_access(thd,CREATE_ACL,lex->name,0,1))
|
||||||
break;
|
break;
|
||||||
mysql_create_db(thd,lex->name,lex->create_info.options);
|
mysql_create_db(thd,lex->name,lex->create_info.options);
|
||||||
|
@ -1935,6 +1941,8 @@ mysql_execute_command(void)
|
||||||
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
|
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (lower_case_table_names)
|
||||||
|
casedn_str(lex->name);
|
||||||
if (check_access(thd,DROP_ACL,lex->name,0,1) ||
|
if (check_access(thd,DROP_ACL,lex->name,0,1) ||
|
||||||
end_active_trans(thd))
|
end_active_trans(thd))
|
||||||
break;
|
break;
|
||||||
|
@ -2748,12 +2756,16 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias,
|
||||||
if (!(alias_str=sql_strmake(alias_str,table->table.length)))
|
if (!(alias_str=sql_strmake(alias_str,table->table.length)))
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
if (lower_case_table_names)
|
if (lower_case_table_names)
|
||||||
|
{
|
||||||
casedn_str(table->table.str);
|
casedn_str(table->table.str);
|
||||||
|
if (table->db.str)
|
||||||
|
casedn_str(table->db.str);
|
||||||
|
}
|
||||||
if (!(ptr = (TABLE_LIST *) thd->calloc(sizeof(TABLE_LIST))))
|
if (!(ptr = (TABLE_LIST *) thd->calloc(sizeof(TABLE_LIST))))
|
||||||
DBUG_RETURN(0); /* purecov: inspected */
|
DBUG_RETURN(0); /* purecov: inspected */
|
||||||
ptr->db= table->db.str;
|
ptr->db= table->db.str;
|
||||||
ptr->real_name=table->table.str;
|
ptr->real_name=table->table.str;
|
||||||
ptr->name=alias_str;
|
ptr->alias=alias_str;
|
||||||
ptr->lock_type=flags;
|
ptr->lock_type=flags;
|
||||||
ptr->updating=updating;
|
ptr->updating=updating;
|
||||||
if (use_index)
|
if (use_index)
|
||||||
|
@ -2771,7 +2783,7 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias,
|
||||||
for (TABLE_LIST *tables=(TABLE_LIST*) thd->lex.table_list.first ; tables ;
|
for (TABLE_LIST *tables=(TABLE_LIST*) thd->lex.table_list.first ; tables ;
|
||||||
tables=tables->next)
|
tables=tables->next)
|
||||||
{
|
{
|
||||||
if (!strcmp(alias_str,tables->name) &&
|
if (!strcmp(alias_str,tables->alias) &&
|
||||||
!strcmp(ptr->db ? ptr->db : current_db,
|
!strcmp(ptr->db ? ptr->db : current_db,
|
||||||
tables->db ? tables->db : current_db))
|
tables->db ? tables->db : current_db))
|
||||||
{
|
{
|
||||||
|
|
|
@ -306,7 +306,7 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
|
||||||
packet->length(0);
|
packet->length(0);
|
||||||
net_store_data(packet,file_name);
|
net_store_data(packet,file_name);
|
||||||
table_list.db=(char*) db;
|
table_list.db=(char*) db;
|
||||||
table_list.real_name=table_list.name=file_name;
|
table_list.real_name= table_list.alias= file_name;
|
||||||
if (!(table = open_ltable(thd, &table_list, TL_READ)))
|
if (!(table = open_ltable(thd, &table_list, TL_READ)))
|
||||||
{
|
{
|
||||||
for (uint i=0 ; i < field_list.elements ; i++)
|
for (uint i=0 ; i < field_list.elements ; i++)
|
||||||
|
@ -423,7 +423,7 @@ int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild)
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
** List all columns in a table
|
** List all columns in a table_list->real_name
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -810,7 +810,7 @@ static int send_check_errmsg(THD* thd, TABLE_LIST* table,
|
||||||
|
|
||||||
String* packet = &thd->packet;
|
String* packet = &thd->packet;
|
||||||
packet->length(0);
|
packet->length(0);
|
||||||
net_store_data(packet, table->name);
|
net_store_data(packet, table->alias);
|
||||||
net_store_data(packet, (char*)operator_name);
|
net_store_data(packet, (char*)operator_name);
|
||||||
net_store_data(packet, "error");
|
net_store_data(packet, "error");
|
||||||
net_store_data(packet, errmsg);
|
net_store_data(packet, errmsg);
|
||||||
|
@ -835,7 +835,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table)
|
||||||
{
|
{
|
||||||
char* backup_dir = thd->lex.backup_dir;
|
char* backup_dir = thd->lex.backup_dir;
|
||||||
char src_path[FN_REFLEN], dst_path[FN_REFLEN];
|
char src_path[FN_REFLEN], dst_path[FN_REFLEN];
|
||||||
char* table_name = table->name;
|
char* table_name = table->real_name;
|
||||||
char* db = thd->db ? thd->db : table->db;
|
char* db = thd->db ? thd->db : table->db;
|
||||||
|
|
||||||
if (!fn_format(src_path, table_name, backup_dir, reg_ext, 4 + 64))
|
if (!fn_format(src_path, table_name, backup_dir, reg_ext, 4 + 64))
|
||||||
|
@ -922,7 +922,7 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||||
char table_name[NAME_LEN*2+2];
|
char table_name[NAME_LEN*2+2];
|
||||||
char* db = (table->db) ? table->db : thd->db;
|
char* db = (table->db) ? table->db : thd->db;
|
||||||
bool fatal_error=0;
|
bool fatal_error=0;
|
||||||
strxmov(table_name,db ? db : "",".",table->name,NullS);
|
strxmov(table_name,db ? db : "",".",table->real_name,NullS);
|
||||||
|
|
||||||
thd->open_options|= extra_open_options;
|
thd->open_options|= extra_open_options;
|
||||||
table->table = open_ltable(thd, table, lock_type);
|
table->table = open_ltable(thd, table, lock_type);
|
||||||
|
@ -1754,7 +1754,7 @@ copy_data_between_tables(TABLE *from,TABLE *to,
|
||||||
MYF(MY_FAE | MY_ZEROFILL));
|
MYF(MY_FAE | MY_ZEROFILL));
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables.table = from;
|
tables.table = from;
|
||||||
tables.name = tables.real_name= from->real_name;
|
tables.alias = tables.real_name= from->real_name;
|
||||||
tables.db = from->table_cache_key;
|
tables.db = from->table_cache_key;
|
||||||
error=1;
|
error=1;
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,7 @@ void udf_init()
|
||||||
new_thd->db = my_strdup("mysql", MYF(0));
|
new_thd->db = my_strdup("mysql", MYF(0));
|
||||||
|
|
||||||
bzero((gptr) &tables,sizeof(tables));
|
bzero((gptr) &tables,sizeof(tables));
|
||||||
tables.name = tables.real_name = (char*) "func";
|
tables.alias= tables.real_name= (char*) "func";
|
||||||
tables.lock_type = TL_READ;
|
tables.lock_type = TL_READ;
|
||||||
tables.db=new_thd->db;
|
tables.db=new_thd->db;
|
||||||
|
|
||||||
|
@ -406,7 +406,7 @@ int mysql_create_function(THD *thd,udf_func *udf)
|
||||||
|
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables.db= (char*) "mysql";
|
tables.db= (char*) "mysql";
|
||||||
tables.real_name=tables.name= (char*) "func";
|
tables.real_name= tables.alias= (char*) "func";
|
||||||
/* Allow creation of functions even if we can't open func table */
|
/* Allow creation of functions even if we can't open func table */
|
||||||
if (!(table = open_ltable(thd,&tables,TL_WRITE)))
|
if (!(table = open_ltable(thd,&tables,TL_WRITE)))
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -460,7 +460,7 @@ int mysql_drop_function(THD *thd,const char *udf_name)
|
||||||
|
|
||||||
bzero((char*) &tables,sizeof(tables));
|
bzero((char*) &tables,sizeof(tables));
|
||||||
tables.db=(char*) "mysql";
|
tables.db=(char*) "mysql";
|
||||||
tables.real_name=tables.name=(char*) "func";
|
tables.real_name= tables.alias= (char*) "func";
|
||||||
if (!(table = open_ltable(thd,&tables,TL_WRITE)))
|
if (!(table = open_ltable(thd,&tables,TL_WRITE)))
|
||||||
goto err;
|
goto err;
|
||||||
if (!table->file->index_read_idx(table->record[0],0,(byte*) udf_name,
|
if (!table->file->index_read_idx(table->record[0],0,(byte*) udf_name,
|
||||||
|
|
|
@ -136,7 +136,7 @@ struct st_table {
|
||||||
|
|
||||||
typedef struct st_table_list {
|
typedef struct st_table_list {
|
||||||
struct st_table_list *next;
|
struct st_table_list *next;
|
||||||
char *db,*name,*real_name;
|
char *db,*alias,*real_name;
|
||||||
Item *on_expr; /* Used with outer join */
|
Item *on_expr; /* Used with outer join */
|
||||||
struct st_table_list *natural_join; /* natural join on this table*/
|
struct st_table_list *natural_join; /* natural join on this table*/
|
||||||
List<String> *use_index,*ignore_index;
|
List<String> *use_index,*ignore_index;
|
||||||
|
|
|
@ -299,7 +299,7 @@ safe_query("revoke GRANT OPTION on $opt_database.test from $user",1);
|
||||||
#
|
#
|
||||||
|
|
||||||
safe_query("grant select(a) on $opt_database.test to $user");
|
safe_query("grant select(a) on $opt_database.test to $user");
|
||||||
user_query("show columns from test");
|
user_query("show full columns from test");
|
||||||
safe_query("grant insert (b), update (b) on $opt_database.test to $user");
|
safe_query("grant insert (b), update (b) on $opt_database.test to $user");
|
||||||
|
|
||||||
user_query("select count(a) from test");
|
user_query("select count(a) from test");
|
||||||
|
|
Loading…
Add table
Reference in a new issue