mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
3f24932124
Collect all tables and SPs refered by a statement, and open all tables with an implicit LOCK TABLES. Do find things refered by triggers and views, we open them first (and then repeat this until nothing new is found), before doing the actual lock tables. mysql-test/r/information_schema.result: Updated result for WL#2130. mysql-test/r/lock.result: Updated result for WL#2130. mysql-test/r/sp-error.result: Updated result for WL#2130. mysql-test/r/sp.result: Updated result for WL#2130. mysql-test/r/view.result: Updated result for WL#2130. mysql-test/t/information_schema.test: Disabled one test case due to a bug involving LOCK TABLES, which shows up with WL#2130. mysql-test/t/lock.test: New error message with WL#2130. This change is under debate and might change in the future, but will do for now. mysql-test/t/sp-error.test: Updated for WL#2130. Some tests are voided when table access does work from functions. mysql-test/t/sp.test: Updated for WL#2130. mysql-test/t/view.test: Updated for WL#2130. sql/item_func.cc: We now have to set net.no_send_ok for functions too, with WL#2130. sql/share/errmsg.txt: Reused an error code since the old use was voided by WL#2130, but a new one was needed instead (similar, but more specific restriction). sql/sp.cc: Fixed error handling and collection of used tables for WL#2130. sql/sp.h: Fixed error handling and collection of used tables for WL#2130. sql/sp_head.cc: Added support functions for collecting and merging hash tables and lists of used tables from SPs and substatements, for WL#2130. sql/sp_head.h: Added support functions for collecting and merging hash tables and lists of used tables from SPs and substatements, for WL#2130. sql/sql_base.cc: Changed the way table->query_id is tested and set during with locked tables in effect. This makes some SP test cases work with WL#2130, but has a side effect on some error cases with explicit LOCK TABLES. It's still debated if this is the correct way, so it might change. sql/sql_class.h: Added flags for circumventing some interference between WL#2130 and mysql_make_view(). sql/sql_derived.cc: Added some missing initializations. (Potential bugs.) sql/sql_lex.cc: Clear the new hash tables for WL#2130. sql/sql_lex.h: Added hash tables for procedures and tables too (as for functions), for WL#2130. sql/sql_parse.cc: WL#2130: Make table accesses from stored functions work by adding an implicit LOCK TABLES around (most) executed statements. To do this, we have to go through a loop where we collect all SPs and tables in mysql_execute_statement. sql/sql_prepare.cc: Cache both functions and procedures for WL#2130. sql/sql_show.cc: Added some missing initializations. (Potential bugs.) sql/sql_view.cc: Shortcut mysql_make_view() if thd->shortcut_make_view is true during the pre-open phase for collecting tables in WL#2130. Otherwise, the similar mechanism here causes interference. sql/sql_yacc.yy: For WL#2130, added caching of procedures and disallowed LOCK/UNLOCK TABLES in SPs.
469 lines
11 KiB
Text
469 lines
11 KiB
Text
delete from mysql.proc;
|
|
create procedure syntaxerror(t int)|
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
|
|
create procedure syntaxerror(t int)|
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
|
|
create procedure syntaxerror(t int)|
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
|
|
drop table if exists t3|
|
|
create table t3 ( x int )|
|
|
insert into t3 values (2), (3)|
|
|
create procedure bad_into(out param int)
|
|
select x from t3 into param|
|
|
call bad_into(@x)|
|
|
ERROR 42000: Result consisted of more than one row
|
|
drop procedure bad_into|
|
|
drop table t3|
|
|
create procedure proc1()
|
|
set @x = 42|
|
|
create function func1() returns int
|
|
return 42|
|
|
create procedure foo()
|
|
create procedure bar() set @x=3|
|
|
ERROR 2F003: Can't create a PROCEDURE from within another stored routine
|
|
create procedure foo()
|
|
create function bar() returns double return 2.3|
|
|
ERROR 2F003: Can't create a FUNCTION from within another stored routine
|
|
create procedure proc1()
|
|
set @x = 42|
|
|
ERROR 42000: PROCEDURE proc1 already exists
|
|
create function func1() returns int
|
|
return 42|
|
|
ERROR 42000: FUNCTION func1 already exists
|
|
drop procedure proc1|
|
|
drop function func1|
|
|
alter procedure foo|
|
|
ERROR 42000: PROCEDURE test.foo does not exist
|
|
alter function foo|
|
|
ERROR 42000: FUNCTION test.foo does not exist
|
|
drop procedure foo|
|
|
ERROR 42000: PROCEDURE test.foo does not exist
|
|
drop function foo|
|
|
ERROR 42000: FUNCTION test.foo does not exist
|
|
call foo()|
|
|
ERROR 42000: PROCEDURE test.foo does not exist
|
|
drop procedure if exists foo|
|
|
Warnings:
|
|
Note 1305 PROCEDURE foo does not exist
|
|
show create procedure foo|
|
|
ERROR 42000: PROCEDURE foo does not exist
|
|
show create function foo|
|
|
ERROR 42000: FUNCTION foo does not exist
|
|
create procedure foo()
|
|
foo: loop
|
|
leave bar;
|
|
end loop|
|
|
ERROR 42000: LEAVE with no matching label: bar
|
|
create procedure foo()
|
|
foo: loop
|
|
iterate bar;
|
|
end loop|
|
|
ERROR 42000: ITERATE with no matching label: bar
|
|
create procedure foo()
|
|
foo: begin
|
|
iterate foo;
|
|
end|
|
|
ERROR 42000: ITERATE with no matching label: foo
|
|
create procedure foo()
|
|
begin
|
|
goto foo;
|
|
end|
|
|
ERROR 42000: GOTO with no matching label: foo
|
|
create procedure foo()
|
|
begin
|
|
begin
|
|
label foo;
|
|
end;
|
|
goto foo;
|
|
end|
|
|
ERROR 42000: GOTO with no matching label: foo
|
|
create procedure foo()
|
|
begin
|
|
goto foo;
|
|
begin
|
|
label foo;
|
|
end;
|
|
end|
|
|
ERROR 42000: GOTO with no matching label: foo
|
|
create procedure foo()
|
|
begin
|
|
begin
|
|
goto foo;
|
|
end;
|
|
begin
|
|
label foo;
|
|
end;
|
|
end|
|
|
ERROR 42000: GOTO with no matching label: foo
|
|
create procedure foo()
|
|
begin
|
|
begin
|
|
label foo;
|
|
end;
|
|
begin
|
|
goto foo;
|
|
end;
|
|
end|
|
|
ERROR 42000: GOTO with no matching label: foo
|
|
create procedure foo()
|
|
foo: loop
|
|
foo: loop
|
|
set @x=2;
|
|
end loop foo;
|
|
end loop foo|
|
|
ERROR 42000: Redefining label foo
|
|
create procedure foo()
|
|
foo: loop
|
|
set @x=2;
|
|
end loop bar|
|
|
ERROR 42000: End-label bar without match
|
|
create procedure foo()
|
|
return 42|
|
|
ERROR 42000: RETURN is only allowed in a FUNCTION
|
|
create procedure p(x int)
|
|
set @x = x|
|
|
create function f(x int) returns int
|
|
return x+42|
|
|
call p()|
|
|
ERROR 42000: Incorrect number of arguments for PROCEDURE p; expected 1, got 0
|
|
call p(1, 2)|
|
|
ERROR 42000: Incorrect number of arguments for PROCEDURE p; expected 1, got 2
|
|
select f()|
|
|
ERROR 42000: Incorrect number of arguments for FUNCTION f; expected 1, got 0
|
|
select f(1, 2)|
|
|
ERROR 42000: Incorrect number of arguments for FUNCTION f; expected 1, got 2
|
|
drop procedure p|
|
|
drop function f|
|
|
create procedure p(val int, out res int)
|
|
begin
|
|
declare x int default 0;
|
|
declare continue handler for foo set x = 1;
|
|
insert into test.t1 values (val);
|
|
if (x) then
|
|
set res = 0;
|
|
else
|
|
set res = 1;
|
|
end if;
|
|
end|
|
|
ERROR 42000: Undefined CONDITION: foo
|
|
create procedure p(val int, out res int)
|
|
begin
|
|
declare x int default 0;
|
|
declare foo condition for 1146;
|
|
declare continue handler for bar set x = 1;
|
|
insert into test.t1 values (val);
|
|
if (x) then
|
|
set res = 0;
|
|
else
|
|
set res = 1;
|
|
end if;
|
|
end|
|
|
ERROR 42000: Undefined CONDITION: bar
|
|
create function f(val int) returns int
|
|
begin
|
|
declare x int;
|
|
set x = val+3;
|
|
end|
|
|
ERROR 42000: No RETURN found in FUNCTION f
|
|
create function f(val int) returns int
|
|
begin
|
|
declare x int;
|
|
set x = val+3;
|
|
if x < 4 then
|
|
return x;
|
|
end if;
|
|
end|
|
|
select f(10)|
|
|
ERROR 2F005: FUNCTION f ended without RETURN
|
|
drop function f|
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for insert into test.t1 values ("foo", 42);
|
|
open c;
|
|
close c;
|
|
end|
|
|
ERROR 42000: Cursor statement must be a SELECT
|
|
create procedure p()
|
|
begin
|
|
declare x int;
|
|
declare c cursor for select * into x from test.t limit 1;
|
|
open c;
|
|
close c;
|
|
end|
|
|
ERROR 42000: Cursor SELECT must not have INTO
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from test.t;
|
|
open cc;
|
|
close c;
|
|
end|
|
|
ERROR 42000: Undefined CURSOR: cc
|
|
drop table if exists t1|
|
|
create table t1 (val int)|
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from test.t1;
|
|
open c;
|
|
open c;
|
|
close c;
|
|
end|
|
|
call p()|
|
|
ERROR 24000: Cursor is already open
|
|
drop procedure p|
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from test.t1;
|
|
open c;
|
|
close c;
|
|
close c;
|
|
end|
|
|
call p()|
|
|
ERROR 24000: Cursor is not open
|
|
drop procedure p|
|
|
alter procedure bar3 sql security invoker|
|
|
ERROR 42000: PROCEDURE test.bar3 does not exist
|
|
drop table t1|
|
|
drop table if exists t1|
|
|
create table t1 (val int, x float)|
|
|
insert into t1 values (42, 3.1), (19, 1.2)|
|
|
create procedure p()
|
|
begin
|
|
declare x int;
|
|
declare c cursor for select * from t1;
|
|
open c;
|
|
fetch c into x, y;
|
|
close c;
|
|
end|
|
|
ERROR 42000: Undeclared variable: y
|
|
create procedure p()
|
|
begin
|
|
declare x int;
|
|
declare c cursor for select * from t1;
|
|
open c;
|
|
fetch c into x;
|
|
close c;
|
|
end|
|
|
call p()|
|
|
ERROR HY000: Incorrect number of FETCH variables
|
|
drop procedure p|
|
|
create procedure p()
|
|
begin
|
|
declare x int;
|
|
declare y float;
|
|
declare z int;
|
|
declare c cursor for select * from t1;
|
|
open c;
|
|
fetch c into x, y, z;
|
|
close c;
|
|
end|
|
|
call p()|
|
|
ERROR HY000: Incorrect number of FETCH variables
|
|
drop procedure p|
|
|
create procedure p(in x int, x char(10))
|
|
begin
|
|
end|
|
|
ERROR 42000: Duplicate parameter: x
|
|
create function p(x int, x char(10))
|
|
begin
|
|
end|
|
|
ERROR 42000: Duplicate parameter: x
|
|
create procedure p()
|
|
begin
|
|
declare x float;
|
|
declare x int;
|
|
end|
|
|
ERROR 42000: Duplicate variable: x
|
|
create procedure p()
|
|
begin
|
|
declare c condition for 1064;
|
|
declare c condition for 1065;
|
|
end|
|
|
ERROR 42000: Duplicate condition: c
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from t1;
|
|
declare c cursor for select field from t1;
|
|
end|
|
|
ERROR 42000: Duplicate cursor: c
|
|
create procedure u()
|
|
use sptmp|
|
|
ERROR 42000: USE is not allowed in a stored procedure
|
|
create procedure p()
|
|
begin
|
|
declare c cursor for select * from t1;
|
|
declare x int;
|
|
end|
|
|
ERROR 42000: Variable or condition declaration after cursor or handler declaration
|
|
create procedure p()
|
|
begin
|
|
declare x int;
|
|
declare continue handler for sqlstate '42S99' set x = 1;
|
|
declare foo condition for sqlstate '42S99';
|
|
end|
|
|
ERROR 42000: Variable or condition declaration after cursor or handler declaration
|
|
create procedure p()
|
|
begin
|
|
declare x int;
|
|
declare continue handler for sqlstate '42S99' set x = 1;
|
|
declare c cursor for select * from t1;
|
|
end|
|
|
ERROR 42000: Cursor declaration after handler declaration
|
|
create procedure p()
|
|
begin
|
|
declare continue handler for sqlexception
|
|
begin
|
|
goto L1;
|
|
end;
|
|
select field from t1;
|
|
label L1;
|
|
end|
|
|
ERROR HY000: GOTO is not allowed in a stored procedure handler
|
|
create procedure bug1965()
|
|
begin
|
|
declare c cursor for select val from t1 order by valname;
|
|
open c;
|
|
close c;
|
|
end|
|
|
call bug1965()|
|
|
ERROR 42S22: Unknown column 'valname' in 'order clause'
|
|
drop procedure bug1965|
|
|
select 1 into a|
|
|
ERROR 42000: Undeclared variable: a
|
|
drop table if exists t3|
|
|
create table t3 (column_1_0 int)|
|
|
create procedure bug1653()
|
|
update t3 set column_1 = 0|
|
|
call bug1653()|
|
|
ERROR 42S22: Unknown column 'column_1' in 'field list'
|
|
drop table t3|
|
|
create table t3 (column_1 int)|
|
|
call bug1653()|
|
|
drop procedure bug1653|
|
|
drop table t3|
|
|
create procedure bug2259()
|
|
begin
|
|
declare v1 int;
|
|
declare c1 cursor for select s1 from t1;
|
|
fetch c1 into v1;
|
|
end|
|
|
call bug2259()|
|
|
ERROR 24000: Cursor is not open
|
|
drop procedure bug2259|
|
|
create procedure bug2272()
|
|
begin
|
|
declare v int;
|
|
update t1 set v = 42;
|
|
end|
|
|
insert into t1 values (666, 51.3)|
|
|
call bug2272()|
|
|
ERROR 42S22: Unknown column 'v' in 'field list'
|
|
delete from t1|
|
|
drop procedure bug2272|
|
|
create procedure bug2329_1()
|
|
begin
|
|
declare v int;
|
|
insert into t1 (v) values (5);
|
|
end|
|
|
create procedure bug2329_2()
|
|
begin
|
|
declare v int;
|
|
replace t1 set v = 5;
|
|
end|
|
|
call bug2329_1()|
|
|
ERROR 42S22: Unknown column 'v' in 'field list'
|
|
call bug2329_2()|
|
|
ERROR 42S22: Unknown column 'v' in 'field list'
|
|
drop procedure bug2329_1|
|
|
drop procedure bug2329_2|
|
|
create function bug3287() returns int
|
|
begin
|
|
declare v int default null;
|
|
case
|
|
when v is not null then return 1;
|
|
end case;
|
|
return 2;
|
|
end|
|
|
select bug3287()|
|
|
ERROR 20000: Case not found for CASE statement
|
|
drop function bug3287|
|
|
create procedure bug3287(x int)
|
|
case x
|
|
when 0 then
|
|
insert into test.t1 values (x, 0.1);
|
|
when 1 then
|
|
insert into test.t1 values (x, 1.1);
|
|
end case|
|
|
call bug3287(2)|
|
|
ERROR 20000: Case not found for CASE statement
|
|
drop procedure bug3287|
|
|
drop table if exists t3|
|
|
create table t3 (s1 int, primary key (s1))|
|
|
insert into t3 values (5),(6)|
|
|
create procedure bug3279(out y int)
|
|
begin
|
|
declare x int default 0;
|
|
begin
|
|
declare exit handler for sqlexception set x = x+1;
|
|
insert into t3 values (5);
|
|
end;
|
|
if x < 2 then
|
|
set x = x+1;
|
|
insert into t3 values (6);
|
|
end if;
|
|
set y = x;
|
|
end|
|
|
set @x = 0|
|
|
call bug3279(@x)|
|
|
ERROR 23000: Duplicate entry '6' for key 1
|
|
select @x|
|
|
@x
|
|
0
|
|
drop procedure bug3279|
|
|
drop table t3|
|
|
create procedure nodb.bug3339() begin end|
|
|
ERROR 42000: Unknown database 'nodb'
|
|
create procedure bug2653_1(a int, out b int)
|
|
set b = aa|
|
|
create procedure bug2653_2(a int, out b int)
|
|
begin
|
|
if aa < 0 then
|
|
set b = - a;
|
|
else
|
|
set b = a;
|
|
end if;
|
|
end|
|
|
call bug2653_1(1, @b)|
|
|
ERROR 42S22: Unknown column 'aa' in 'order clause'
|
|
call bug2653_2(2, @b)|
|
|
ERROR 42S22: Unknown column 'aa' in 'order clause'
|
|
drop procedure bug2653_1|
|
|
drop procedure bug2653_2|
|
|
create procedure bug4344() drop procedure bug4344|
|
|
ERROR HY000: Can't drop a PROCEDURE from within another stored routine
|
|
create procedure bug4344() drop function bug4344|
|
|
ERROR HY000: Can't drop a FUNCTION from within another stored routine
|
|
drop procedure if exists bug3294|
|
|
create procedure bug3294()
|
|
begin
|
|
declare continue handler for sqlexception drop table t5;
|
|
drop table t5;
|
|
drop table t5;
|
|
end|
|
|
create table t5 (x int)|
|
|
call bug3294()|
|
|
ERROR 42S02: Unknown table 't5'
|
|
drop procedure bug3294|
|
|
drop procedure if exists bug6807|
|
|
create procedure bug6807()
|
|
begin
|
|
declare id int;
|
|
set id = connection_id();
|
|
kill query id;
|
|
select 'Not reached';
|
|
end|
|
|
call bug6807()|
|
|
ERROR 70100: Query execution was interrupted
|
|
call bug6807()|
|
|
ERROR 70100: Query execution was interrupted
|
|
drop procedure bug6807|
|
|
drop table t1|
|