Commit 3c01162f authored by unknown's avatar unknown

removed old way to prevent using stack tables for caching Items in PS

fixed error code in union test


mysql-test/t/union.test:
  right code worr 4.1 error
sql/log_event.cc:
  assign non-cachable for Item status for all stack tables for safety
sql/repl_failsafe.cc:
  assign non-cachable for Item status for all stack tables for safety
sql/slave.cc:
  assign non-cachable for Item status for all stack tables for safety
sql/sql_acl.cc:
  assign non-cachable for Item status for all stack tables for safety
sql/sql_base.cc:
  assign non-cachable for Item status for all stack tables for safety
  non-cachable status processing
sql/sql_cache.cc:
  assign non-cachable for Item status for all stack tables for safety
sql/sql_class.cc:
  removed ald way to prevent using stack tables for caching Items in PS
sql/sql_class.h:
  removed old way to prevent using stack tables for caching Items in PS
sql/sql_help.cc:
  assign non-cachable for Item status for all stack tables for safety
sql/sql_insert.cc:
  assign non-cachable for Item status for all stack tables for safety
  removed old way to prevent using stack tables for caching Items in PS
sql/table.h:
  non-cachable for Item status for tables
parent e65aed9c
...@@ -251,7 +251,7 @@ create temporary table t1 select a from t1 union select a from t2; ...@@ -251,7 +251,7 @@ create temporary table t1 select a from t1 union select a from t2;
drop temporary table t1; drop temporary table t1;
--error 1093 --error 1093
create table t1 select a from t1 union select a from t2; create table t1 select a from t1 union select a from t2;
--error 1054 --error 1109
select a from t1 union select a from t2 order by t2.a; select a from t1 union select a from t2 order by t2.a;
drop table t1,t2; drop table t1,t2;
......
...@@ -1698,6 +1698,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, ...@@ -1698,6 +1698,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
tables.alias = tables.real_name = (char*)table_name; tables.alias = tables.real_name = (char*)table_name;
tables.lock_type = TL_WRITE; tables.lock_type = TL_WRITE;
tables.updating= 1; tables.updating= 1;
tables.non_cachable_table= 1; // just safety for table on stack
// 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))
{ {
......
...@@ -736,6 +736,7 @@ static int fetch_db_tables(THD *thd, MYSQL *mysql, const char *db, ...@@ -736,6 +736,7 @@ static int fetch_db_tables(THD *thd, MYSQL *mysql, const char *db,
table.db= (char*) db; table.db= (char*) db;
table.real_name= (char*) table_name; table.real_name= (char*) table_name;
table.updating= 1; table.updating= 1;
table.non_cachable_table= 1; // just safety for table on stack
if (!tables_ok(thd, &table)) if (!tables_ok(thd, &table))
continue; continue;
} }
......
...@@ -1216,6 +1216,7 @@ static int create_table_from_dump(THD* thd, MYSQL *mysql, const char* db, ...@@ -1216,6 +1216,7 @@ static int create_table_from_dump(THD* thd, MYSQL *mysql, const char* db,
bzero((char*) &tables,sizeof(tables)); bzero((char*) &tables,sizeof(tables));
tables.db = (char*)db; tables.db = (char*)db;
tables.alias= tables.real_name= (char*)table_name; tables.alias= tables.real_name= (char*)table_name;
tables.non_cachable_table= 1; // just safety for table on stack
/* Drop the table if 'overwrite' is true */ /* Drop the table if 'overwrite' is true */
if (overwrite && mysql_rm_table(thd,&tables,1,0)) /* drop if exists */ if (overwrite && mysql_rm_table(thd,&tables,1,0)) /* drop if exists */
{ {
......
...@@ -172,6 +172,9 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables) ...@@ -172,6 +172,9 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
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;
tables[0].db=tables[1].db=tables[2].db=thd->db; tables[0].db=tables[1].db=tables[2].db=thd->db;
// just safety for table on stack
tables[0].non_cachable_table= tables[1].non_cachable_table=
tables[2].non_cachable_table= 1;
uint counter; uint counter;
if (open_tables(thd, tables, &counter)) if (open_tables(thd, tables, &counter))
...@@ -1325,6 +1328,7 @@ static bool update_user_table(THD *thd, const char *host, const char *user, ...@@ -1325,6 +1328,7 @@ static bool update_user_table(THD *thd, const char *host, const char *user,
bzero((char*) &tables,sizeof(tables)); bzero((char*) &tables,sizeof(tables));
tables.alias=tables.real_name=(char*) "user"; tables.alias=tables.real_name=(char*) "user";
tables.db=(char*) "mysql"; tables.db=(char*) "mysql";
tables.non_cachable_table= 1; // just safety for table on stack
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
/* /*
GRANT and REVOKE are applied the slave in/exclusion rules as they are GRANT and REVOKE are applied the slave in/exclusion rules as they are
...@@ -1382,6 +1386,7 @@ static bool test_if_create_new_users(THD *thd) ...@@ -1382,6 +1386,7 @@ static bool test_if_create_new_users(THD *thd)
bzero((char*) &tl,sizeof(tl)); bzero((char*) &tl,sizeof(tl));
tl.db= (char*) "mysql"; tl.db= (char*) "mysql";
tl.real_name= (char*) "user"; tl.real_name= (char*) "user";
tl.non_cachable_table= 1; // just safety for table on stack
db_access=acl_get(thd->host, thd->ip, db_access=acl_get(thd->host, thd->ip,
thd->priv_user, tl.db, 0); thd->priv_user, tl.db, 0);
if (!(db_access & INSERT_ACL)) if (!(db_access & INSERT_ACL))
...@@ -2233,6 +2238,9 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list, ...@@ -2233,6 +2238,9 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
? tables+2 : 0); ? tables+2 : 0);
tables[0].lock_type=tables[1].lock_type=tables[2].lock_type=TL_WRITE; tables[0].lock_type=tables[1].lock_type=tables[2].lock_type=TL_WRITE;
tables[0].db=tables[1].db=tables[2].db=(char*) "mysql"; tables[0].db=tables[1].db=tables[2].db=(char*) "mysql";
// just safety for table on stack
tables[0].non_cachable_table= tables[1].non_cachable_table=
tables[2].non_cachable_table= 1;
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
/* /*
...@@ -2407,6 +2415,8 @@ int mysql_grant(THD *thd, const char *db, List <LEX_USER> &list, ...@@ -2407,6 +2415,8 @@ int mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
tables[0].lock_type=tables[1].lock_type=TL_WRITE; tables[0].lock_type=tables[1].lock_type=TL_WRITE;
tables[0].db=tables[1].db=(char*) "mysql"; tables[0].db=tables[1].db=(char*) "mysql";
tables[0].table=tables[1].table=0; tables[0].table=tables[1].table=0;
// just safety for table on stack
tables[0].non_cachable_table= tables[1].non_cachable_table= 1;
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
/* /*
...@@ -2526,6 +2536,8 @@ my_bool grant_init(THD *org_thd) ...@@ -2526,6 +2536,8 @@ my_bool grant_init(THD *org_thd)
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;
// just safety for table on stack
tables[0].non_cachable_table= tables[1].non_cachable_table= 1;
uint counter; uint counter;
if (open_tables(thd, tables, &counter)) if (open_tables(thd, tables, &counter))
...@@ -3363,6 +3375,9 @@ int open_grant_tables(THD *thd, TABLE_LIST *tables) ...@@ -3363,6 +3375,9 @@ int open_grant_tables(THD *thd, TABLE_LIST *tables)
tables->lock_type= (tables+1)->lock_type= tables->lock_type= (tables+1)->lock_type=
(tables+2)->lock_type= (tables+3)->lock_type= TL_WRITE; (tables+2)->lock_type= (tables+3)->lock_type= TL_WRITE;
tables->db= (tables+1)->db= (tables+2)->db= (tables+3)->db=(char*) "mysql"; tables->db= (tables+1)->db= (tables+2)->db= (tables+3)->db=(char*) "mysql";
// just safety for table on stack
tables[0].non_cachable_table= tables[1].non_cachable_table=
tables[2].non_cachable_table= tables[3].non_cachable_table=1;
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
/* /*
......
...@@ -156,6 +156,7 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild) ...@@ -156,6 +156,7 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *wild)
table_list.db= (char*) entry->table_cache_key; table_list.db= (char*) entry->table_cache_key;
table_list.real_name= entry->real_name; table_list.real_name= entry->real_name;
table_list.grant.privilege=0; table_list.grant.privilege=0;
table_list.non_cachable_table= 1; // just safety for table on stack
if (check_table_access(thd,SELECT_ACL | EXTRA_ACL,&table_list,1)) if (check_table_access(thd,SELECT_ACL | EXTRA_ACL,&table_list,1))
continue; continue;
/* need to check if we haven't already listed it */ /* need to check if we haven't already listed it */
...@@ -1332,6 +1333,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db, ...@@ -1332,6 +1333,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
bzero((char*) &table_list, sizeof(table_list)); // just for safe bzero((char*) &table_list, sizeof(table_list)); // just for safe
table_list.db=(char*) db; table_list.db=(char*) db;
table_list.real_name=(char*) name; table_list.real_name=(char*) name;
table_list.non_cachable_table= 1; // just safety for table on stack
safe_mutex_assert_owner(&LOCK_open); safe_mutex_assert_owner(&LOCK_open);
if ((error=lock_table_name(thd,&table_list))) if ((error=lock_table_name(thd,&table_list)))
...@@ -1886,7 +1888,7 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, ...@@ -1886,7 +1888,7 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables,
char name_buff[NAME_LEN+1]; char name_buff[NAME_LEN+1];
if (!thd->no_table_fix_fields_cache && item->cached_table) if (item->cached_table)
{ {
/* /*
This shortcut is used by prepared statements. We assuming that This shortcut is used by prepared statements. We assuming that
...@@ -1939,6 +1941,8 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, ...@@ -1939,6 +1941,8 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables,
if (find) if (find)
{ {
(*where)= item->cached_table= tables; (*where)= item->cached_table= tables;
if (tables->non_cachable_table)
item->cached_table= 0;
if (find == WRONG_GRANT) if (find == WRONG_GRANT)
return (Field*) 0; return (Field*) 0;
if (db || !thd->where) if (db || !thd->where)
...@@ -1998,6 +2002,8 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, ...@@ -1998,6 +2002,8 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables,
if (field == WRONG_GRANT) if (field == WRONG_GRANT)
return (Field*) 0; return (Field*) 0;
(*where)= item->cached_table= tables; (*where)= item->cached_table= tables;
if (tables->non_cachable_table)
item->cached_table= 0;
if (found) if (found)
{ {
if (!thd->where) // Returns first found if (!thd->where) // Returns first found
......
...@@ -1022,6 +1022,7 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length) ...@@ -1022,6 +1022,7 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
Query_cache_table *table = block_table->parent; Query_cache_table *table = block_table->parent;
table_list.db = table->db(); table_list.db = table->db();
table_list.alias= table_list.real_name= table->table(); table_list.alias= table_list.real_name= table->table();
table_list.non_cachable_table= 1; // just safety for table on stack
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
if (check_table_access(thd,SELECT_ACL,&table_list,1)) if (check_table_access(thd,SELECT_ACL,&table_list,1))
{ {
......
...@@ -84,7 +84,6 @@ extern "C" void free_user_var(user_var_entry *entry) ...@@ -84,7 +84,6 @@ extern "C" void free_user_var(user_var_entry *entry)
****************************************************************************/ ****************************************************************************/
THD::THD():user_time(0), current_statement(0), is_fatal_error(0), THD::THD():user_time(0), current_statement(0), is_fatal_error(0),
no_table_fix_fields_cache(0),
last_insert_id_used(0), last_insert_id_used(0),
insert_id_used(0), rand_used(0), in_lock_tables(0), insert_id_used(0), rand_used(0), in_lock_tables(0),
global_read_lock(0), bootstrap(0) global_read_lock(0), bootstrap(0)
......
...@@ -787,12 +787,6 @@ class THD :public ilink, ...@@ -787,12 +787,6 @@ class THD :public ilink,
bool charset_is_system_charset, charset_is_collation_connection; bool charset_is_system_charset, charset_is_collation_connection;
bool slow_command; bool slow_command;
/*
Used in prepared statement to prevent using table/field cache in
Item_idend, bacuse it can point on removed table.
*/
bool no_table_fix_fields_cache;
/* /*
If we do a purge of binary logs, log index info of the threads If we do a purge of binary logs, log index info of the threads
that are currently reading it needs to be adjusted. To do that that are currently reading it needs to be adjusted. To do that
......
...@@ -659,20 +659,20 @@ int mysqld_help(THD *thd, const char *mask) ...@@ -659,20 +659,20 @@ int mysqld_help(THD *thd, const char *mask)
bzero((gptr)tables,sizeof(tables)); bzero((gptr)tables,sizeof(tables));
tables[0].alias= tables[0].real_name= (char*) "help_topic"; tables[0].alias= tables[0].real_name= (char*) "help_topic";
tables[0].lock_type= TL_READ; tables[0].lock_type= TL_READ;
tables[0].db= (char*) "mysql";
tables[0].next= &tables[1]; tables[0].next= &tables[1];
tables[1].alias= tables[1].real_name= (char*) "help_category"; tables[1].alias= tables[1].real_name= (char*) "help_category";
tables[1].lock_type= TL_READ; tables[1].lock_type= TL_READ;
tables[1].db= (char*) "mysql";
tables[1].next= &tables[2]; tables[1].next= &tables[2];
tables[2].alias= tables[2].real_name= (char*) "help_relation"; tables[2].alias= tables[2].real_name= (char*) "help_relation";
tables[2].lock_type= TL_READ; tables[2].lock_type= TL_READ;
tables[2].db= (char*) "mysql";
tables[2].next= &tables[3]; tables[2].next= &tables[3];
tables[3].alias= tables[3].real_name= (char*) "help_keyword"; tables[3].alias= tables[3].real_name= (char*) "help_keyword";
tables[3].lock_type= TL_READ; tables[3].lock_type= TL_READ;
tables[3].db= (char*) "mysql";
tables[3].next= 0; tables[3].next= 0;
tables[0].db= tables[1].db= tables[2].db= tables[3].db= (char*) "mysql";
// just safety for table on stack
tables[0].non_cachable_table= tables[1].non_cachable_table=
tables[2].non_cachable_table= tables[3].non_cachable_table= 1;
List<String> topics_list, categories_list, subcategories_list; List<String> topics_list, categories_list, subcategories_list;
String name, description, example; String name, description, example;
......
...@@ -82,16 +82,13 @@ check_insert_fields(THD *thd,TABLE *table,List<Item> &fields, ...@@ -82,16 +82,13 @@ check_insert_fields(THD *thd,TABLE *table,List<Item> &fields,
table_list.real_name= table_list.alias= table->table_name; table_list.real_name= table_list.alias= table->table_name;
table_list.table=table; table_list.table=table;
table_list.grant=table->grant; table_list.grant=table->grant;
table_list.non_cachable_table= 1;
thd->dupp_field=0; thd->dupp_field=0;
thd->no_table_fix_fields_cache= 1;
if (setup_tables(&table_list) || if (setup_tables(&table_list) ||
setup_fields(thd, 0, &table_list,fields,1,0,0)) setup_fields(thd, 0, &table_list,fields,1,0,0))
{
thd->no_table_fix_fields_cache= 0;
return -1; return -1;
}
thd->no_table_fix_fields_cache= 0;
if (thd->dupp_field) if (thd->dupp_field)
{ {
my_error(ER_FIELD_SPECIFIED_TWICE,MYF(0), thd->dupp_field->field_name); my_error(ER_FIELD_SPECIFIED_TWICE,MYF(0), thd->dupp_field->field_name);
......
...@@ -193,6 +193,7 @@ typedef struct st_table_list ...@@ -193,6 +193,7 @@ typedef struct st_table_list
bool updating; /* for replicate-do/ignore table */ bool updating; /* for replicate-do/ignore table */
bool force_index; /* Prefer index over table scan */ bool force_index; /* Prefer index over table scan */
bool ignore_leaves; /* Preload only non-leaf nodes */ bool ignore_leaves; /* Preload only non-leaf nodes */
bool non_cachable_table; /* stop PS caching */
} TABLE_LIST; } TABLE_LIST;
typedef struct st_changed_table_list typedef struct st_changed_table_list
......
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