diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 2b9d8d9165393b9e2e2ab4a61b6cffc8c1f743b6..2551977200e183c58dec060f32699e71e37db862 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -1288,3 +1288,26 @@ handler v1 open as xx; ERROR HY000: 'test.v1' is not BASE TABLE drop view v1; drop table t1; +create table t1(a int); +insert into t1 values (0), (1), (2), (3); +create table t2 (a int); +insert into t2 select a from t1 where a > 1; +create view v1 as select a from t1 where a > 1; +select * from t1 left join (t2 as t, v1) on v1.a=t1.a; +a a a +0 NULL NULL +1 NULL NULL +2 2 2 +2 3 2 +3 2 3 +3 3 3 +select * from t1 left join (t2 as t, t2) on t2.a=t1.a; +a a a +0 NULL NULL +1 NULL NULL +2 2 2 +2 3 2 +3 2 3 +3 3 3 +drop view v1; +drop table t1; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 174572198b529e519c8816f1813f22fa1b38d6ad..682646a6c02b6661342c0cfac8f5ade979b78a51 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -1258,3 +1258,16 @@ create view v1 as select * from t1; handler v1 open as xx; drop view v1; drop table t1; + +# +# view with WHERE in nested join +# +create table t1(a int); +insert into t1 values (0), (1), (2), (3); +create table t2 (a int); +insert into t2 select a from t1 where a > 1; +create view v1 as select a from t1 where a > 1; +select * from t1 left join (t2 as t, v1) on v1.a=t1.a; +select * from t1 left join (t2 as t, t2) on t2.a=t1.a; +drop view v1; +drop table t1; diff --git a/scripts/mysql_fix_privilege_tables.sql b/scripts/mysql_fix_privilege_tables.sql index 18dfe14bc45a22b79e51a66258e66de821480404..5b335862584b360848424f3630e2c504ae6a26f2 100644 --- a/scripts/mysql_fix_privilege_tables.sql +++ b/scripts/mysql_fix_privilege_tables.sql @@ -144,6 +144,13 @@ alter table user comment='Users and global privileges'; alter table func comment='User defined functions'; alter table tables_priv comment='Table privileges'; alter table columns_priv comment='Column privileges'; + +# +# Detect whether we had Create_view_priv +# +SET @hadCreateViewPriv:=0; +SELECT @hadCreateViewPriv:=1 FROM user WHERE Create_view_priv LIKE '%'; + # # Create VIEWs privileges (v5.0) # @@ -158,6 +165,11 @@ ALTER TABLE db ADD Show_view_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Creat ALTER TABLE host ADD Show_view_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Create_view_priv; ALTER TABLE user ADD Show_view_priv enum('N','Y') DEFAULT 'N' NOT NULL AFTER Create_view_priv; +# +# Assign create/show view privileges to people who have create provileges +# +UPDATE user SET Create_view_priv=Create_priv, Show_view_priv=Create_priv where user<>"" AND @hadCreateViewPriv = 0; + # # Create some possible missing tables # diff --git a/sql/table.cc b/sql/table.cc index 0091336363591504562d93e6481fdc16c7da65f4..e6b84a5acb05b390710fdf7c4b98c7e32cfa3fbe 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1583,6 +1583,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds) if (where) { Item_arena *arena= thd->current_arena, backup; + TABLE_LIST *tbl= this; if (arena->is_conventional()) arena= 0; // For easier test @@ -1591,17 +1592,23 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds) if (arena) thd->set_n_backup_item_arena(arena, &backup); - if (outer_join) + + /* Go up to join tree and try to find left join */ + for (; tbl; tbl= tbl->embedding) { - /* - Store WHERE condition to ON expression for outer join, because we - can't use WHERE to correctly execute jeft joins on VIEWs and this - expression will not be moved to WHERE condition (i.e. will be clean - correctly for PS/SP) - */ - on_expr= and_conds(on_expr, where); + if (tbl->outer_join) + { + /* + Store WHERE condition to ON expression for outer join, because we + can't use WHERE to correctly execute jeft joins on VIEWs and this + expression will not be moved to WHERE condition (i.e. will be clean + correctly for PS/SP) + */ + tbl->on_expr= and_conds(tbl->on_expr, where); + break; + } } - else + if (tbl == 0) { /* It is conds of JOIN, but it will be stored in st_select_lex::prep_where @@ -1609,6 +1616,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds) */ *conds= and_conds(*conds, where); } + if (arena) thd->restore_backup_item_arena(arena, &backup); }