diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_class.h | 4 | ||||
-rw-r--r-- | sql/sql_expression_cache.cc | 34 |
2 files changed, 24 insertions, 14 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h index 53f03de5efc..bf84d12cc58 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -62,9 +62,9 @@ public: class Item_iterator_ref_list: public Item_iterator { - List_iterator_fast<Item*> list; + List_iterator<Item*> list; public: - Item_iterator_ref_list(List_iterator_fast<Item*> &arg_list): + Item_iterator_ref_list(List_iterator<Item*> &arg_list): list(arg_list) {} void open() { list.rewind(); } Item *next() { return *(list++); } diff --git a/sql/sql_expression_cache.cc b/sql/sql_expression_cache.cc index 924abb24480..9596ca87bab 100644 --- a/sql/sql_expression_cache.cc +++ b/sql/sql_expression_cache.cc @@ -96,21 +96,38 @@ static uint field_enumerator(uchar *arg) void Expression_cache_tmptable::init() { - List_iterator_fast<Item*> li(*list); + List_iterator<Item*> li(*list); Item_iterator_ref_list it(li); Item **item; uint field_counter; DBUG_ENTER("Expression_cache_tmptable::init"); DBUG_ASSERT(!inited); inited= TRUE; + cache_table= NULL; - if (!(ULONGLONG_MAX >> (list->elements + 1))) + while ((item= li++)) { - DBUG_PRINT("info", ("Too many dependencies")); - DBUG_VOID_RETURN; + DBUG_ASSERT(item); + if (*item) + { + DBUG_ASSERT((*item)->fixed); + items.push_back((*item)); + } + else + { + /* + This is possible when optimizer already executed this subquery and + optimized out the condition predicate. + */ + li.remove(); + } } - cache_table= NULL; + if (list->elements == 0) + { + DBUG_PRINT("info", ("All parameters were removed by optimizer.")); + DBUG_VOID_RETURN; + } cache_table_param.init(); /* dependent items and result */ @@ -119,13 +136,6 @@ void Expression_cache_tmptable::init() cache_table_param.skip_create_table= 1; cache_table= NULL; - while ((item= li++)) - { - DBUG_ASSERT(item); - DBUG_ASSERT(*item); - DBUG_ASSERT((*item)->fixed); - items.push_back((*item)); - } items.push_front(val); if (!(cache_table= create_tmp_table(table_thd, &cache_table_param, |