Commit af024409 authored by unknown's avatar unknown
Browse files

Re-run fix-fields on condition if table was reopened in HANDLERREAD


sql/sql_base.cc:
  Added more comments
sql/sql_handler.cc:
  Re-run fix-fields on condition if table was reopened
parent 159eaf4f
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -1012,10 +1012,20 @@ TABLE *find_locked_table(THD *thd, const char *db,const char *table_name)


/****************************************************************************
** Reopen an table because the definition has changed. The date file for the
** table is already closed.
** Returns 0 if ok.
** If table can't be reopened, the entry is unchanged.
  Reopen an table because the definition has changed. The date file for the
  table is already closed.

  SYNOPSIS
    reopen_table()
    table		Table to be opened
    locked		1 if we have already a lock on LOCK_open

  NOTES
    table->query_id will be 0 if table was reopened

  RETURN
    0  ok
    1  error ('table' is unchanged if table couldn't be reopened)
****************************************************************************/

bool reopen_table(TABLE *table,bool locked)
@@ -1085,8 +1095,10 @@ bool reopen_table(TABLE *table,bool locked)
    (*field)->table_name=table->table_name;
  }
  for (key=0 ; key < table->keys ; key++)
  {
    for (part=0 ; part < table->key_info[key].usable_key_parts ; part++)
      table->key_info[key].key_part[part].field->table= table;
  }
  VOID(pthread_cond_broadcast(&COND_refresh));
  error=0;

+8 −3
Original line number Diff line number Diff line
@@ -437,9 +437,14 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
  if (!lock)
    goto err0; // mysql_lock_tables() printed error message already

  if (cond && ((!cond->fixed &&
              cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1)))
  if (cond)
  {
    if (table->query_id != thd->query_id)
      cond->cleanup();                          // File was reopened
    if ((!cond->fixed &&
         cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1))
      goto err0;
  }

  if (keyname)
  {