mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
Merge moksha.com.br:/Users/davi/mysql/bugs/21587-5.0
into moksha.com.br:/Users/davi/mysql/bugs/21587-5.1
This commit is contained in:
commit
f74f363aac
1 changed files with 40 additions and 12 deletions
|
@ -65,11 +65,6 @@
|
|||
static enum enum_ha_read_modes rkey_to_rnext[]=
|
||||
{ RNEXT_SAME, RNEXT, RPREV, RNEXT, RPREV, RNEXT, RPREV, RPREV };
|
||||
|
||||
#define HANDLER_TABLES_HACK(thd) { \
|
||||
TABLE *tmp=thd->open_tables; \
|
||||
thd->open_tables=thd->handler_tables; \
|
||||
thd->handler_tables=tmp; }
|
||||
|
||||
static int mysql_ha_flush_table(THD *thd, TABLE **table_ptr, uint mode_flags);
|
||||
|
||||
|
||||
|
@ -187,6 +182,7 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
|
|||
char *db, *name, *alias;
|
||||
uint dblen, namelen, aliaslen, counter;
|
||||
int error;
|
||||
TABLE *backup_open_tables, *backup_handler_tables;
|
||||
DBUG_ENTER("mysql_ha_open");
|
||||
DBUG_PRINT("enter",("'%s'.'%s' as '%s' reopen: %d",
|
||||
tables->db, tables->table_name, tables->alias,
|
||||
|
@ -215,17 +211,29 @@ bool mysql_ha_open(THD *thd, TABLE_LIST *tables, bool reopen)
|
|||
}
|
||||
}
|
||||
|
||||
/* save open_ and handler_ tables state */
|
||||
backup_open_tables= thd->open_tables;
|
||||
backup_handler_tables= thd->handler_tables;
|
||||
|
||||
/* no pre-opened tables */
|
||||
thd->open_tables= NULL;
|
||||
/* to avoid flushes */
|
||||
thd->handler_tables= NULL;
|
||||
|
||||
/*
|
||||
open_tables() will set 'tables->table' if successful.
|
||||
It must be NULL for a real open when calling open_tables().
|
||||
*/
|
||||
DBUG_ASSERT(! tables->table);
|
||||
HANDLER_TABLES_HACK(thd);
|
||||
|
||||
/* for now HANDLER can be used only for real TABLES */
|
||||
tables->required_type= FRMTYPE_TABLE;
|
||||
error= open_tables(thd, &tables, &counter, 0);
|
||||
HANDLER_TABLES_HACK(thd);
|
||||
/* restore the state and merge the opened table into handler_tables list */
|
||||
thd->handler_tables= thd->open_tables ?
|
||||
thd->open_tables->next= backup_handler_tables,
|
||||
thd->open_tables : backup_handler_tables;
|
||||
thd->open_tables= backup_open_tables;
|
||||
|
||||
if (error)
|
||||
goto err;
|
||||
|
@ -351,7 +359,7 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
|
|||
ha_rows select_limit_cnt, ha_rows offset_limit_cnt)
|
||||
{
|
||||
TABLE_LIST *hash_tables;
|
||||
TABLE *table;
|
||||
TABLE *table, *backup_open_tables, *backup_handler_tables;
|
||||
MYSQL_LOCK *lock;
|
||||
List<Item> list;
|
||||
Protocol *protocol= thd->protocol;
|
||||
|
@ -361,7 +369,7 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
|
|||
uint num_rows;
|
||||
uchar *key;
|
||||
uint key_len;
|
||||
bool not_used;
|
||||
bool need_reopen;
|
||||
DBUG_ENTER("mysql_ha_read");
|
||||
DBUG_PRINT("enter",("'%s'.'%s' as '%s'",
|
||||
tables->db, tables->table_name, tables->alias));
|
||||
|
@ -375,6 +383,7 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
|
|||
List_iterator<Item> it(list);
|
||||
it++;
|
||||
|
||||
retry:
|
||||
if ((hash_tables= (TABLE_LIST*) hash_search(&thd->handler_tables_hash,
|
||||
(uchar*) tables->alias,
|
||||
strlen(tables->alias) + 1)))
|
||||
|
@ -428,9 +437,28 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
|
|||
}
|
||||
tables->table=table;
|
||||
|
||||
HANDLER_TABLES_HACK(thd);
|
||||
lock= mysql_lock_tables(thd, &tables->table, 1, 0, ¬_used);
|
||||
HANDLER_TABLES_HACK(thd);
|
||||
/* save open_ and handler_ tables state */
|
||||
backup_open_tables= thd->open_tables;
|
||||
backup_handler_tables= thd->handler_tables;
|
||||
|
||||
/* no pre-opened tables */
|
||||
thd->open_tables= NULL;
|
||||
/* to avoid flushes */
|
||||
thd->handler_tables= NULL;
|
||||
|
||||
lock= mysql_lock_tables(thd, &tables->table, 1,
|
||||
MYSQL_LOCK_NOTIFY_IF_NEED_REOPEN, &need_reopen);
|
||||
|
||||
/* restore previous context */
|
||||
thd->handler_tables= backup_handler_tables;
|
||||
thd->open_tables= backup_open_tables;
|
||||
|
||||
if (need_reopen)
|
||||
{
|
||||
mysql_ha_close_table(thd, tables);
|
||||
hash_tables->table= NULL;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
if (!lock)
|
||||
goto err0; // mysql_lock_tables() printed error message already
|
||||
|
|
Loading…
Add table
Reference in a new issue