diff options
author | unknown <sanja@askmonty.org> | 2010-09-08 09:26:17 +0300 |
---|---|---|
committer | unknown <sanja@askmonty.org> | 2010-09-08 09:26:17 +0300 |
commit | 11dc256ca4ee1057d1e918326b8c76fdbbca63cd (patch) | |
tree | 8f59ac5856cdd8515b959711d450188651952d46 /sql/sql_expression_cache.cc | |
parent | d6a9b52269c2f64a8f793c4680eed9adece0a716 (diff) | |
download | mariadb-git-11dc256ca4ee1057d1e918326b8c76fdbbca63cd.tar.gz |
Diffstat (limited to 'sql/sql_expression_cache.cc')
-rw-r--r-- | sql/sql_expression_cache.cc | 63 |
1 files changed, 4 insertions, 59 deletions
diff --git a/sql/sql_expression_cache.cc b/sql/sql_expression_cache.cc index cbbafbd55c8..ca7c583292c 100644 --- a/sql/sql_expression_cache.cc +++ b/sql/sql_expression_cache.cc @@ -12,7 +12,7 @@ Expression_cache_tmptable::Expression_cache_tmptable(THD *thd, List<Item*> &dependants, Item *value) :cache_table(NULL), table_thd(thd), list(&dependants), val(value), - equalities(NULL), inited (0) + inited (0) { DBUG_ENTER("Expression_cache_tmptable::Expression_cache_tmptable"); DBUG_VOID_RETURN; @@ -20,56 +20,6 @@ Expression_cache_tmptable::Expression_cache_tmptable(THD *thd, /** - Build and of equalities for the expression's parameters of certain types - - @details - If the temporary table used as an expression cache contains fields of - certain types then it's not enough to perform a lookup into the table to - verify that there is no row in the table for a given set of parameters. - Additionally for those fields we have to check equalities of the form - fld=val, where val is the value of the parameter stored in the column - fld. - The function generates a conjunction of all such equality predicates - and saves a pointer to it in the field 'equalities'. - - @retval FALSE OK - @retval TRUE Error -*/ - -bool Expression_cache_tmptable::make_equalities() -{ - List<Item> args; - List_iterator_fast<Item*> li(*list); - Item **ref; - DBUG_ENTER("Expression_cache_tmptable::make_equalities"); - - for (uint i= 1 /* skip result filed */; (ref= li++); i++) - { - Field *fld= cache_table->field[i]; - /* Only some field types should be checked after lookup */ - if (fld->type() == MYSQL_TYPE_VARCHAR || - fld->type() == MYSQL_TYPE_TINY_BLOB || - fld->type() == MYSQL_TYPE_MEDIUM_BLOB || - fld->type() == MYSQL_TYPE_LONG_BLOB || - fld->type() == MYSQL_TYPE_BLOB || - fld->type() == MYSQL_TYPE_VAR_STRING || - fld->type() == MYSQL_TYPE_STRING || - fld->type() == MYSQL_TYPE_NEWDECIMAL || - fld->type() == MYSQL_TYPE_DECIMAL) - { - args.push_front(new Item_func_eq(*ref, new Item_field(fld))); - } - } - if (args.elements == 1) - equalities= args.head(); - else - equalities= new Item_cond_and(args); - - DBUG_RETURN(equalities->fix_fields(table_thd, &equalities)); -} - - -/** Field enumerator for TABLE::add_tmp_key @param arg reference variable with current field number @@ -166,7 +116,8 @@ void Expression_cache_tmptable::init() if (cache_table->alloc_keys(1) || (cache_table->add_tmp_key(0, items.elements - 1, &field_enumerator, - (uchar*)&field_counter) < 0) || + (uchar*)&field_counter, + TRUE) < 0) || ref.tmp_table_index_lookup_init(table_thd, cache_table->key_info, it, TRUE)) { @@ -193,12 +144,6 @@ void Expression_cache_tmptable::init() goto error; } - if (make_equalities()) - { - DBUG_PRINT("error", ("Creating equalities failed")); - goto error; - } - DBUG_VOID_RETURN; error: @@ -249,7 +194,7 @@ Expression_cache::result Expression_cache_tmptable::check_value(Item **value) (uint)cache_table->status, (uint)ref.has_record)); if ((res= join_read_key2(table_thd, NULL, cache_table, &ref)) == 1) DBUG_RETURN(ERROR); - if (res || (equalities && !equalities->val_int())) + if (res) { subquery_cache_miss++; DBUG_RETURN(MISS); |