mirror of
https://github.com/MariaDB/server.git
synced 2025-09-03 20:43:11 +03:00
The check for recursive view definitions added. (BUG#14308)
This commit is contained in:
@@ -2600,3 +2600,26 @@ id td
|
|||||||
5 2005-01-04
|
5 2005-01-04
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
create table t1 (a int);
|
||||||
|
create view v1 as select * from t1;
|
||||||
|
create view v2 as select * from v1;
|
||||||
|
drop table t1;
|
||||||
|
rename table v2 to t1;
|
||||||
|
select * from v1;
|
||||||
|
ERROR HY000: `test`.`v1` contain view recursion
|
||||||
|
drop view t1, v1;
|
||||||
|
create table t1 (a int);
|
||||||
|
create function f1() returns int
|
||||||
|
begin
|
||||||
|
declare mx int;
|
||||||
|
select max(a) from t1 into mx;
|
||||||
|
return mx;
|
||||||
|
end//
|
||||||
|
create view v1 as select f1() as a;
|
||||||
|
create view v2 as select * from v1;
|
||||||
|
drop table t1;
|
||||||
|
rename table v2 to t1;
|
||||||
|
select * from v1;
|
||||||
|
ERROR HY000: Recursive stored functions and triggers are not allowed.
|
||||||
|
drop function f1;
|
||||||
|
drop view t1, v1;
|
||||||
|
@@ -2454,3 +2454,34 @@ SELECT * FROM v1 WHERE td BETWEEN '2005.01.02' AND '2005.01.04';
|
|||||||
|
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#14308: Recursive view definitions
|
||||||
|
#
|
||||||
|
# using view only
|
||||||
|
create table t1 (a int);
|
||||||
|
create view v1 as select * from t1;
|
||||||
|
create view v2 as select * from v1;
|
||||||
|
drop table t1;
|
||||||
|
rename table v2 to t1;
|
||||||
|
-- error ER_VIEW_RECURSIVE
|
||||||
|
select * from v1;
|
||||||
|
drop view t1, v1;
|
||||||
|
# using SP function
|
||||||
|
create table t1 (a int);
|
||||||
|
delimiter //;
|
||||||
|
create function f1() returns int
|
||||||
|
begin
|
||||||
|
declare mx int;
|
||||||
|
select max(a) from t1 into mx;
|
||||||
|
return mx;
|
||||||
|
end//
|
||||||
|
delimiter ;//
|
||||||
|
create view v1 as select f1() as a;
|
||||||
|
create view v2 as select * from v1;
|
||||||
|
drop table t1;
|
||||||
|
rename table v2 to t1;
|
||||||
|
-- error ER_SP_NO_RECURSION
|
||||||
|
select * from v1;
|
||||||
|
drop function f1;
|
||||||
|
drop view t1, v1;
|
||||||
|
@@ -5613,3 +5613,5 @@ ER_SP_NO_AGGREGATE 42000
|
|||||||
eng "AGGREGATE is not supported for stored functions"
|
eng "AGGREGATE is not supported for stored functions"
|
||||||
ER_MAX_PREPARED_STMT_COUNT_REACHED 42000
|
ER_MAX_PREPARED_STMT_COUNT_REACHED 42000
|
||||||
eng "Can't create more than max_prepared_stmt_count statements (current value: %lu)"
|
eng "Can't create more than max_prepared_stmt_count statements (current value: %lu)"
|
||||||
|
ER_VIEW_RECURSIVE
|
||||||
|
eng "`%-.64s`.`%-.64s` contain view recursion"
|
||||||
|
@@ -771,6 +771,7 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table)
|
|||||||
SELECT_LEX *end, *view_select;
|
SELECT_LEX *end, *view_select;
|
||||||
LEX *old_lex, *lex;
|
LEX *old_lex, *lex;
|
||||||
Query_arena *arena, backup;
|
Query_arena *arena, backup;
|
||||||
|
TABLE_LIST *top_view= table->top_table();
|
||||||
int res;
|
int res;
|
||||||
bool result;
|
bool result;
|
||||||
DBUG_ENTER("mysql_make_view");
|
DBUG_ENTER("mysql_make_view");
|
||||||
@@ -798,6 +799,24 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table)
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check loop via view definition */
|
||||||
|
for (TABLE_LIST *precedent= table->referencing_view;
|
||||||
|
precedent;
|
||||||
|
precedent= precedent->referencing_view)
|
||||||
|
{
|
||||||
|
if (precedent->view_name.length == table->table_name_length &&
|
||||||
|
precedent->view_db.length == table->db_length &&
|
||||||
|
my_strcasecmp(system_charset_info,
|
||||||
|
precedent->view_name.str, table->table_name) == 0 &&
|
||||||
|
my_strcasecmp(system_charset_info,
|
||||||
|
precedent->view_db.str, table->db) == 0)
|
||||||
|
{
|
||||||
|
my_error(ER_VIEW_RECURSIVE, MYF(0),
|
||||||
|
top_view->view_db.str, top_view->view_name.str);
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
For now we assume that tables will not be changed during PS life (it
|
For now we assume that tables will not be changed during PS life (it
|
||||||
will be TRUE as far as we make new table cache).
|
will be TRUE as far as we make new table cache).
|
||||||
@@ -896,7 +915,6 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table)
|
|||||||
}
|
}
|
||||||
if (!res && !thd->is_fatal_error)
|
if (!res && !thd->is_fatal_error)
|
||||||
{
|
{
|
||||||
TABLE_LIST *top_view= table->top_table();
|
|
||||||
TABLE_LIST *view_tables= lex->query_tables;
|
TABLE_LIST *view_tables= lex->query_tables;
|
||||||
TABLE_LIST *view_tables_tail= 0;
|
TABLE_LIST *view_tables_tail= 0;
|
||||||
TABLE_LIST *tbl;
|
TABLE_LIST *tbl;
|
||||||
|
Reference in New Issue
Block a user