diff options
author | unknown <sanja@montyprogram.com> | 2012-11-26 21:22:44 +0200 |
---|---|---|
committer | unknown <sanja@montyprogram.com> | 2012-11-26 21:22:44 +0200 |
commit | b8b875cb796743240bed71857eae73d37f03c28f (patch) | |
tree | 6b45273eaac9589544049fdac10d9e750cc671d1 /sql | |
parent | 5e345281e3599c793fdea771d0f23eb19f22d601 (diff) | |
download | mariadb-git-b8b875cb796743240bed71857eae73d37f03c28f.tar.gz |
Fix of MDEV-3874: Server crashes in Item_field::print on a SELECT from a MERGE view with materialization+semijoin, subquery, ORDER BY.
The problem was that in debugging binaries it try to print item to assign human readable name to the item.
But subquery item was already freed (join_free/cleanup with full cleanup) so Item_field refers to temporary
table which memory had been already freed.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_select.cc | 13 | ||||
-rw-r--r-- | sql/sql_select.h | 3 |
2 files changed, 16 insertions, 0 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index ceb8827c790..8f7fdab4ed3 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2074,6 +2074,7 @@ JOIN::reinit() ULL(0)); first_record= 0; + cleaned= false; if (exec_tmp_table1) { @@ -10623,6 +10624,7 @@ void JOIN::cleanup(bool full) { tab->cleanup(); } + cleaned= true; } else { @@ -22409,6 +22411,17 @@ void st_select_lex::print(THD *thd, String *str, enum_query_type query_type) str->append(STRING_WITH_LEN("select ")); + if (join && join->cleaned) + { + /* + JOIN already cleaned up so it is dangerous to print items + because temporary tables they pointed on could be freed. + */ + str->append('#'); + str->append(select_number); + return; + } + /* First add options */ if (options & SELECT_STRAIGHT_JOIN) str->append(STRING_WITH_LEN("straight_join ")); diff --git a/sql/sql_select.h b/sql/sql_select.h index e4687b4f00c..bac29b96c5a 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -1141,6 +1141,8 @@ public: bool skip_sort_order; bool need_tmp, hidden_group_fields; + /* TRUE if there was full cleunap of the JOIN */ + bool cleaned; DYNAMIC_ARRAY keyuse; Item::cond_result cond_value, having_value; List<Item> all_fields; ///< to store all fields that used in query @@ -1268,6 +1270,7 @@ public: zero_result_cause= 0; optimized= 0; initialized= 0; + cleaned= 0; cond_equal= 0; having_equal= 0; exec_const_cond= 0; |