Commit c968fd48 authored by Georgi Kodinov's avatar Georgi Kodinov

Bug #49512 : subquery with aggregate function crash

  subselect_single_select_engine::exec()

When a subquery doesn't need to be evaluated because
it returns only aggregate functions and these aggregates
can be calculated from the metadata about the table it
was not updating all the relevant members of the JOIN 
structure to reflect that this is a constant query.
This caused problems to the enclosing subquery 
('<> SOME' in the test case above) trying to read some
data about the tables.

Fixed by setting const_tables to the number of tables 
when the SELECT is optimized away.
parent f79e182a
...@@ -4602,4 +4602,17 @@ SELECT 1 FROM t1 GROUP BY ...@@ -4602,4 +4602,17 @@ SELECT 1 FROM t1 GROUP BY
1 1
1 1
DROP TABLE t1; DROP TABLE t1;
#
# Bug #49512 : subquery with aggregate function crash
# subselect_single_select_engine::exec()
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES();
# should not crash
SELECT 1 FROM t1 WHERE a <> SOME
(
SELECT MAX((SELECT a FROM t1 LIMIT 1)) AS d
FROM t1,t1 a
);
1
DROP TABLE t1;
End of 5.1 tests. End of 5.1 tests.
...@@ -3585,4 +3585,19 @@ SELECT 1 FROM t1 GROUP BY ...@@ -3585,4 +3585,19 @@ SELECT 1 FROM t1 GROUP BY
(SELECT LAST_INSERT_ID() FROM t1 ORDER BY MIN(a) ASC LIMIT 1); (SELECT LAST_INSERT_ID() FROM t1 ORDER BY MIN(a) ASC LIMIT 1);
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # Bug #49512 : subquery with aggregate function crash
--echo # subselect_single_select_engine::exec()
CREATE TABLE t1(a INT);
INSERT INTO t1 VALUES();
--echo # should not crash
SELECT 1 FROM t1 WHERE a <> SOME
(
SELECT MAX((SELECT a FROM t1 LIMIT 1)) AS d
FROM t1,t1 a
);
DROP TABLE t1;
--echo End of 5.1 tests. --echo End of 5.1 tests.
...@@ -942,6 +942,7 @@ JOIN::optimize() ...@@ -942,6 +942,7 @@ JOIN::optimize()
DBUG_PRINT("info",("Select tables optimized away")); DBUG_PRINT("info",("Select tables optimized away"));
zero_result_cause= "Select tables optimized away"; zero_result_cause= "Select tables optimized away";
tables_list= 0; // All tables resolved tables_list= 0; // All tables resolved
const_tables= tables;
/* /*
Extract all table-independent conditions and replace the WHERE Extract all table-independent conditions and replace the WHERE
clause with them. All other conditions were computed by opt_sum_query clause with them. All other conditions were computed by opt_sum_query
......
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