From e77888f53075d283d1e8d2c719ef91896b93e15e Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 Apr 2006 12:55:02 -0700 Subject: [PATCH] Fixed bug #18237. The code in opt_sum_query that prevented the COUNT/MIN/MAX optimization from being applied to outer joins was not adjusted after introducing nested joins. As a result if an outer join contained a reference to a view as an inner table the code of opt_sum_query missed the presence of an on expressions and erroneously applied the mentioned optimization. mysql-test/r/view.result: Added a test case for bug #18237. mysql-test/t/view.test: Added a test case for bug #18237. --- mysql-test/r/view.result | 17 +++++++++++++++++ mysql-test/t/view.test | 21 +++++++++++++++++++++ sql/opt_sum.cc | 8 +++++++- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 5a5f60e9409..f0fb35f1a2e 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -2562,3 +2562,20 @@ my_sqrt 1.4142135623731 DROP VIEW v1; DROP TABLE t1; +CREATE TABLE t1 (id int PRIMARY KEY); +CREATE TABLE t2 (id int PRIMARY KEY); +INSERT INTO t1 VALUES (1), (3); +INSERT INTO t2 VALUES (1), (2), (3); +CREATE VIEW v2 AS SELECT * FROM t2; +SELECT COUNT(*) FROM t1 LEFT JOIN t2 ON t1.id=t2.id; +COUNT(*) +2 +SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id; +id id +1 1 +3 3 +SELECT COUNT(*) FROM t1 LEFT JOIN v2 ON t1.id=v2.id; +COUNT(*) +2 +DROP VIEW v2; +DROP TABLE t1, t2; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index e53988ad3d9..afeb0dda729 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -2413,3 +2413,24 @@ SELECT my_sqrt FROM v1 ORDER BY my_sqrt; DROP VIEW v1; DROP TABLE t1; + +# +# Bug #18237: invalid count optimization applied to an outer join with a view +# + +CREATE TABLE t1 (id int PRIMARY KEY); +CREATE TABLE t2 (id int PRIMARY KEY); + +INSERT INTO t1 VALUES (1), (3); +INSERT INTO t2 VALUES (1), (2), (3); + +CREATE VIEW v2 AS SELECT * FROM t2; + +SELECT COUNT(*) FROM t1 LEFT JOIN t2 ON t1.id=t2.id; +SELECT * FROM t1 LEFT JOIN t2 ON t1.id=t2.id; + +SELECT COUNT(*) FROM t1 LEFT JOIN v2 ON t1.id=v2.id; + +DROP VIEW v2; + +DROP TABLE t1, t2; diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc index ed8e694dcb7..8a5a5875d47 100644 --- a/sql/opt_sum.cc +++ b/sql/opt_sum.cc @@ -96,8 +96,14 @@ int opt_sum_query(TABLE_LIST *tables, List &all_fields,COND *conds) */ for (TABLE_LIST *tl= tables; tl; tl= tl->next_leaf) { + TABLE_LIST *embedded; + for (embedded= tl ; embedded; embedded= embedded->embedding) + { + if (embedded->on_expr) + break; + } + if (embedded) /* Don't replace expression on a table that is part of an outer join */ - if (tl->on_expr) { outer_tables|= tl->table->map;