1
0
mirror of https://github.com/MariaDB/server.git synced 2025-09-02 09:41:40 +03:00

BUG#20256 - LOCK WRITE - MyISAM

Only MyISAM tables locked with LOCK TABLES ... WRITE were affected.

A query that is optimized with index_merge doesn't reflect rows
inserted within LOCK TABLES.

MyISAM doesn't flush a state within LOCK TABLES. index_merge
optimization creates a copy of the handler, which thus gets
outdated MyISAM state.

New handler->clone() method is introduced to fix this problem.
For non-MyISAM storage engines it allocates a handler and opens
it with ha_open(). For MyISAM it additionally copies MyISAM state
pointer to cloned handler.


mysql-test/r/index_merge.result:
  A test case for bug#20256.
mysql-test/t/index_merge.test:
  A test case for bug#20256.
sql/ha_myisam.cc:
  clone method added to handler class.
sql/ha_myisam.h:
  clone method added to handler class.
sql/handler.cc:
  clone method added to handler class.
sql/handler.h:
  clone method added to handler class.
sql/opt_range.cc:
  Use handler clone method.
This commit is contained in:
unknown
2006-09-12 18:25:35 +05:00
parent 86ce30966e
commit fa1436bf1f
7 changed files with 83 additions and 4 deletions

View File

@@ -1033,10 +1033,7 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler)
}
THD *thd= current_thd;
if (!(file= get_new_handler(head, thd->mem_root, head->s->db_type)))
goto failure;
DBUG_PRINT("info", ("Allocated new handler %p", file));
if (file->ha_open(head->s->path, head->db_stat, HA_OPEN_IGNORE_IF_LOCKED))
if (!(file= head->file->clone(thd->mem_root)))
{
/* Caller will free the memory */
goto failure;