diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index fe022c5fc77..c429c45c389 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -1014,3 +1014,25 @@ p2 p4 drop view v1; drop table t1; +create table t1 (a int); +create view v1 as select a from t1; +insert into t1 values (1); +SET @v0 = '2'; +PREPARE stmt FROM 'UPDATE v1 SET a = ?'; +EXECUTE stmt USING @v0; +DEALLOCATE PREPARE stmt; +SET @v0 = '3'; +PREPARE stmt FROM 'insert into v1 values (?)'; +EXECUTE stmt USING @v0; +DEALLOCATE PREPARE stmt; +SET @v0 = '4'; +PREPARE stmt FROM 'insert into v1 (a) values (?)'; +EXECUTE stmt USING @v0; +DEALLOCATE PREPARE stmt; +select * from t1; +a +2 +3 +4 +drop view v1; +drop table t1; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index f9ff64e2e5b..cefbb599d27 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -943,3 +943,33 @@ select distinct first.col2 from t1 first where first.col2 in (select second.col2 select distinct first.col2 from v1 first where first.col2 in (select second.col2 from t1 second where second.col1<>first.col1); drop view v1; drop table t1; + +# +# Test of view updatebility in prepared statement +# +create table t1 (a int); +create view v1 as select a from t1; +insert into t1 values (1); + +#update +SET @v0 = '2'; +PREPARE stmt FROM 'UPDATE v1 SET a = ?'; +EXECUTE stmt USING @v0; +DEALLOCATE PREPARE stmt; + +#insert without field list +SET @v0 = '3'; +PREPARE stmt FROM 'insert into v1 values (?)'; +EXECUTE stmt USING @v0; +DEALLOCATE PREPARE stmt; + +#insert with field list +SET @v0 = '4'; +PREPARE stmt FROM 'insert into v1 (a) values (?)'; +EXECUTE stmt USING @v0; +DEALLOCATE PREPARE stmt; + +select * from t1; + +drop view v1; +drop table t1; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 9d9a0dd73e2..452804240b6 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -978,11 +978,19 @@ static int mysql_test_update(Prepared_statement *stmt, select->order_list.elements, (ORDER *) select->order_list.first))) { - if (setup_fields(thd, 0, table_list, - select->item_list, 1, 0, 0) || - setup_fields(thd, 0, table_list, - stmt->lex->value_list, 0, 0, 0)) - res= -1; + thd->lex->select_lex.no_wrap_view_item= 1; + if (setup_fields(thd, 0, table_list, select->item_list, 1, 0, 0)) + { + res= -1; + thd->lex->select_lex.no_wrap_view_item= 0; + } + else + { + thd->lex->select_lex.no_wrap_view_item= 0; + if (setup_fields(thd, 0, table_list, + stmt->lex->value_list, 0, 0, 0)) + res= -1; + } } stmt->lex->unit.cleanup(); }