Loading mysql-test/r/view.result +15 −0 Original line number Diff line number Diff line Loading @@ -2424,3 +2424,18 @@ f1 sum(f2) NULL 12 drop view v1; drop table t1; CREATE VIEW v1 AS SELECT 42 AS Meaning; DROP FUNCTION IF EXISTS f1; CREATE FUNCTION f1() RETURNS INTEGER BEGIN DECLARE retn INTEGER; SELECT Meaning FROM v1 INTO retn; RETURN retn; END // CREATE VIEW v2 AS SELECT f1(); select * from v2; f1() 42 drop view v2,v1; drop function f1; mysql-test/t/view.test +21 −0 Original line number Diff line number Diff line Loading @@ -2280,3 +2280,24 @@ create view v1 as select * from t1; select f1, sum(f2) from v1 group by f1; drop view v1; drop table t1; # # BUG#15096: using function with view for view creation # CREATE VIEW v1 AS SELECT 42 AS Meaning; --disable_warnings DROP FUNCTION IF EXISTS f1; --enable_warnings DELIMITER //; CREATE FUNCTION f1() RETURNS INTEGER BEGIN DECLARE retn INTEGER; SELECT Meaning FROM v1 INTO retn; RETURN retn; END // DELIMITER ;// CREATE VIEW v2 AS SELECT f1(); select * from v2; drop view v2,v1; drop function f1; sql/sql_view.cc +22 −13 Original line number Diff line number Diff line Loading @@ -350,15 +350,6 @@ bool mysql_create_view(THD *thd, */ for (tbl= lex->query_tables; tbl; tbl= tbl->next_global) { /* is this table temporary and is not view? */ if (tbl->table->s->tmp_table != NO_TMP_TABLE && !tbl->view && !tbl->schema_table) { my_error(ER_VIEW_SELECT_TMPTABLE, MYF(0), tbl->alias); res= TRUE; goto err; } /* is this table view and the same view which we creates now? */ if (tbl->view && strcmp(tbl->view_db.str, view->db) == 0 && Loading @@ -369,6 +360,23 @@ bool mysql_create_view(THD *thd, goto err; } /* tbl->table can be NULL when tbl is a placeholder for a view that is indirectly referenced via a stored function from the view being created. We don't check these indirectly referenced views in CREATE VIEW so they don't have table object. */ if (tbl->table) { /* is this table temporary and is not view? */ if (tbl->table->s->tmp_table != NO_TMP_TABLE && !tbl->view && !tbl->schema_table) { my_error(ER_VIEW_SELECT_TMPTABLE, MYF(0), tbl->alias); res= TRUE; goto err; } /* Copy the privileges of the underlying VIEWs which were filled by fill_effective_table_privileges Loading @@ -376,6 +384,7 @@ bool mysql_create_view(THD *thd, */ tbl->table->grant.privilege= tbl->grant.privilege; } } /* prepare select to resolve all fields */ lex->view_prepare_mode= 1; Loading Loading
mysql-test/r/view.result +15 −0 Original line number Diff line number Diff line Loading @@ -2424,3 +2424,18 @@ f1 sum(f2) NULL 12 drop view v1; drop table t1; CREATE VIEW v1 AS SELECT 42 AS Meaning; DROP FUNCTION IF EXISTS f1; CREATE FUNCTION f1() RETURNS INTEGER BEGIN DECLARE retn INTEGER; SELECT Meaning FROM v1 INTO retn; RETURN retn; END // CREATE VIEW v2 AS SELECT f1(); select * from v2; f1() 42 drop view v2,v1; drop function f1;
mysql-test/t/view.test +21 −0 Original line number Diff line number Diff line Loading @@ -2280,3 +2280,24 @@ create view v1 as select * from t1; select f1, sum(f2) from v1 group by f1; drop view v1; drop table t1; # # BUG#15096: using function with view for view creation # CREATE VIEW v1 AS SELECT 42 AS Meaning; --disable_warnings DROP FUNCTION IF EXISTS f1; --enable_warnings DELIMITER //; CREATE FUNCTION f1() RETURNS INTEGER BEGIN DECLARE retn INTEGER; SELECT Meaning FROM v1 INTO retn; RETURN retn; END // DELIMITER ;// CREATE VIEW v2 AS SELECT f1(); select * from v2; drop view v2,v1; drop function f1;
sql/sql_view.cc +22 −13 Original line number Diff line number Diff line Loading @@ -350,15 +350,6 @@ bool mysql_create_view(THD *thd, */ for (tbl= lex->query_tables; tbl; tbl= tbl->next_global) { /* is this table temporary and is not view? */ if (tbl->table->s->tmp_table != NO_TMP_TABLE && !tbl->view && !tbl->schema_table) { my_error(ER_VIEW_SELECT_TMPTABLE, MYF(0), tbl->alias); res= TRUE; goto err; } /* is this table view and the same view which we creates now? */ if (tbl->view && strcmp(tbl->view_db.str, view->db) == 0 && Loading @@ -369,6 +360,23 @@ bool mysql_create_view(THD *thd, goto err; } /* tbl->table can be NULL when tbl is a placeholder for a view that is indirectly referenced via a stored function from the view being created. We don't check these indirectly referenced views in CREATE VIEW so they don't have table object. */ if (tbl->table) { /* is this table temporary and is not view? */ if (tbl->table->s->tmp_table != NO_TMP_TABLE && !tbl->view && !tbl->schema_table) { my_error(ER_VIEW_SELECT_TMPTABLE, MYF(0), tbl->alias); res= TRUE; goto err; } /* Copy the privileges of the underlying VIEWs which were filled by fill_effective_table_privileges Loading @@ -376,6 +384,7 @@ bool mysql_create_view(THD *thd, */ tbl->table->grant.privilege= tbl->grant.privilege; } } /* prepare select to resolve all fields */ lex->view_prepare_mode= 1; Loading