diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index a5cdee4b1bf..97d6d15f7d9 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -3057,4 +3057,12 @@ yes yes drop procedure bug7293| delete from t1| +drop procedure if exists bug9841| +drop view if exists v1| +create view v1 as select * from t1, t2 where id = s| +create procedure bug9841 () +update v1 set data = 10| +call bug9841()| +drop view v1| +drop procedure bug9841| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 2e45d1c6cd1..77fe5ab7601 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3741,6 +3741,25 @@ call bug7293 ('secrete')| drop procedure bug7293| delete from t1| + +# +# BUG#9841: Unexpected read lock when trying to update a view in a +# stored procedure +# +--disable_warnings +drop procedure if exists bug9841| +drop view if exists v1| +--enable_warnings + +create view v1 as select * from t1, t2 where id = s| +create procedure bug9841 () + update v1 set data = 10| +call bug9841()| + +drop view v1| +drop procedure bug9841| + + # # BUG#NNNN: New bug synopsis # diff --git a/sql/sql_view.cc b/sql/sql_view.cc index ce08763015f..15a8f52af20 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -716,6 +716,16 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table) table->next_global= view_tables; } + /* + Let us set proper lock type for tables of the view's main select + since we may want to perform update or insert on view. This won't + work for view containing union. But this is ok since we don't + allow insert and update on such views anyway. + */ + if (!lex->select_lex.next_select()) + for (tbl= lex->select_lex.get_table_list(); tbl; tbl= tbl->next_local) + tbl->lock_type= table->lock_type; + /* If we are opening this view as part of implicit LOCK TABLES, then this view serves as simple placeholder and we should not continue @@ -756,23 +766,14 @@ mysql_make_view(File_parser *parser, TABLE_LIST *table) table->ancestor= view_tables; /* - Process upper level tables of view. As far as we do noy suport union - here we can go through local tables of view most upper SELECT + Tables of the main select of the view should be marked as belonging + to the same select as original view (again we can use LEX::select_lex + for this purprose because we don't support MERGE algorithm for views + with unions). */ - for(tbl= view_tables; - tbl; - tbl= tbl->next_local) - { - /* next table should include SELECT_LEX under this table SELECT_LEX */ + for (tbl= lex->select_lex.get_table_list(); tbl; tbl= tbl->next_local) tbl->select_lex= table->select_lex; - /* - move lock type (TODO: should we issue error in case of TMPTABLE - algorithm and non-read locking)? - */ - tbl->lock_type= table->lock_type; - } - /* multi table view */ if (view_tables->next_local) {