mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
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.
This commit is contained in:
@ -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;
|
||||
|
@ -1700,4 +1700,31 @@ set @@optimizer_switch = @old_optimizer_switch;
|
||||
|
||||
drop table t1, t2, t3;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # LP BUG#782305: Wrong result/valgrind warning in Item_sum_hybrid::any_value()
|
||||
--echo #
|
||||
|
||||
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;
|
||||
EXECUTE st1;
|
||||
|
||||
PREPARE st2 FROM '
|
||||
SELECT * FROM t2
|
||||
WHERE f2 <= SOME (SELECT f1-2 FROM t1 UNION SELECT f1-1 FROM t1);
|
||||
';
|
||||
EXECUTE st2;
|
||||
EXECUTE st2;
|
||||
|
||||
drop table t1, t2;
|
||||
|
||||
|
||||
set optimizer_switch=@subselect4_tmp;
|
||||
|
Reference in New Issue
Block a user