Commit 29201cbf authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua
Browse files

invalidation moved before tables unlocking

parent eaa66555
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -176,13 +176,13 @@ int mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ORDER *order,
  }
  if (using_transactions && ha_autocommit_or_rollback(thd,error >= 0))
    error=1;
  if (deleted)
    query_cache_invalidate3(thd, table_list, 1);
  if (thd->lock)
  {
    mysql_unlock_tables(thd, thd->lock);
    thd->lock=0;
  }
  if (deleted)
    query_cache_invalidate3(thd, table_list, 1);
  delete select;
  if (error >= 0)				// Fatal error
    send_error(&thd->net,thd->killed ? ER_SERVER_SHUTDOWN: 0);
@@ -355,6 +355,9 @@ void multi_delete::send_error(uint errcode,const char *err)
  if (!deleted)
    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 ... */
  if (!table_being_deleted)
    table_being_deleted=delete_tables;
+4 −2
Original line number Diff line number Diff line
@@ -262,6 +262,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
      info.copied=values_list.elements;
      end_delayed_insert(thd);
    }
    if (info.copied || info.deleted)
      query_cache_invalidate3(thd, table_list, 1);
  }
  else
  {
@@ -303,6 +305,8 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
    }
    if (using_transactions)
      error=ha_autocommit_or_rollback(thd,error);
    if (info.copied || info.deleted)
      query_cache_invalidate3(thd, table_list, 1);
    if (thd->lock)
    {
      mysql_unlock_tables(thd, thd->lock);
@@ -310,8 +314,6 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
    }
  }
  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->next_number_field=0;
  thd->count_cuted_fields=0;
+3 −4
Original line number Diff line number Diff line
@@ -1669,7 +1669,6 @@ mysql_execute_command(void)
	check_table_access(thd,SELECT_ACL | INSERT_ACL, tables))
      goto error; /* purecov: inspected */
    res = mysql_repair_table(thd, tables, &lex->check_opt);
    query_cache_invalidate3(thd, tables, 0);
    break;
  }
  case SQLCOM_CHECK:
@@ -1678,7 +1677,6 @@ mysql_execute_command(void)
	check_table_access(thd, SELECT_ACL | EXTRA_ACL , tables))
      goto error; /* purecov: inspected */
    res = mysql_check_table(thd, tables, &lex->check_opt);
    query_cache_invalidate3(thd, tables, 0);
    break;
  }
  case SQLCOM_ANALYZE:
@@ -1942,7 +1940,8 @@ mysql_execute_command(void)
    for (auxi=(TABLE_LIST*) aux_tables ; auxi ; auxi=auxi->next)
      auxi->table= ((TABLE_LIST*) auxi->table)->table;
    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,
		       select_lex->where,
+4 −0
Original line number Diff line number Diff line
@@ -1120,8 +1120,12 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
    if (fatal_error)
      table->table->version=0;			// Force close of table
    else if (open_for_modify)
    {
      remove_table_from_cache(thd, table->table->table_cache_key,
			      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);
    table->table=0;				// For query cache
    if (my_net_write(&thd->net, (char*) packet->ptr(),
+6 −2
Original line number Diff line number Diff line
@@ -318,13 +318,13 @@ int mysql_update(THD *thd,
  }
  if (using_transactions && ha_autocommit_or_rollback(thd, error >= 0))
    error=1;
  if (updated)
    query_cache_invalidate3(thd, table_list, 1);
  if (thd->lock)
  {
    mysql_unlock_tables(thd, thd->lock);
    thd->lock=0;
  }
  if (updated)
    query_cache_invalidate3(thd, table_list, 1);

  delete select;
  if (error >= 0)
@@ -642,6 +642,10 @@ void multi_update::send_error(uint errcode,const char *err)
  /* If nothing updated return */
  if (!updated)
    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 ... */
  if (!table_being_updated)
    table_being_updated=update_tables;