diff options
author | unknown <timour@askmonty.org> | 2011-07-18 23:45:38 +0300 |
---|---|---|
committer | unknown <timour@askmonty.org> | 2011-07-18 23:45:38 +0300 |
commit | c9e236828e3e00a29abf4865ec0a852d3754ec0c (patch) | |
tree | df9e07660bff4def0693352a1c7b3035d508b4a6 /mysql-test/r/subselect4.result | |
parent | cc0195d6a1e603c3ebef91af16a1e1c33dff4a2e (diff) | |
download | mariadb-git-c9e236828e3e00a29abf4865ec0a852d3754ec0c.tar.gz |
Fix bug lp:782305
Analysis:
Both the wrong result and the valgrind warning were a result
of incomplete cleanup of the MIN/MAX subquery rewrite. At the
first execution of the query, the non-aggregate subquery is
transformed into an aggregate MIN/MAX subquery. During the
fix_fields phase of the MIN/MAX function, it sets the property
st_select_lex::with_sum_func to true.
The second execution of the query finds this flag to be ON.
When optimization reaches the same MIN/MAX subquery
transformation, it tests if the subquery is an aggregate or not.
Since select_lex->with_sum_func == true from the previous
execution, the transformation executes the second branch that
handles aggregate subqueries. This substitutes the subquery
Item into a Item_maxmin_subselect. At the same time elsewhere
it is assumed that the subquery Item is of type
Item_allany_subselect. Ultimately this results in casting the
actual object to the wrong class, and calling the wrong
any_value() method from empty_underlying_subquery().
Solution:
Cleanup the st_select_lex::with_sum_func property in the case
when the MIN/MAX transformation was performed for a non-aggregate
subquery, so that the transformation can be repeated.
Diffstat (limited to 'mysql-test/r/subselect4.result')
-rw-r--r-- | mysql-test/r/subselect4.result | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/mysql-test/r/subselect4.result b/mysql-test/r/subselect4.result index 9ea790ac800..bfd5872acf2 100644 --- a/mysql-test/r/subselect4.result +++ b/mysql-test/r/subselect4.result @@ -2060,4 +2060,34 @@ WHERE t1.f4 IN ( SELECT f4 FROM t2 ) ; f4 set @@optimizer_switch = @old_optimizer_switch; drop table t1, t2, t3; +# +# LP BUG#782305: Wrong result/valgrind warning in Item_sum_hybrid::any_value() +# +CREATE TABLE t1 ( f1 int) ; +INSERT INTO t1 VALUES (2),(3); +CREATE TABLE t2 (f2 int) ; +INSERT INTO t2 VALUES (2),(3); +PREPARE st1 FROM ' +SELECT * FROM t2 +WHERE f2 <= SOME ( SELECT f1 FROM t1 ); +'; +EXECUTE st1; +f2 +2 +3 +EXECUTE st1; +f2 +2 +3 +PREPARE st2 FROM ' +SELECT * FROM t2 +WHERE f2 <= SOME (SELECT f1-2 FROM t1 UNION SELECT f1-1 FROM t1); +'; +EXECUTE st2; +f2 +2 +EXECUTE st2; +f2 +2 +drop table t1, t2; set optimizer_switch=@subselect4_tmp; |