Commit 1e5dccd9 authored by unknown's avatar unknown

bug #20835 (Subqueries: literal string with =any fails)

We create Item_cache_* object for each operand for each left operand of
a subquery predicate. We also create Item_func_conv_charset for each string
constant that needs charset conversion. So here we have Item_cache wrapped
into Item_func_conv_charset.
When Item_func_conv_charset wraps an constant Item it gets it's value
in constructor. The problem is that Item_cache is ready to be used only
at execution time, which is too late.
The fix makes Item_cache wrapping constant to get ready at fix_fields() time.


mysql-test/r/subselect.result:
  test result
mysql-test/t/subselect.test:
  test case
sql/item_cmpfunc.cc:
  now Item_optimizer::fix_left will store constant arguments in cache
  on fix_fields() stage
parent d607f40b
......@@ -3592,3 +3592,9 @@ FROM t1) t;
COUNT(*)
3000
DROP TABLE t1,t2;
CREATE TABLE t1 (s1 char(1));
INSERT INTO t1 VALUES ('a');
SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
s1
a
DROP TABLE t1;
......@@ -2496,3 +2496,11 @@ SELECT SQL_NO_CACHE COUNT(*)
FROM t1) t;
DROP TABLE t1,t2;
#
# Bug#20835 (literal string with =any values)
#
CREATE TABLE t1 (s1 char(1));
INSERT INTO t1 VALUES ('a');
SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
DROP TABLE t1;
......@@ -797,7 +797,8 @@ bool Item_in_optimizer::fix_left(THD *thd, Item **ref)
}
not_null_tables_cache= args[0]->not_null_tables();
with_sum_func= args[0]->with_sum_func;
const_item_cache= args[0]->const_item();
if ((const_item_cache= args[0]->const_item()))
cache->store(args[0]);
return 0;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment