diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 1bcc9fb727f..d8f2c62e7e2 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -4825,4 +4825,110 @@ drop tables t1,t2; # ----------------------------------------------------------------- # -- End of 5.3 tests. # ----------------------------------------------------------------- +# some subqueries in SELECT list test +create table t1 (a int, b int); +create table t2 (a int, b int); +insert into t1 values (1,2), (3,4), (3,3), (5,6), (7,8), (9,10); +insert into t2 values (1,2), (3,4), (3,3), (5,6), (7,8), (9,10); +create algorithm=merge view v1 as select t1.a as a, (select max(b) from t2 where t1.a=t2.a) as c from t1; +explain extended +select * from v1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 +3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where +Warnings: +Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 +Note 1003 select `test`.`t1`.`a` AS `a`,(select max(`test`.`t2`.`b`) from `test`.`t2` where (`test`.`t1`.`a` = `test`.`t2`.`a`)) AS `c` from `test`.`t1` +select * from v1; +a c +1 2 +3 4 +3 4 +5 6 +7 8 +9 10 +explain extended +select * from t2, v1 where t2.a=v1.a; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 6 100.00 +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) +3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where +Warnings: +Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 +Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t1`.`a` AS `a`,(select max(`test`.`t2`.`b`) from `test`.`t2` where (`test`.`t1`.`a` = `test`.`t2`.`a`)) AS `c` from `test`.`t2` join `test`.`t1` where (`test`.`t1`.`a` = `test`.`t2`.`a`) +select * from t2, v1 where t2.a=v1.a; +a b a c +1 2 1 2 +3 4 3 4 +3 3 3 4 +3 4 3 4 +3 3 3 4 +5 6 5 6 +7 8 7 8 +9 10 9 10 +explain extended +select * from t1, v1 where t1.a=v1.a; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) +3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where +Warnings: +Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`a` AS `a`,(select max(`test`.`t2`.`b`) from `test`.`t2` where (`test`.`t1`.`a` = `test`.`t2`.`a`)) AS `c` from `test`.`t1` join `test`.`t1` where (`test`.`t1`.`a` = `test`.`t1`.`a`) +select * from t1, v1 where t1.a=v1.a; +a b a c +1 2 1 2 +3 4 3 4 +3 3 3 4 +3 4 3 4 +3 3 3 4 +5 6 5 6 +7 8 7 8 +9 10 9 10 +explain extended +select * from t1, v1 where t1.b=v1.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) +3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where +Warnings: +Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`a` AS `a`,(select max(`test`.`t2`.`b`) from `test`.`t2` where (`test`.`t1`.`a` = `test`.`t2`.`a`)) AS `c` from `test`.`t1` join `test`.`t1` where (`test`.`t1`.`b` = (select max(`test`.`t2`.`b`) from `test`.`t2` where (`test`.`t1`.`a` = `test`.`t2`.`a`))) +select * from t1, v1 where t1.b=v1.c; +a b a c +1 2 1 2 +3 4 3 4 +3 4 3 4 +5 6 5 6 +7 8 7 8 +9 10 9 10 +explain extended +select * from t2, t1, v1 where t1.a=t2.a and t1.a=v1.a; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 6 100.00 +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (flat, BNL join) +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 100.00 Using where; Using join buffer (incremental, BNL join) +3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 6 100.00 Using where +Warnings: +Note 1276 Field or reference 'test.t1.a' of SELECT #3 was resolved in SELECT #2 +Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`a` AS `a`,(select max(`test`.`t2`.`b`) from `test`.`t2` where (`test`.`t1`.`a` = `test`.`t2`.`a`)) AS `c` from `test`.`t2` join `test`.`t1` join `test`.`t1` where ((`test`.`t1`.`a` = `test`.`t2`.`a`) and (`test`.`t1`.`a` = `test`.`t2`.`a`)) +select * from t2, t1, v1 where t1.a=t2.a and t1.a=v1.a; +a b a b a c +1 2 1 2 1 2 +3 4 3 4 3 4 +3 3 3 4 3 4 +3 4 3 3 3 4 +3 3 3 3 3 4 +3 4 3 4 3 4 +3 3 3 4 3 4 +3 4 3 3 3 4 +3 3 3 3 3 4 +5 6 5 6 5 6 +7 8 7 8 7 8 +9 10 9 10 9 10 +drop view v1; +drop table t1,t2; +# ----------------------------------------------------------------- +# -- End of 10.0 tests. +# ----------------------------------------------------------------- SET optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/suite/funcs_1/r/innodb_views.result b/mysql-test/suite/funcs_1/r/innodb_views.result index b50f5640520..96b6d3171f0 100644 --- a/mysql-test/suite/funcs_1/r/innodb_views.result +++ b/mysql-test/suite/funcs_1/r/innodb_views.result @@ -22340,10 +22340,9 @@ SET @variant2= 'CREATE VIEW v1 AS SELECT DISTINCTROW(f61) FROM t1'; SET @variant3= 'CREATE VIEW v1 AS SELECT SUM(f59) AS f61 FROM t1'; SET @variant4= 'CREATE VIEW v1 AS SELECT f61 FROM t1 GROUP BY f61'; SET @variant5= 'CREATE VIEW v1 AS SELECT f61 FROM t1 HAVING f61 > 0'; -SET @variant6= 'CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1'; -SET @variant7= 'CREATE VIEW v1 AS SELECT f61 FROM v2'; -SET @variant8= 'CREATE VIEW v1 AS SELECT f59 AS f61 FROM t1 WHERE f60 IN (SELECT f59 FROM t1)'; -SET @variant9= 'CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1'; +SET @variant6= 'CREATE VIEW v1 AS SELECT f61 FROM v2'; +SET @variant7= 'CREATE VIEW v1 AS SELECT f59 AS f61 FROM t1 WHERE f60 IN (SELECT f59 FROM t1)'; +SET @variant8= 'CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1'; CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1; INSERT INTO v1 VALUES (1002); ERROR HY000: The target table v1 of the INSERT is not insertable-into @@ -22368,14 +22367,6 @@ ERROR HY000: The target table v1 of the UPDATE is not updatable DELETE FROM v1; ERROR HY000: The target table v1 of the DELETE is not updatable DROP VIEW v1; -CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1; -INSERT INTO v1 VALUES (1002); -ERROR HY000: The target table v1 of the INSERT is not insertable-into -UPDATE v1 SET f61=1007; -ERROR HY000: The target table v1 of the UPDATE is not updatable -DELETE FROM v1; -ERROR HY000: The target table v1 of the DELETE is not updatable -DROP VIEW v1; CREATE VIEW v1 AS SELECT f61 FROM t1 HAVING f61 > 0; INSERT INTO v1 VALUES (1002); ERROR HY000: The target table v1 of the INSERT is not insertable-into @@ -22416,6 +22407,13 @@ ERROR HY000: The target table v1 of the UPDATE is not updatable DELETE FROM v1; ERROR HY000: The target table v1 of the DELETE is not updatable DROP VIEW v1; +CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1; +INSERT INTO v1 VALUES (1002); +ERROR HY000: The target table v1 of the INSERT is not insertable-into +UPDATE v1 SET f61=1007; +ERROR HY000: Column 'f61' is not updatable +DELETE FROM v1; +DROP VIEW v1; Drop TABLE t1, t2 ; Drop VIEW v2 ; diff --git a/mysql-test/suite/funcs_1/r/memory_views.result b/mysql-test/suite/funcs_1/r/memory_views.result index a718f986648..ddde31b76d1 100644 --- a/mysql-test/suite/funcs_1/r/memory_views.result +++ b/mysql-test/suite/funcs_1/r/memory_views.result @@ -22342,10 +22342,9 @@ SET @variant2= 'CREATE VIEW v1 AS SELECT DISTINCTROW(f61) FROM t1'; SET @variant3= 'CREATE VIEW v1 AS SELECT SUM(f59) AS f61 FROM t1'; SET @variant4= 'CREATE VIEW v1 AS SELECT f61 FROM t1 GROUP BY f61'; SET @variant5= 'CREATE VIEW v1 AS SELECT f61 FROM t1 HAVING f61 > 0'; -SET @variant6= 'CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1'; -SET @variant7= 'CREATE VIEW v1 AS SELECT f61 FROM v2'; -SET @variant8= 'CREATE VIEW v1 AS SELECT f59 AS f61 FROM t1 WHERE f60 IN (SELECT f59 FROM t1)'; -SET @variant9= 'CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1'; +SET @variant6= 'CREATE VIEW v1 AS SELECT f61 FROM v2'; +SET @variant7= 'CREATE VIEW v1 AS SELECT f59 AS f61 FROM t1 WHERE f60 IN (SELECT f59 FROM t1)'; +SET @variant8= 'CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1'; CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1; INSERT INTO v1 VALUES (1002); ERROR HY000: The target table v1 of the INSERT is not insertable-into @@ -22370,14 +22369,6 @@ ERROR HY000: The target table v1 of the UPDATE is not updatable DELETE FROM v1; ERROR HY000: The target table v1 of the DELETE is not updatable DROP VIEW v1; -CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1; -INSERT INTO v1 VALUES (1002); -ERROR HY000: The target table v1 of the INSERT is not insertable-into -UPDATE v1 SET f61=1007; -ERROR HY000: The target table v1 of the UPDATE is not updatable -DELETE FROM v1; -ERROR HY000: The target table v1 of the DELETE is not updatable -DROP VIEW v1; CREATE VIEW v1 AS SELECT f61 FROM t1 HAVING f61 > 0; INSERT INTO v1 VALUES (1002); ERROR HY000: The target table v1 of the INSERT is not insertable-into @@ -22418,6 +22409,13 @@ ERROR HY000: The target table v1 of the UPDATE is not updatable DELETE FROM v1; ERROR HY000: The target table v1 of the DELETE is not updatable DROP VIEW v1; +CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1; +INSERT INTO v1 VALUES (1002); +ERROR HY000: The target table v1 of the INSERT is not insertable-into +UPDATE v1 SET f61=1007; +ERROR HY000: Column 'f61' is not updatable +DELETE FROM v1; +DROP VIEW v1; Drop TABLE t1, t2 ; Drop VIEW v2 ; diff --git a/mysql-test/suite/funcs_1/views/views_master.inc b/mysql-test/suite/funcs_1/views/views_master.inc index bcb0662e9a4..48996a6c1a3 100644 --- a/mysql-test/suite/funcs_1/views/views_master.inc +++ b/mysql-test/suite/funcs_1/views/views_master.inc @@ -3812,16 +3812,14 @@ SET @variant3= 'CREATE VIEW v1 AS SELECT SUM(f59) AS f61 FROM t1'; SET @variant4= 'CREATE VIEW v1 AS SELECT f61 FROM t1 GROUP BY f61'; # For HAVING 3.3.2.16 SET @variant5= 'CREATE VIEW v1 AS SELECT f61 FROM t1 HAVING f61 > 0'; -# For a sub query in the select list 3.3.2.17 -SET @variant6= 'CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1'; # For a WHERE clause sub query that refers to a table also referenced in a # FROM clause 3.3.2.18 -SET @variant7= 'CREATE VIEW v1 AS SELECT f61 FROM v2'; -SET @variant8= 'CREATE VIEW v1 AS SELECT f59 AS f61 FROM t1 WHERE f60 IN (SELECT f59 FROM t1)'; +SET @variant6= 'CREATE VIEW v1 AS SELECT f61 FROM v2'; +SET @variant7= 'CREATE VIEW v1 AS SELECT f59 AS f61 FROM t1 WHERE f60 IN (SELECT f59 FROM t1)'; # For ALGORITHM = TEMPTABLE 3.3.2.20 -SET @variant9= 'CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1'; +SET @variant8= 'CREATE ALGORITHM = TEMPTABLE VIEW v1 (f61) AS select f60 from t1'; -let $num= 9; +let $num= 8; while ($num) { --disable_abort_on_error @@ -3844,6 +3842,15 @@ while ($num) DROP VIEW v1; dec $num; } +# For a sub query in the select list 3.3.2.17 +CREATE VIEW v1 AS SELECT (SELECT f60 FROM t2 WHERE f59=19) AS f61 FROM t1; +--error ER_NON_INSERTABLE_TABLE +INSERT INTO v1 VALUES (1002); +--error ER_NONUPDATEABLE_COLUMN +UPDATE v1 SET f61=1007; +# no error ER_NON_UPDATABLE_TABLE, because we can find columns for deleting +DELETE FROM v1; +DROP VIEW v1; Drop TABLE t1, t2 ; Drop VIEW v2 ; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 817da816c48..3e30f5cdbda 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -4751,4 +4751,33 @@ drop tables t1,t2; --echo # -- End of 5.3 tests. --echo # ----------------------------------------------------------------- + +--echo # some subqueries in SELECT list test +create table t1 (a int, b int); +create table t2 (a int, b int); +insert into t1 values (1,2), (3,4), (3,3), (5,6), (7,8), (9,10); +insert into t2 values (1,2), (3,4), (3,3), (5,6), (7,8), (9,10); +create algorithm=merge view v1 as select t1.a as a, (select max(b) from t2 where t1.a=t2.a) as c from t1; +explain extended +select * from v1; +select * from v1; +explain extended +select * from t2, v1 where t2.a=v1.a; +select * from t2, v1 where t2.a=v1.a; +explain extended +select * from t1, v1 where t1.a=v1.a; +select * from t1, v1 where t1.a=v1.a; +explain extended +select * from t1, v1 where t1.b=v1.c; +select * from t1, v1 where t1.b=v1.c; +explain extended +select * from t2, t1, v1 where t1.a=t2.a and t1.a=v1.a; +select * from t2, t1, v1 where t1.a=t2.a and t1.a=v1.a; + +drop view v1; +drop table t1,t2; + +--echo # ----------------------------------------------------------------- +--echo # -- End of 10.0 tests. +--echo # ----------------------------------------------------------------- SET optimizer_switch=@save_optimizer_switch; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 3c183d95b42..975f0c77349 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -2595,7 +2595,8 @@ bool LEX::can_be_merged() if (tmp_unit->first_select()->parent_lex == this && (tmp_unit->item == 0 || (tmp_unit->item->place() != IN_WHERE && - tmp_unit->item->place() != IN_ON))) + tmp_unit->item->place() != IN_ON && + tmp_unit->item->place() != SELECT_LIST))) { selects_allow_merge= 0; break;