summaryrefslogtreecommitdiff
path: root/mysql-test/t/subselect_innodb.test
diff options
context:
space:
mode:
authorunknown <timour@askmonty.org>2011-08-27 00:40:29 +0300
committerunknown <timour@askmonty.org>2011-08-27 00:40:29 +0300
commit2df1914791030714196c3d829187891a97be54dc (patch)
treed24362560b461dbf256a1b427c543610548b28f1 /mysql-test/t/subselect_innodb.test
parentee28dec85885a1579758d9184ecb63ce810e738f (diff)
downloadmariadb-git-2df1914791030714196c3d829187891a97be54dc.tar.gz
Fix bug lp:827416
Analysis: Constant table optimization of the outer query finds that the right side of the equality is a constant that can be used for an eq_ref access to fetch one row from t1, and substitute t1 with a constant. Thus constant optimization triggers evaluation of the subquery during the optimize phase of the outer query. The innermost subquery requires a plan with a temporary table because with InnoDB tables the exact count of rows is not known, and the empty tables cannot be optimzied way. JOIN::exec for the innermost subquery substitutes the subquery tables with a temporary table. When EXPLAIN gets to print the tables in the innermost subquery, EXPLAIN needs to print the name of each table through the corresponding TABLE_LIST object. However, the temporary table created during execution doesn't have a corresponding TABLE_LIST, so we get a null pointer exception. Solution: The solution is to forbid using expensive constant expressions for eq_ref access for contant table optimization. Notice that eq_ref with a subquery providing the value is still possible during regular execution.
Diffstat (limited to 'mysql-test/t/subselect_innodb.test')
-rw-r--r--mysql-test/t/subselect_innodb.test24
1 files changed, 23 insertions, 1 deletions
diff --git a/mysql-test/t/subselect_innodb.test b/mysql-test/t/subselect_innodb.test
index da7524c1427..e108aecfd36 100644
--- a/mysql-test/t/subselect_innodb.test
+++ b/mysql-test/t/subselect_innodb.test
@@ -241,5 +241,27 @@ call p1();
drop procedure p1;
drop tables t1,t2,t3;
-set optimizer_switch=@subselect_innodb_tmp;
+--echo #
+--echo # LP BUG#827416: Crash in select_describe() on EXPLAIN with DISTINCT in nested subqueries
+--echo #
+
+CREATE TABLE t3 ( b int) ENGINE=InnoDB;
+CREATE TABLE t2 ( c int) ENGINE=InnoDB;
+CREATE TABLE t1 ( a int NOT NULL , PRIMARY KEY (a)) ENGINE=InnoDB;
+
+EXPLAIN SELECT *
+FROM t1
+WHERE t1.a = (
+ SELECT SUM( c )
+ FROM t2
+ WHERE (SELECT DISTINCT b FROM t3) > 0);
+SELECT *
+FROM t1
+WHERE t1.a = (
+ SELECT SUM( c )
+ FROM t2
+ WHERE (SELECT DISTINCT b FROM t3) > 0);
+DROP TABLE t1, t2, t3;
+
+set optimizer_switch=@subselect_innodb_tmp;