summaryrefslogtreecommitdiff
path: root/sql/item_subselect.cc
diff options
context:
space:
mode:
authorSergey Glukhov <Sergey.Glukhov@sun.com>2010-10-01 14:08:38 +0400
committerSergey Glukhov <Sergey.Glukhov@sun.com>2010-10-01 14:08:38 +0400
commit233e4d809aeccff150494b8632abedb77c213fbd (patch)
treedd6a64f3ae4c4989c2ade7f0039d1143653ff241 /sql/item_subselect.cc
parentb76277fce5a375b931ae2f967e26956539eb1ffc (diff)
downloadmariadb-git-233e4d809aeccff150494b8632abedb77c213fbd.tar.gz
Bug#54488 crash when using explain and prepared statements with subqueries
The crash happens because original join table is replaced with temporary table at execution stage and later we attempt to use this temporary table in select_describe. It might happen that Item_subselect::update_used_tables() method which sets const_item flag is not called by some reasons (no where/having conditon in subquery for example). It prevents JOIN::join_tmp creation and breaks original join. The fix is to call ::update_used_tables() before ::const_item() check. mysql-test/r/ps.result: test case mysql-test/t/ps.test: test case sql/item_subselect.cc: call ::update_used_tables() before ::const_item() check.
Diffstat (limited to 'sql/item_subselect.cc')
-rw-r--r--sql/item_subselect.cc26
1 files changed, 15 insertions, 11 deletions
diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
index b93ea6f241b..2daeeb12b6d 100644
--- a/sql/item_subselect.cc
+++ b/sql/item_subselect.cc
@@ -1914,18 +1914,22 @@ int subselect_single_select_engine::exec()
}
if (!select_lex->uncacheable && thd->lex->describe &&
!(join->select_options & SELECT_DESCRIBE) &&
- join->need_tmp && item->const_item())
+ join->need_tmp)
{
- /*
- Force join->join_tmp creation, because this subquery will be replaced
- by a simple select from the materialization temp table by optimize()
- called by EXPLAIN and we need to preserve the initial query structure
- so we can display it.
- */
- select_lex->uncacheable|= UNCACHEABLE_EXPLAIN;
- select_lex->master_unit()->uncacheable|= UNCACHEABLE_EXPLAIN;
- if (join->init_save_join_tab())
- DBUG_RETURN(1); /* purecov: inspected */
+ item->update_used_tables();
+ if (item->const_item())
+ {
+ /*
+ Force join->join_tmp creation, because this subquery will be replaced
+ by a simple select from the materialization temp table by optimize()
+ called by EXPLAIN and we need to preserve the initial query structure
+ so we can display it.
+ */
+ select_lex->uncacheable|= UNCACHEABLE_EXPLAIN;
+ select_lex->master_unit()->uncacheable|= UNCACHEABLE_EXPLAIN;
+ if (join->init_save_join_tab())
+ DBUG_RETURN(1); /* purecov: inspected */
+ }
}
if (item->engine_changed)
{