From 8a5940c4773d3dc7e928e8d9300450a6b5d3b957 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 5 Mar 2012 15:48:12 +0200 Subject: [PATCH] Fix for LP BUG#944504 Problem is that subquery execution can't be called during prepare/optimize phase. Also small fix for subquery test suite. --- mysql-test/r/ctype_recoding.result | 16 ++++++++++++++++ mysql-test/r/subselect.result | 1 + mysql-test/r/subselect_no_mat.result | 1 + mysql-test/r/subselect_no_opts.result | 1 + mysql-test/r/subselect_no_scache.result | 1 + mysql-test/r/subselect_no_semijoin.result | 1 + mysql-test/t/ctype_recoding.test | 18 ++++++++++++++++++ mysql-test/t/subselect.test | 3 ++- sql/item_strfunc.h | 2 +- 9 files changed, 42 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/ctype_recoding.result b/mysql-test/r/ctype_recoding.result index ee95812c03e..f096620daf0 100644 --- a/mysql-test/r/ctype_recoding.result +++ b/mysql-test/r/ctype_recoding.result @@ -267,3 +267,19 @@ drop table t1; create table t1(a char character set latin1 default _cp1251 0xFF); ERROR 42000: Invalid default value for 'a' End of 4.1 tests +SET CHARACTER SET DEFAULT; +# +# LP BUG#944504 Item_func_conv_charset tries to execute subquery constant +# +SET optimizer_switch = 'in_to_exists=on'; +SET character_set_connection = utf8; +CREATE TABLE t1 ( a VARCHAR(1) ); +INSERT INTO t1 VALUES ('m'),('n'); +CREATE VIEW v1 AS SELECT 'w' ; +SELECT * FROM t1 WHERE a < ALL ( SELECT * FROM v1 ); +ERROR HY000: Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation '<=' +drop view v1; +drop table t1; +SET character_set_connection = default; +SET optimizer_switch= default; +#End of 5.3 tests diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 327cb5b2563..4eec1729fe3 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -5994,6 +5994,7 @@ SELECT ( SELECT b FROM t2 WHERE b = a OR rand() * 0) FROM t1; 1 NULL drop table t1,t2,t3; +set optimizer_switch=@subselect_tmp; # # LP BUG#905353 Wrong non-empty result with a constant table, # aggregate function in subquery, MyISAM or Aria diff --git a/mysql-test/r/subselect_no_mat.result b/mysql-test/r/subselect_no_mat.result index bcd08b70517..0962894bc19 100644 --- a/mysql-test/r/subselect_no_mat.result +++ b/mysql-test/r/subselect_no_mat.result @@ -5993,6 +5993,7 @@ SELECT ( SELECT b FROM t2 WHERE b = a OR rand() * 0) FROM t1; 1 NULL drop table t1,t2,t3; +set optimizer_switch=@subselect_tmp; # # LP BUG#905353 Wrong non-empty result with a constant table, # aggregate function in subquery, MyISAM or Aria diff --git a/mysql-test/r/subselect_no_opts.result b/mysql-test/r/subselect_no_opts.result index a493722fabe..6bd5e0e4ddd 100644 --- a/mysql-test/r/subselect_no_opts.result +++ b/mysql-test/r/subselect_no_opts.result @@ -5989,6 +5989,7 @@ SELECT ( SELECT b FROM t2 WHERE b = a OR rand() * 0) FROM t1; 1 NULL drop table t1,t2,t3; +set optimizer_switch=@subselect_tmp; # # LP BUG#905353 Wrong non-empty result with a constant table, # aggregate function in subquery, MyISAM or Aria diff --git a/mysql-test/r/subselect_no_scache.result b/mysql-test/r/subselect_no_scache.result index 1167e9483c9..d97b95ad314 100644 --- a/mysql-test/r/subselect_no_scache.result +++ b/mysql-test/r/subselect_no_scache.result @@ -6000,6 +6000,7 @@ SELECT ( SELECT b FROM t2 WHERE b = a OR rand() * 0) FROM t1; 1 NULL drop table t1,t2,t3; +set optimizer_switch=@subselect_tmp; # # LP BUG#905353 Wrong non-empty result with a constant table, # aggregate function in subquery, MyISAM or Aria diff --git a/mysql-test/r/subselect_no_semijoin.result b/mysql-test/r/subselect_no_semijoin.result index 782aba08d26..5c8ccfdbda0 100644 --- a/mysql-test/r/subselect_no_semijoin.result +++ b/mysql-test/r/subselect_no_semijoin.result @@ -5989,6 +5989,7 @@ SELECT ( SELECT b FROM t2 WHERE b = a OR rand() * 0) FROM t1; 1 NULL drop table t1,t2,t3; +set optimizer_switch=@subselect_tmp; # # LP BUG#905353 Wrong non-empty result with a constant table, # aggregate function in subquery, MyISAM or Aria diff --git a/mysql-test/t/ctype_recoding.test b/mysql-test/t/ctype_recoding.test index 1f55aea414a..ee07ef24def 100644 --- a/mysql-test/t/ctype_recoding.test +++ b/mysql-test/t/ctype_recoding.test @@ -210,3 +210,21 @@ drop table t1; create table t1(a char character set latin1 default _cp1251 0xFF); --echo End of 4.1 tests + +SET CHARACTER SET DEFAULT; +--echo # +--echo # LP BUG#944504 Item_func_conv_charset tries to execute subquery constant +--echo # +SET optimizer_switch = 'in_to_exists=on'; +SET character_set_connection = utf8; +CREATE TABLE t1 ( a VARCHAR(1) ); +INSERT INTO t1 VALUES ('m'),('n'); +CREATE VIEW v1 AS SELECT 'w' ; +--error ER_CANT_AGGREGATE_2COLLATIONS +SELECT * FROM t1 WHERE a < ALL ( SELECT * FROM v1 ); +drop view v1; +drop table t1; +SET character_set_connection = default; +SET optimizer_switch= default; + +--echo #End of 5.3 tests diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index e9735dae79f..6e2b2ef86ae 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -5075,8 +5075,8 @@ SELECT ( SELECT b FROM t2 WHERE b = a OR b * 0) FROM t1; # example with "random" SELECT ( SELECT b FROM t2 WHERE b = a OR rand() * 0) FROM t1; - drop table t1,t2,t3; +set optimizer_switch=@subselect_tmp; --echo # --echo # LP BUG#905353 Wrong non-empty result with a constant table, @@ -5090,5 +5090,6 @@ SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 ); drop table t1; + --echo # return optimizer switch changed in the beginning of this test set optimizer_switch=@subselect_tmp; diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index c4ce09112bc..fc4e888e6ea 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -747,7 +747,7 @@ public: { DBUG_ASSERT(args[0]->fixed); conv_charset= cs; - if (cache_if_const && args[0]->const_item()) + if (cache_if_const && args[0]->const_item() && !args[0]->with_subselect) { uint errors= 0; String tmp, *str= args[0]->val_str(&tmp);