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);
   }