summaryrefslogtreecommitdiff
path: root/sql/item_cmpfunc.h
diff options
context:
space:
mode:
authorChaithra Gopalareddy <chaithra.gopalareddy@oracle.com>2015-11-20 12:30:15 +0530
committerChaithra Gopalareddy <chaithra.gopalareddy@oracle.com>2015-11-20 12:30:15 +0530
commita7fb5aecfd527c6b9274db02dcec69daf06c97a3 (patch)
tree36b2b9221db5ae52d347512089258aa55bb7da68 /sql/item_cmpfunc.h
parentf3554bf148710c73df2a1ca5547ea7ff7c21a969 (diff)
downloadmariadb-git-a7fb5aecfd527c6b9274db02dcec69daf06c97a3.tar.gz
Bug#19941403: FATAL_SIGNAL(SIG 6) IN BUILD_EQUAL_ITEMS_FOR_COND | IN SQL/SQL_OPTIMIZER.CC:1657
Problem: At the end of first execution select_lex->prep_where is pointing to a runtime created object (temporary table field). As a result server exits trying to access a invalid pointer during second execution. Analysis: While optimizing the join conditions for the query, after the permanent transformation, optimizer makes a copy of the new where conditions in select_lex->prep_where. "prep_where" is what is used as the "where condition" for the query at the start of execution. W.r.t the query in question, "where" condition is actually pointing to a field in the temporary table. As a result, for the second execution the pointer is no more valid resulting in server exit. Fix: At the end of the first execution, select_lex->where will have the original item of the where condition. Make prep_where the new place where the original item of select->where has to be rolled back. Fixed in 5.7 with the wl#7082 - Move permanent transformations from JOIN::optimize to JOIN::prepare Patch for 5.5 includes the following backports from 5.6: Bugfix for Bug12603141 - This makes the first execute statement in the testcase pass in 5.5 However it was noted later in in Bug16163596 that the above bugfix needed to be modified. Although Bug16163596 is reproducible only with changes done for Bug12582849, we have decided include the fix. Considering that Bug12582849 is related to Bug12603141, the fix is also included here. However this results in Bug16317817, Bug16317685, Bug16739050. So fix for the above three bugs is also part of this patch.
Diffstat (limited to 'sql/item_cmpfunc.h')
-rw-r--r--sql/item_cmpfunc.h10
1 files changed, 5 insertions, 5 deletions
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index 115d6db300d..00c7bccbfb8 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -1514,7 +1514,7 @@ public:
friend int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves,
COND **conds);
void top_level_item() { abort_on_null=1; }
- void copy_andor_arguments(THD *thd, Item_cond *item);
+ void copy_andor_arguments(THD *thd, Item_cond *item, bool real_items= false);
bool walk(Item_processor processor, bool walk_subquery, uchar *arg);
Item *transform(Item_transformer transformer, uchar *arg);
void traverse_cond(Cond_traverser, void *arg, traverse_order order);
@@ -1689,11 +1689,11 @@ public:
const char *func_name() const { return "and"; }
table_map not_null_tables() const
{ return abort_on_null ? not_null_tables_cache: and_tables_cache; }
- Item* copy_andor_structure(THD *thd)
+ Item* copy_andor_structure(THD *thd, bool real_items)
{
Item_cond_and *item;
if ((item= new Item_cond_and(thd, this)))
- item->copy_andor_arguments(thd, this);
+ item->copy_andor_arguments(thd, this, real_items);
return item;
}
Item *neg_transformer(THD *thd);
@@ -1719,11 +1719,11 @@ public:
longlong val_int();
const char *func_name() const { return "or"; }
table_map not_null_tables() const { return and_tables_cache; }
- Item* copy_andor_structure(THD *thd)
+ Item* copy_andor_structure(THD *thd, bool real_items)
{
Item_cond_or *item;
if ((item= new Item_cond_or(thd, this)))
- item->copy_andor_arguments(thd, this);
+ item->copy_andor_arguments(thd, this, real_items);
return item;
}
Item *neg_transformer(THD *thd);