Commit 3c0e6091 authored by unknown's avatar unknown

invalidation moved before tables unlocking


sql/sql_delete.cc:
  invalidation moved before tables unlocking
  invalidation on multidelete error (if something changed)
sql/sql_parse.cc:
  invalidation moved to mysql_admin_table
  layout fixing
sql/sql_table.cc:
  invalidation moved to mysql_admin_table
sql/sql_update.cc:
  invalidation moved before tables unlocking
  invalidation on multiupdate error (if something changed)
parent a2ce6c71
...@@ -176,13 +176,13 @@ cleanup: ...@@ -176,13 +176,13 @@ cleanup:
} }
if (using_transactions && ha_autocommit_or_rollback(thd,error >= 0)) if (using_transactions && ha_autocommit_or_rollback(thd,error >= 0))
error=1; error=1;
if (deleted)
query_cache_invalidate3(thd, table_list, 1);
if (thd->lock) if (thd->lock)
{ {
mysql_unlock_tables(thd, thd->lock); mysql_unlock_tables(thd, thd->lock);
thd->lock=0; thd->lock=0;
} }
if (deleted)
query_cache_invalidate3(thd, table_list, 1);
delete select; delete select;
if (error >= 0) // Fatal error if (error >= 0) // Fatal error
send_error(&thd->net,thd->killed ? ER_SERVER_SHUTDOWN: 0); send_error(&thd->net,thd->killed ? ER_SERVER_SHUTDOWN: 0);
...@@ -355,6 +355,9 @@ void multi_delete::send_error(uint errcode,const char *err) ...@@ -355,6 +355,9 @@ void multi_delete::send_error(uint errcode,const char *err)
if (!deleted) if (!deleted)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
/* Somthing alredy deleted consequently we have to invalidate cache */
query_cache_invalidate3(thd, delete_tables, 1);
/* Below can happen when thread is killed early ... */ /* Below can happen when thread is killed early ... */
if (!table_being_deleted) if (!table_being_deleted)
table_being_deleted=delete_tables; table_being_deleted=delete_tables;
......
...@@ -262,6 +262,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields, ...@@ -262,6 +262,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
info.copied=values_list.elements; info.copied=values_list.elements;
end_delayed_insert(thd); end_delayed_insert(thd);
} }
if (info.copied || info.deleted)
query_cache_invalidate3(thd, table_list, 1);
} }
else else
{ {
...@@ -303,6 +305,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields, ...@@ -303,6 +305,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
} }
if (using_transactions) if (using_transactions)
error=ha_autocommit_or_rollback(thd,error); error=ha_autocommit_or_rollback(thd,error);
if (info.copied || info.deleted)
query_cache_invalidate3(thd, table_list, 1);
if (thd->lock) if (thd->lock)
{ {
mysql_unlock_tables(thd, thd->lock); mysql_unlock_tables(thd, thd->lock);
...@@ -310,8 +314,6 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields, ...@@ -310,8 +314,6 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
} }
} }
thd->proc_info="end"; thd->proc_info="end";
if (info.copied || info.deleted)
query_cache_invalidate3(thd, table_list, 1);
table->time_stamp=save_time_stamp; // Restore auto timestamp ptr table->time_stamp=save_time_stamp; // Restore auto timestamp ptr
table->next_number_field=0; table->next_number_field=0;
thd->count_cuted_fields=0; thd->count_cuted_fields=0;
......
...@@ -1669,7 +1669,6 @@ mysql_execute_command(void) ...@@ -1669,7 +1669,6 @@ mysql_execute_command(void)
check_table_access(thd,SELECT_ACL | INSERT_ACL, tables)) check_table_access(thd,SELECT_ACL | INSERT_ACL, tables))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
res = mysql_repair_table(thd, tables, &lex->check_opt); res = mysql_repair_table(thd, tables, &lex->check_opt);
query_cache_invalidate3(thd, tables, 0);
break; break;
} }
case SQLCOM_CHECK: case SQLCOM_CHECK:
...@@ -1678,7 +1677,6 @@ mysql_execute_command(void) ...@@ -1678,7 +1677,6 @@ mysql_execute_command(void)
check_table_access(thd, SELECT_ACL | EXTRA_ACL , tables)) check_table_access(thd, SELECT_ACL | EXTRA_ACL , tables))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
res = mysql_check_table(thd, tables, &lex->check_opt); res = mysql_check_table(thd, tables, &lex->check_opt);
query_cache_invalidate3(thd, tables, 0);
break; break;
} }
case SQLCOM_ANALYZE: case SQLCOM_ANALYZE:
...@@ -1941,8 +1939,9 @@ mysql_execute_command(void) ...@@ -1941,8 +1939,9 @@ mysql_execute_command(void)
/* Fix tables-to-be-deleted-from list to point at opened tables */ /* Fix tables-to-be-deleted-from list to point at opened tables */
for (auxi=(TABLE_LIST*) aux_tables ; auxi ; auxi=auxi->next) for (auxi=(TABLE_LIST*) aux_tables ; auxi ; auxi=auxi->next)
auxi->table= ((TABLE_LIST*) auxi->table)->table; auxi->table= ((TABLE_LIST*) auxi->table)->table;
if (!thd->fatal_error && (result=new multi_delete(thd,aux_tables, if (!thd->fatal_error && (result= new multi_delete(thd,aux_tables,
lex->lock_option,table_count))) lex->lock_option,
table_count)))
{ {
res=mysql_select(thd,tables,select_lex->item_list, res=mysql_select(thd,tables,select_lex->item_list,
select_lex->where, select_lex->where,
......
...@@ -1120,8 +1120,12 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, ...@@ -1120,8 +1120,12 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
if (fatal_error) if (fatal_error)
table->table->version=0; // Force close of table table->table->version=0; // Force close of table
else if (open_for_modify) else if (open_for_modify)
{
remove_table_from_cache(thd, table->table->table_cache_key, remove_table_from_cache(thd, table->table->table_cache_key,
table->table->real_name); table->table->real_name);
/* May be something modified consequently we have to invalidate cache */
query_cache_invalidate3(thd, table->table, 0);
}
close_thread_tables(thd); close_thread_tables(thd);
table->table=0; // For query cache table->table=0; // For query cache
if (my_net_write(&thd->net, (char*) packet->ptr(), if (my_net_write(&thd->net, (char*) packet->ptr(),
......
...@@ -318,13 +318,13 @@ int mysql_update(THD *thd, ...@@ -318,13 +318,13 @@ int mysql_update(THD *thd,
} }
if (using_transactions && ha_autocommit_or_rollback(thd, error >= 0)) if (using_transactions && ha_autocommit_or_rollback(thd, error >= 0))
error=1; error=1;
if (updated)
query_cache_invalidate3(thd, table_list, 1);
if (thd->lock) if (thd->lock)
{ {
mysql_unlock_tables(thd, thd->lock); mysql_unlock_tables(thd, thd->lock);
thd->lock=0; thd->lock=0;
} }
if (updated)
query_cache_invalidate3(thd, table_list, 1);
delete select; delete select;
if (error >= 0) if (error >= 0)
...@@ -642,6 +642,10 @@ void multi_update::send_error(uint errcode,const char *err) ...@@ -642,6 +642,10 @@ void multi_update::send_error(uint errcode,const char *err)
/* If nothing updated return */ /* If nothing updated return */
if (!updated) if (!updated)
return; return;
/* Somthing alredy updated consequently we have to invalidate cache */
query_cache_invalidate3(thd, update_tables, 1);
/* Below can happen when thread is killed early ... */ /* Below can happen when thread is killed early ... */
if (!table_being_updated) if (!table_being_updated)
table_being_updated=update_tables; table_being_updated=update_tables;
......
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