mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
099be80130
ALTER VIEW is currently not supported as a prepared statement and should be disabled as such as they otherwise could cause server crashes. ALTER VIEW is currently not supported when called from stored procedures or functions for related reasons and should also be disabled. This patch disables these DDL statements and adjusts the appropriate test cases accordingly. Additional tests has been added to reflect on the fact that we do support CREATE/ALTER/DROP TABLE for Prepared Statements (PS), Stored Procedures (SP) and PS within SP. mysql-test/r/ps_1general.result: - Updated test to reflect on the new policy to disallow ALTER VIEW within SP. mysql-test/r/sp-dynamic.result: - Added PS ALTER TABLE test from within SP-context to demonstrate that CREATE/ALTER/DROP TABLE statements is working. - Added PS CREATE/ALTER/DROP VIEW tests from within SP-context to show that ALTER VIEW is not supported, CREATE VIEW/DROP VIEW are supported. mysql-test/r/sp-error.result: - Updated test to reflect on the new policy to disallow VIEW DDL within SP. mysql-test/t/ps_1general.test: - Updated test to reflect on the new policy to disallow VIEW DDL within SP. mysql-test/t/sp-dynamic.test: - Add PS ALTER TABLE test from within SP to demonstrate that CREATE/ALTER/DROP TABLE statements are supported. mysql-test/t/sp-error.test: - Updated test to reflect on the new policy to disallow ALTER VIEW within SP-context. - Changed error code 1314 to the more abstract ER_SP_BADSTATEMENT. sql/sql_class.h: - Added comment for clarity sql/sql_parse.cc: - Added comment for clarity sql/sql_prepare.cc: - Disallow ALTER VIEW as prepared statements until they are properly supported. Note that SQLCOM_CREATE_VIEW also handles ALTER VIEW statements. sql/sql_view.cc: - converted to doxygen comments - Added comment for clarity sql/sql_yacc.yy: - Disallow ALTER VIEW statements within a SP. If the parser is operating within the SP context, this is shown on the sp->sphead pointer. If this flag is set for view DDL operations we stop parsing with the error 'ER_SP_BAD_STATEMENT'.
391 lines
9.7 KiB
Text
391 lines
9.7 KiB
Text
drop procedure if exists p1|
|
|
drop procedure if exists p2|
|
|
create procedure p1()
|
|
begin
|
|
prepare stmt from "select 1";
|
|
execute stmt;
|
|
execute stmt;
|
|
execute stmt;
|
|
deallocate prepare stmt;
|
|
end|
|
|
call p1()|
|
|
1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
call p1()|
|
|
1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
call p1()|
|
|
1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
1
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
execute stmt;
|
|
end|
|
|
prepare stmt from "call p1()"|
|
|
set @SAVE_SP_RECURSION_LEVELS=@@max_sp_recursion_depth|
|
|
set @@max_sp_recursion_depth=100|
|
|
execute stmt|
|
|
ERROR HY000: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner
|
|
execute stmt|
|
|
ERROR HY000: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner
|
|
execute stmt|
|
|
ERROR HY000: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner
|
|
call p1()|
|
|
ERROR HY000: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner
|
|
call p1()|
|
|
ERROR HY000: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner
|
|
call p1()|
|
|
ERROR HY000: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner
|
|
set @@max_sp_recursion_depth=@SAVE_SP_RECURSION_LEVELS|
|
|
call p1()|
|
|
ERROR HY000: Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine p1
|
|
call p1()|
|
|
ERROR HY000: Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine p1
|
|
call p1()|
|
|
ERROR HY000: Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine p1
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
prepare stmt from "create procedure p2() begin select 1; end";
|
|
execute stmt;
|
|
deallocate prepare stmt;
|
|
end|
|
|
call p1()|
|
|
ERROR HY000: This command is not supported in the prepared statement protocol yet
|
|
call p1()|
|
|
ERROR HY000: This command is not supported in the prepared statement protocol yet
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
prepare stmt from "drop procedure p2";
|
|
execute stmt;
|
|
deallocate prepare stmt;
|
|
end|
|
|
call p1()|
|
|
ERROR HY000: This command is not supported in the prepared statement protocol yet
|
|
call p1()|
|
|
ERROR HY000: This command is not supported in the prepared statement protocol yet
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
prepare stmt_drop from "drop table if exists t1";
|
|
execute stmt_drop;
|
|
prepare stmt from "create table t1 (a int)";
|
|
execute stmt;
|
|
insert into t1 (a) values (1);
|
|
select * from t1;
|
|
prepare stmt_alter from "alter table t1 add (b int)";
|
|
execute stmt_alter;
|
|
insert into t1 (a,b) values (2,1);
|
|
deallocate prepare stmt_alter;
|
|
deallocate prepare stmt;
|
|
deallocate prepare stmt_drop;
|
|
end|
|
|
call p1()|
|
|
a
|
|
1
|
|
Warnings:
|
|
Note 1051 Unknown table 't1'
|
|
call p1()|
|
|
a
|
|
1
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
set @tab_name=concat("tab_", replace(curdate(), '-', '_'));
|
|
set @drop_sql=concat("drop table if exists ", @tab_name);
|
|
set @create_sql=concat("create table ", @tab_name, " (a int)");
|
|
set @insert_sql=concat("insert into ", @tab_name, " values (1), (2), (3)");
|
|
set @select_sql=concat("select * from ", @tab_name);
|
|
select @tab_name;
|
|
select @drop_sql;
|
|
select @create_sql;
|
|
select @insert_sql;
|
|
select @select_sql;
|
|
prepare stmt_drop from @drop_sql;
|
|
execute stmt_drop;
|
|
prepare stmt from @create_sql;
|
|
execute stmt;
|
|
prepare stmt from @insert_sql;
|
|
execute stmt;
|
|
prepare stmt from @select_sql;
|
|
execute stmt;
|
|
execute stmt_drop;
|
|
deallocate prepare stmt;
|
|
deallocate prepare stmt_drop;
|
|
end|
|
|
call p1()|
|
|
call p1()|
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
prepare stmt_drop from "drop table if exists t1";
|
|
execute stmt_drop;
|
|
prepare stmt from "create table t1 (a int)";
|
|
execute stmt;
|
|
deallocate prepare stmt;
|
|
deallocate prepare stmt_drop;
|
|
end|
|
|
drop function if exists f1|
|
|
create function f1(a int) returns int
|
|
begin
|
|
call p1();
|
|
return 1;
|
|
end|
|
|
select f1(0)|
|
|
ERROR 0A000: Dynamic SQL is not allowed in stored function or trigger
|
|
select f1(f1(0))|
|
|
ERROR 0A000: Dynamic SQL is not allowed in stored function or trigger
|
|
select f1(f1(f1(0)))|
|
|
ERROR 0A000: Dynamic SQL is not allowed in stored function or trigger
|
|
drop function f1|
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
drop table if exists t1;
|
|
create table t1 (id integer not null primary key,
|
|
name varchar(20) not null);
|
|
insert into t1 (id, name) values (1, 'aaa'), (2, 'bbb'), (3, 'ccc');
|
|
prepare stmt from "select name from t1";
|
|
execute stmt;
|
|
select name from t1;
|
|
execute stmt;
|
|
prepare stmt from
|
|
"select name from t1 where name=(select name from t1 where id=2)";
|
|
execute stmt;
|
|
select name from t1 where name=(select name from t1 where id=2);
|
|
execute stmt;
|
|
end|
|
|
call p1()|
|
|
name
|
|
aaa
|
|
bbb
|
|
ccc
|
|
name
|
|
aaa
|
|
bbb
|
|
ccc
|
|
name
|
|
aaa
|
|
bbb
|
|
ccc
|
|
name
|
|
bbb
|
|
name
|
|
bbb
|
|
name
|
|
bbb
|
|
call p1()|
|
|
name
|
|
aaa
|
|
bbb
|
|
ccc
|
|
name
|
|
aaa
|
|
bbb
|
|
ccc
|
|
name
|
|
aaa
|
|
bbb
|
|
ccc
|
|
name
|
|
bbb
|
|
name
|
|
bbb
|
|
name
|
|
bbb
|
|
drop procedure p1|
|
|
prepare stmt from "select * from t1"|
|
|
create procedure p1()
|
|
begin
|
|
execute stmt;
|
|
deallocate prepare stmt;
|
|
end|
|
|
call p1()|
|
|
id name
|
|
1 aaa
|
|
2 bbb
|
|
3 ccc
|
|
call p1()|
|
|
ERROR HY000: Unknown prepared statement handler (stmt) given to EXECUTE
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
declare a char(10);
|
|
set a="sp-variable";
|
|
set @a="mysql-variable";
|
|
prepare stmt from "select 'dynamic sql:', @a, a";
|
|
execute stmt;
|
|
end|
|
|
call p1()|
|
|
ERROR 42S22: Unknown column 'a' in 'field list'
|
|
call p1()|
|
|
ERROR 42S22: Unknown column 'a' in 'field list'
|
|
drop procedure p1|
|
|
create procedure p1()
|
|
begin
|
|
prepare stmt from 'select ? as a';
|
|
execute stmt using @a;
|
|
end|
|
|
set @a=1|
|
|
call p1()|
|
|
a
|
|
1
|
|
call p1()|
|
|
a
|
|
1
|
|
drop procedure p1|
|
|
drop table if exists t1|
|
|
drop table if exists t2|
|
|
Warnings:
|
|
Note 1051 Unknown table 't2'
|
|
create table t1 (id integer primary key auto_increment,
|
|
stmt_text char(35), status varchar(20))|
|
|
insert into t1 (stmt_text) values
|
|
("select 1"), ("flush tables"), ("handler t1 open as ha"),
|
|
("analyze table t1"), ("check table t1"), ("checksum table t1"),
|
|
("check table t1"), ("optimize table t1"), ("repair table t1"),
|
|
("describe extended select * from t1"),
|
|
("help help"), ("show databases"), ("show tables"),
|
|
("show table status"), ("show open tables"), ("show storage engines"),
|
|
("insert into t1 (id) values (1)"), ("update t1 set status=''"),
|
|
("delete from t1"), ("truncate t1"), ("call p1()"), ("foo bar"),
|
|
("create view v1 as select 1"), ("alter view v1 as select 2"),
|
|
("drop view v1"),("create table t2 (a int)"),("alter table t2 add (b int)"),
|
|
("drop table t2")|
|
|
create procedure p1()
|
|
begin
|
|
declare v_stmt_text varchar(255);
|
|
declare v_id integer;
|
|
declare done int default 0;
|
|
declare c cursor for select id, stmt_text from t1;
|
|
declare continue handler for 1295 -- ER_UNSUPPORTED_PS
|
|
set @status='not supported';
|
|
declare continue handler for 1064 -- ER_SYNTAX_ERROR
|
|
set @status='syntax error';
|
|
declare continue handler for sqlstate '02000' set done = 1;
|
|
prepare update_stmt from "update t1 set status=? where id=?";
|
|
open c;
|
|
repeat
|
|
if not done then
|
|
fetch c into v_id, v_stmt_text;
|
|
set @id=v_id, @stmt_text=v_stmt_text;
|
|
set @status="supported";
|
|
prepare stmt from @stmt_text;
|
|
execute update_stmt using @status, @id;
|
|
end if;
|
|
until done end repeat;
|
|
deallocate prepare update_stmt;
|
|
end|
|
|
call p1()|
|
|
select * from t1|
|
|
id stmt_text status
|
|
1 select 1 supported
|
|
2 flush tables not supported
|
|
3 handler t1 open as ha not supported
|
|
4 analyze table t1 supported
|
|
5 check table t1 not supported
|
|
6 checksum table t1 not supported
|
|
7 check table t1 not supported
|
|
8 optimize table t1 supported
|
|
9 repair table t1 supported
|
|
10 describe extended select * from t1 supported
|
|
11 help help not supported
|
|
12 show databases supported
|
|
13 show tables supported
|
|
14 show table status supported
|
|
15 show open tables supported
|
|
16 show storage engines supported
|
|
17 insert into t1 (id) values (1) supported
|
|
18 update t1 set status='' supported
|
|
19 delete from t1 supported
|
|
20 truncate t1 supported
|
|
21 call p1() supported
|
|
22 foo bar syntax error
|
|
23 create view v1 as select 1 supported
|
|
24 alter view v1 as select 2 not supported
|
|
25 drop view v1 supported
|
|
26 create table t2 (a int) supported
|
|
27 alter table t2 add (b int) supported
|
|
28 drop table t2 supported
|
|
drop procedure p1|
|
|
drop table t1|
|
|
prepare stmt from 'select 1'|
|
|
create procedure p1() execute stmt|
|
|
call p1()|
|
|
1
|
|
1
|
|
call p1()|
|
|
1
|
|
1
|
|
drop procedure p1|
|
|
create function f1() returns int
|
|
begin
|
|
deallocate prepare stmt;
|
|
return 1;
|
|
end|
|
|
ERROR 0A000: Dynamic SQL is not allowed in stored function or trigger
|
|
create procedure p1()
|
|
begin
|
|
prepare stmt from 'select 1 A';
|
|
execute stmt;
|
|
end|
|
|
prepare stmt from 'call p1()'|
|
|
execute stmt|
|
|
ERROR HY000: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner
|
|
execute stmt|
|
|
ERROR HY000: The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner
|
|
drop procedure p1|
|
|
drop table if exists t1, t2|
|
|
create procedure p1 (a int) language sql deterministic
|
|
begin
|
|
declare rsql varchar(100);
|
|
drop table if exists t1, t2;
|
|
set @rsql= "create table t1 (a int)";
|
|
select @rsql;
|
|
prepare pst from @rsql;
|
|
execute pst;
|
|
set @rsql= null;
|
|
set @rsql= "create table t2 (a int)";
|
|
select @rsql;
|
|
prepare pst from @rsql;
|
|
execute pst;
|
|
drop table if exists t1, t2;
|
|
end|
|
|
set @a:=0|
|
|
call p1(@a)|
|
|
@rsql
|
|
create table t1 (a int)
|
|
@rsql
|
|
create table t2 (a int)
|
|
Warnings:
|
|
Note 1051 Unknown table 't1'
|
|
Note 1051 Unknown table 't2'
|
|
select @a|
|
|
@a
|
|
0
|
|
call p1(@a)|
|
|
@rsql
|
|
create table t1 (a int)
|
|
@rsql
|
|
create table t2 (a int)
|
|
Warnings:
|
|
Note 1051 Unknown table 't1'
|
|
Note 1051 Unknown table 't2'
|
|
select @a|
|
|
@a
|
|
0
|
|
drop procedure if exists p1|
|