summaryrefslogtreecommitdiff
path: root/storage/myisammrg
diff options
context:
space:
mode:
authorKonstantin Osipov <kostja@sun.com>2010-07-02 20:07:57 +0400
committerKonstantin Osipov <kostja@sun.com>2010-07-02 20:07:57 +0400
commit635ccedbbc1f970e465d140cdf4cdd2cba141c8e (patch)
tree2d39cc95922fe9199dfd5249c3f67c9b67890eed /storage/myisammrg
parent0e9b910d6b7442a42f2aea0a0043327fff44b267 (diff)
downloadmariadb-git-635ccedbbc1f970e465d140cdf4cdd2cba141c8e.tar.gz
A fix and a test case for Bug#36171 "CREATE TEMPORARY TABLE and
MERGE engine". Backport the patch from 6.0 by Ingo Struewing: revid:ingo.struewing@sun.com-20091028183659-6kmv1k3gdq6cpg4d Bug#36171 - CREATE TEMPORARY TABLE and MERGE engine In former MySQL versions, up to 5.1.23/6.0.4 it was possible to create temporary MERGE tables with non-temporary MyISAM tables. This has been changed in the mentioned version due to Bug 19627 (temporary merge table locking). MERGE children were locked through the parent table. If the parent was temporary, it was not locked and so the children were not locked either. Parallel use of the MyISAM tables corrupted them. Since 6.0.6 (WL 4144 - Lock MERGE engine children), the children are locked independently from the parent. Now it is possible to allow non-temporary children with a temporary parent. Even though the temporary MERGE table itself is not locked, each non-temporary MyISAM table is locked anyway. NOTE: Behavior change: In 5.1.23/6.0.4 we prohibited non-temporary children with a temporary MERGE table. Now we re-allow it. An important side-effect is that temporary tables, which overlay non-temporary MERGE children, overlay the children in the MERGE table.
Diffstat (limited to 'storage/myisammrg')
-rw-r--r--storage/myisammrg/ha_myisammrg.cc23
1 files changed, 11 insertions, 12 deletions
diff --git a/storage/myisammrg/ha_myisammrg.cc b/storage/myisammrg/ha_myisammrg.cc
index 1681f062117..08aa9dfd0e4 100644
--- a/storage/myisammrg/ha_myisammrg.cc
+++ b/storage/myisammrg/ha_myisammrg.cc
@@ -476,10 +476,7 @@ int ha_myisammrg::add_children_list(void)
child_l->parent_l= parent_l;
/* Copy select_lex. Used in unique_table() at least. */
child_l->select_lex= parent_l->select_lex;
- /*
- Set the expected table version, to not cause spurious re-prepare.
- @todo: revise after the fix for Bug#36171
- */
+ /* Set the expected table version, to not cause spurious re-prepare. */
child_l->set_table_ref_id(mrg_child_def->get_child_table_ref_type(),
mrg_child_def->get_child_def_version());
/* Link TABLE_LIST object into the children list. */
@@ -618,15 +615,17 @@ extern "C" MI_INFO *myisammrg_attach_children_callback(void *callback_param)
param->need_compat_check= TRUE;
/*
- If parent is temporary, children must be temporary too and vice
- versa. This check must be done for every child on every open because
- the table def version can overlap between temporary and
- non-temporary tables. We need to detect the case where a
- non-temporary table has been replaced with a temporary table of the
- same version. Or vice versa. A very unlikely case, but it could
- happen.
+ If child is temporary, parent must be temporary as well. Other
+ parent/child combinations are allowed. This check must be done for
+ every child on every open because the table def version can overlap
+ between temporary and non-temporary tables. We need to detect the
+ case where a non-temporary table has been replaced with a temporary
+ table of the same version. Or vice versa. A very unlikely case, but
+ it could happen. (Note that the condition was different from
+ 5.1.23/6.0.4(Bug#19627) to 5.5.6 (Bug#36171): child->s->tmp_table !=
+ parent->s->tmp_table. Tables were required to have the same status.)
*/
- if (child->s->tmp_table != parent->s->tmp_table)
+ if (child->s->tmp_table && !parent->s->tmp_table)
{
DBUG_PRINT("error", ("temporary table mismatch parent: %d child: %d",
parent->s->tmp_table, child->s->tmp_table));