summaryrefslogtreecommitdiff
path: root/sql/sql_handler.cc
diff options
context:
space:
mode:
authorunknown <davi@moksha.com.br>2007-10-10 18:17:11 -0300
committerunknown <davi@moksha.com.br>2007-10-10 18:17:11 -0300
commit954bb0f555c31d38147a3107335ab25cf3ac8f84 (patch)
tree49700a80cd8f211380b56bf26aa0c3839f61f67f /sql/sql_handler.cc
parent3b4b925ea7575f8ceed273ff698df28b571cb0aa (diff)
parentf5dd3491f23cc98a528e06ab7f68869ad69f602b (diff)
downloadmariadb-git-954bb0f555c31d38147a3107335ab25cf3ac8f84.tar.gz
Merge moksha.com.br:/Users/davi/mysql/bugs/21587-5.0
into moksha.com.br:/Users/davi/mysql/bugs/21587-5.1 sql/sql_handler.cc: Auto merged
Diffstat (limited to 'sql/sql_handler.cc')
-rw-r--r--sql/sql_handler.cc52
1 files changed, 40 insertions, 12 deletions
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index 1adce48c539..bced29e1e81 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -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, &not_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