mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Merge mysql.com:/extern/mysql/5.1/generic/mysql-5.0-merge
into mysql.com:/extern/mysql/5.1/generic/mysql-5.1-new mysql-test/r/innodb.result: Auto merged mysql-test/r/sp.result: Auto merged mysql-test/r/timezone_grant.result: Auto merged mysql-test/r/trigger.result: Auto merged mysql-test/r/view.result: Auto merged mysql-test/t/innodb.test: Auto merged mysql-test/t/sp.test: Auto merged mysql-test/t/trigger.test: Auto merged mysql-test/t/view.test: Auto merged sql/lex.h: Auto merged sql/sp.cc: Auto merged sql/sp_head.cc: Auto merged sql/sp_head.h: Auto merged sql/sql_class.cc: Auto merged sql/sql_view.cc: Auto merged mysql-test/r/rpl_insert_id.result: Manual merge. mysql-test/t/disabled.def: Manual merge. mysql-test/t/rpl_insert_id.test: Manual merge. sql/item_func.cc: Manual merge. sql/sql_yacc.yy: Manual merge - not complete yet.
This commit is contained in:
commit
225330cd5b
22 changed files with 397 additions and 531 deletions
|
@ -73,3 +73,61 @@ CREATE TABLE t1 ( a INT UNIQUE );
|
|||
SET FOREIGN_KEY_CHECKS=0;
|
||||
INSERT INTO t1 VALUES (1),(1);
|
||||
Got one of the listed errors
|
||||
drop function if exists bug15728;
|
||||
drop function if exists bug15728_insert;
|
||||
drop table if exists t1, t2;
|
||||
create table t1 (
|
||||
id int not null auto_increment,
|
||||
last_id int,
|
||||
primary key (id)
|
||||
);
|
||||
create function bug15728() returns int(11)
|
||||
return last_insert_id();
|
||||
insert into t1 (last_id) values (0);
|
||||
insert into t1 (last_id) values (last_insert_id());
|
||||
insert into t1 (last_id) values (bug15728());
|
||||
create table t2 (
|
||||
id int not null auto_increment,
|
||||
last_id int,
|
||||
primary key (id)
|
||||
);
|
||||
create function bug15728_insert() returns int(11) modifies sql data
|
||||
begin
|
||||
insert into t2 (last_id) values (bug15728());
|
||||
return bug15728();
|
||||
end|
|
||||
create trigger t1_bi before insert on t1 for each row
|
||||
begin
|
||||
declare res int;
|
||||
select bug15728_insert() into res;
|
||||
set NEW.last_id = res;
|
||||
end|
|
||||
insert into t1 (last_id) values (0);
|
||||
drop trigger t1_bi;
|
||||
select last_insert_id();
|
||||
last_insert_id()
|
||||
4
|
||||
select bug15728_insert();
|
||||
bug15728_insert()
|
||||
2
|
||||
select last_insert_id();
|
||||
last_insert_id()
|
||||
4
|
||||
insert into t1 (last_id) values (bug15728());
|
||||
select last_insert_id();
|
||||
last_insert_id()
|
||||
5
|
||||
select * from t1;
|
||||
id last_id
|
||||
1 0
|
||||
2 1
|
||||
3 2
|
||||
4 1
|
||||
5 4
|
||||
select * from t2;
|
||||
id last_id
|
||||
1 3
|
||||
2 4
|
||||
drop function bug15728;
|
||||
drop function bug15728_insert;
|
||||
drop table t1, t2;
|
||||
|
|
|
@ -1,205 +0,0 @@
|
|||
drop table if exists t1;
|
||||
create table t1 (
|
||||
id char(16) not null default '',
|
||||
data int not null
|
||||
);
|
||||
drop procedure if exists goto1//
|
||||
create procedure goto1()
|
||||
begin
|
||||
declare y int;
|
||||
label a;
|
||||
select * from t1;
|
||||
select count(*) into y from t1;
|
||||
if y > 2 then
|
||||
goto b;
|
||||
end if;
|
||||
insert into t1 values ("j", y);
|
||||
goto a;
|
||||
label b;
|
||||
end//
|
||||
call goto1()//
|
||||
id data
|
||||
id data
|
||||
j 0
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
j 2
|
||||
drop procedure goto1//
|
||||
drop procedure if exists goto2//
|
||||
create procedure goto2(a int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare continue handler for sqlstate '42S98' set x = 1;
|
||||
label a;
|
||||
select * from t1;
|
||||
b:
|
||||
while x < 2 do
|
||||
begin
|
||||
declare continue handler for sqlstate '42S99' set x = 2;
|
||||
if a = 0 then
|
||||
set x = x + 1;
|
||||
iterate b;
|
||||
elseif a = 1 then
|
||||
leave b;
|
||||
elseif a = 2 then
|
||||
set a = 1;
|
||||
goto a;
|
||||
end if;
|
||||
end;
|
||||
end while b;
|
||||
select * from t1;
|
||||
end//
|
||||
call goto2(0)//
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
j 2
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
j 2
|
||||
call goto2(1)//
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
j 2
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
j 2
|
||||
call goto2(2)//
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
j 2
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
j 2
|
||||
id data
|
||||
j 0
|
||||
j 1
|
||||
j 2
|
||||
drop procedure goto2//
|
||||
delete from t1//
|
||||
drop procedure if exists goto3//
|
||||
create procedure goto3()
|
||||
begin
|
||||
label L1;
|
||||
begin
|
||||
end;
|
||||
goto L1;
|
||||
end//
|
||||
drop procedure goto3//
|
||||
drop procedure if exists goto4//
|
||||
create procedure goto4()
|
||||
begin
|
||||
begin
|
||||
label lab1;
|
||||
begin
|
||||
goto lab1;
|
||||
end;
|
||||
end;
|
||||
end//
|
||||
drop procedure goto4//
|
||||
drop procedure if exists goto5//
|
||||
create procedure goto5()
|
||||
begin
|
||||
begin
|
||||
begin
|
||||
goto lab1;
|
||||
end;
|
||||
label lab1;
|
||||
end;
|
||||
end//
|
||||
drop procedure goto5//
|
||||
drop procedure if exists goto6//
|
||||
create procedure goto6()
|
||||
begin
|
||||
label L1;
|
||||
goto L5;
|
||||
begin
|
||||
label L2;
|
||||
goto L1;
|
||||
goto L5;
|
||||
begin
|
||||
label L3;
|
||||
goto L1;
|
||||
goto L2;
|
||||
goto L3;
|
||||
goto L4;
|
||||
goto L5;
|
||||
end;
|
||||
goto L2;
|
||||
goto L4;
|
||||
label L4;
|
||||
end;
|
||||
label L5;
|
||||
goto L1;
|
||||
end//
|
||||
drop procedure goto6//
|
||||
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 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
|
||||
drop procedure if exists bug6898//
|
||||
create procedure bug6898()
|
||||
begin
|
||||
goto label1;
|
||||
label label1;
|
||||
begin end;
|
||||
goto label1;
|
||||
end//
|
||||
drop procedure bug6898//
|
||||
drop table t1;
|
|
@ -4858,4 +4858,60 @@ c 2
|
|||
b 3
|
||||
a 1
|
||||
delete from t1|
|
||||
drop function if exists bug15728|
|
||||
drop table if exists t3|
|
||||
create table t3 (
|
||||
id int not null auto_increment,
|
||||
primary key (id)
|
||||
)|
|
||||
create function bug15728() returns int(11)
|
||||
return last_insert_id()|
|
||||
insert into t3 values (0)|
|
||||
select last_insert_id()|
|
||||
last_insert_id()
|
||||
1
|
||||
select bug15728()|
|
||||
bug15728()
|
||||
1
|
||||
drop function bug15728|
|
||||
drop table t3|
|
||||
drop procedure if exists bug18787|
|
||||
create procedure bug18787()
|
||||
begin
|
||||
declare continue handler for sqlexception begin end;
|
||||
select no_such_function();
|
||||
end|
|
||||
call bug18787()|
|
||||
no_such_function()
|
||||
NULL
|
||||
drop procedure bug18787|
|
||||
create database bug18344_012345678901|
|
||||
use bug18344_012345678901|
|
||||
create procedure bug18344() begin end|
|
||||
create procedure bug18344_2() begin end|
|
||||
create database bug18344_0123456789012|
|
||||
use bug18344_0123456789012|
|
||||
create procedure bug18344() begin end|
|
||||
create procedure bug18344_2() begin end|
|
||||
use test|
|
||||
select schema_name from information_schema.schemata where
|
||||
schema_name like 'bug18344%'|
|
||||
schema_name
|
||||
bug18344_012345678901
|
||||
bug18344_0123456789012
|
||||
select routine_name,routine_schema from information_schema.routines where
|
||||
routine_schema like 'bug18344%'|
|
||||
routine_name routine_schema
|
||||
bug18344 bug18344_012345678901
|
||||
bug18344_2 bug18344_012345678901
|
||||
bug18344 bug18344_0123456789012
|
||||
bug18344_2 bug18344_0123456789012
|
||||
drop database bug18344_012345678901|
|
||||
drop database bug18344_0123456789012|
|
||||
select schema_name from information_schema.schemata where
|
||||
schema_name like 'bug18344%'|
|
||||
schema_name
|
||||
select routine_name,routine_schema from information_schema.routines where
|
||||
routine_schema like 'bug18344%'|
|
||||
routine_name routine_schema
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
drop tables if exists t1, t2;
|
||||
drop view if exists v1;
|
||||
delete from mysql.user where user like 'mysqltest\_%';
|
||||
delete from mysql.db where user like 'mysqltest\_%';
|
||||
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
||||
|
@ -59,3 +61,18 @@ delete from mysql.db where user like 'mysqltest\_%';
|
|||
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
||||
flush privileges;
|
||||
drop table t1, t2;
|
||||
create table t1 (a int, b datetime);
|
||||
insert into t1 values (1, 20010101000000), (2, 20020101000000);
|
||||
grant all privileges on test.* to mysqltest_1@localhost;
|
||||
create view v1 as select a, convert_tz(b, 'UTC', 'Europe/Moscow') as lb from t1;
|
||||
select * from v1;
|
||||
a lb
|
||||
1 2001-01-01 03:00:00
|
||||
2 2002-01-01 03:00:00
|
||||
select * from v1, mysql.time_zone;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'time_zone'
|
||||
drop view v1;
|
||||
create view v1 as select a, convert_tz(b, 'UTC', 'Europe/Moscow') as lb from t1, mysql.time_zone;
|
||||
ERROR 42000: ANY command denied to user 'mysqltest_1'@'localhost' for table 'time_zone'
|
||||
drop table t1;
|
||||
drop user mysqltest_1@localhost;
|
||||
|
|
|
@ -949,9 +949,42 @@ insert into t1 values
|
|||
create function f2() returns int return (select max(b) from t2);
|
||||
insert into t2 select a, f2() from t1;
|
||||
load data infile '../std_data_ln/words.dat' into table t1 (a) set b:= f1();
|
||||
drop table t1;
|
||||
drop tables t1, t2;
|
||||
drop function f1;
|
||||
drop function f2;
|
||||
create table t1(i int not null, j int not null, n numeric(15,2), primary key(i,j));
|
||||
create table t2(i int not null, n numeric(15,2), primary key(i));
|
||||
create trigger t1_ai after insert on t1 for each row
|
||||
begin
|
||||
declare sn numeric(15,2);
|
||||
select sum(n) into sn from t1 where i=new.i;
|
||||
replace into t2 values(new.i, sn);
|
||||
end|
|
||||
insert into t1 values
|
||||
(1,1,10.00),(1,2,10.00),(1,3,10.00),(1,4,10.00),(1,5,10.00),
|
||||
(1,6,10.00),(1,7,10.00),(1,8,10.00),(1,9,10.00),(1,10,10.00),
|
||||
(1,11,10.00),(1,12,10.00),(1,13,10.00),(1,14,10.00),(1,15,10.00);
|
||||
select * from t1;
|
||||
i j n
|
||||
1 1 10.00
|
||||
1 2 10.00
|
||||
1 3 10.00
|
||||
1 4 10.00
|
||||
1 5 10.00
|
||||
1 6 10.00
|
||||
1 7 10.00
|
||||
1 8 10.00
|
||||
1 9 10.00
|
||||
1 10 10.00
|
||||
1 11 10.00
|
||||
1 12 10.00
|
||||
1 13 10.00
|
||||
1 14 10.00
|
||||
1 15 10.00
|
||||
select * from t2;
|
||||
i n
|
||||
1 150.00
|
||||
drop tables t1, t2;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (
|
||||
conn_id INT,
|
||||
|
|
|
@ -2623,3 +2623,29 @@ select * from v1;
|
|||
ERROR HY000: Recursive stored functions and triggers are not allowed.
|
||||
drop function f1;
|
||||
drop view t1, v1;
|
||||
create table t1 (dt datetime);
|
||||
insert into t1 values (20040101000000), (20050101000000), (20060101000000);
|
||||
create view v1 as select convert_tz(dt, 'UTC', 'Europe/Moscow') as ldt from t1;
|
||||
select * from v1;
|
||||
ldt
|
||||
2004-01-01 03:00:00
|
||||
2005-01-01 03:00:00
|
||||
2006-01-01 03:00:00
|
||||
drop view v1;
|
||||
create view v1 as select * from t1 where convert_tz(dt, 'UTC', 'Europe/Moscow') >= 20050101000000;
|
||||
select * from v1;
|
||||
dt
|
||||
2005-01-01 00:00:00
|
||||
2006-01-01 00:00:00
|
||||
create view v2 as select * from v1 where dt < 20060101000000;
|
||||
select * from v2;
|
||||
dt
|
||||
2005-01-01 00:00:00
|
||||
drop view v2;
|
||||
create view v2 as select convert_tz(dt, 'UTC', 'Europe/Moscow') as ldt from v1;
|
||||
select * from v2;
|
||||
ldt
|
||||
2005-01-01 03:00:00
|
||||
2006-01-01 03:00:00
|
||||
drop view v1, v2;
|
||||
drop table t1;
|
||||
|
|
|
@ -35,7 +35,6 @@ rpl_row_func003 : BUG#19074 2006-13-04 andrei test failed
|
|||
rpl_row_inexist_tbl : BUG#18948 2006-03-09 mats Disabled since patch makes this test wait forever
|
||||
rpl_sp : BUG#16456 2006-02-16 jmiller
|
||||
rpl_until : BUG#15886 2006-02-16 jmiller Unstable test case
|
||||
sp-goto : BUG#18949 2006-02-16 jmiller GOTO is currently is disabled - will be fixed in the future
|
||||
mysqldump : BUG#18078 2006-03-10 lars
|
||||
udf : BUG#18564 2006-03-27 ian (Permission by Brian)
|
||||
|
||||
|
|
|
@ -1,238 +0,0 @@
|
|||
#
|
||||
# The non-standard GOTO, for compatibility
|
||||
#
|
||||
# QQQ The "label" syntax is temporary, it will (hopefully)
|
||||
# change to the more common "L:" syntax soon.
|
||||
# For the time being, this feature is disabled, until
|
||||
# the syntax (and some other known bugs) can be fixed.
|
||||
#
|
||||
# Test cases for bugs are added at the end. See template there.
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
create table t1 (
|
||||
id char(16) not null default '',
|
||||
data int not null
|
||||
);
|
||||
|
||||
delimiter //;
|
||||
|
||||
--disable_warnings
|
||||
drop procedure if exists goto1//
|
||||
--enable_warnings
|
||||
create procedure goto1()
|
||||
begin
|
||||
declare y int;
|
||||
|
||||
label a;
|
||||
select * from t1;
|
||||
select count(*) into y from t1;
|
||||
if y > 2 then
|
||||
goto b;
|
||||
end if;
|
||||
insert into t1 values ("j", y);
|
||||
goto a;
|
||||
label b;
|
||||
end//
|
||||
|
||||
call goto1()//
|
||||
drop procedure goto1//
|
||||
|
||||
# With dummy handlers, just to test restore of contexts with jumps
|
||||
--disable_warnings
|
||||
drop procedure if exists goto2//
|
||||
--enable_warnings
|
||||
create procedure goto2(a int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
declare continue handler for sqlstate '42S98' set x = 1;
|
||||
|
||||
label a;
|
||||
select * from t1;
|
||||
b:
|
||||
while x < 2 do
|
||||
begin
|
||||
declare continue handler for sqlstate '42S99' set x = 2;
|
||||
|
||||
if a = 0 then
|
||||
set x = x + 1;
|
||||
iterate b;
|
||||
elseif a = 1 then
|
||||
leave b;
|
||||
elseif a = 2 then
|
||||
set a = 1;
|
||||
goto a;
|
||||
end if;
|
||||
end;
|
||||
end while b;
|
||||
|
||||
select * from t1;
|
||||
end//
|
||||
|
||||
call goto2(0)//
|
||||
call goto2(1)//
|
||||
call goto2(2)//
|
||||
|
||||
drop procedure goto2//
|
||||
delete from t1//
|
||||
|
||||
# Check label visibility for some more cases. We don't call these.
|
||||
--disable_warnings
|
||||
drop procedure if exists goto3//
|
||||
--enable_warnings
|
||||
create procedure goto3()
|
||||
begin
|
||||
label L1;
|
||||
begin
|
||||
end;
|
||||
goto L1;
|
||||
end//
|
||||
drop procedure goto3//
|
||||
|
||||
--disable_warnings
|
||||
drop procedure if exists goto4//
|
||||
--enable_warnings
|
||||
create procedure goto4()
|
||||
begin
|
||||
begin
|
||||
label lab1;
|
||||
begin
|
||||
goto lab1;
|
||||
end;
|
||||
end;
|
||||
end//
|
||||
drop procedure goto4//
|
||||
|
||||
--disable_warnings
|
||||
drop procedure if exists goto5//
|
||||
--enable_warnings
|
||||
create procedure goto5()
|
||||
begin
|
||||
begin
|
||||
begin
|
||||
goto lab1;
|
||||
end;
|
||||
label lab1;
|
||||
end;
|
||||
end//
|
||||
drop procedure goto5//
|
||||
|
||||
--disable_warnings
|
||||
drop procedure if exists goto6//
|
||||
--enable_warnings
|
||||
create procedure goto6()
|
||||
begin
|
||||
label L1;
|
||||
goto L5;
|
||||
begin
|
||||
label L2;
|
||||
goto L1;
|
||||
goto L5;
|
||||
begin
|
||||
label L3;
|
||||
goto L1;
|
||||
goto L2;
|
||||
goto L3;
|
||||
goto L4;
|
||||
goto L5;
|
||||
end;
|
||||
goto L2;
|
||||
goto L4;
|
||||
label L4;
|
||||
end;
|
||||
label L5;
|
||||
goto L1;
|
||||
end//
|
||||
drop procedure goto6//
|
||||
|
||||
# Mismatching labels
|
||||
--error 1308
|
||||
create procedure foo()
|
||||
begin
|
||||
goto foo;
|
||||
end//
|
||||
--error 1308
|
||||
create procedure foo()
|
||||
begin
|
||||
begin
|
||||
label foo;
|
||||
end;
|
||||
goto foo;
|
||||
end//
|
||||
--error 1308
|
||||
create procedure foo()
|
||||
begin
|
||||
goto foo;
|
||||
begin
|
||||
label foo;
|
||||
end;
|
||||
end//
|
||||
--error 1308
|
||||
create procedure foo()
|
||||
begin
|
||||
begin
|
||||
goto foo;
|
||||
end;
|
||||
begin
|
||||
label foo;
|
||||
end;
|
||||
end//
|
||||
--error 1308
|
||||
create procedure foo()
|
||||
begin
|
||||
begin
|
||||
label foo;
|
||||
end;
|
||||
begin
|
||||
goto foo;
|
||||
end;
|
||||
end//
|
||||
|
||||
# No goto in a handler
|
||||
--error 1358
|
||||
create procedure p()
|
||||
begin
|
||||
declare continue handler for sqlexception
|
||||
begin
|
||||
goto L1;
|
||||
end;
|
||||
|
||||
select field from t1;
|
||||
label L1;
|
||||
end//
|
||||
|
||||
|
||||
#
|
||||
# Test cases for old bugs
|
||||
#
|
||||
|
||||
#
|
||||
# BUG#6898: Stored procedure crash if GOTO statements exist
|
||||
#
|
||||
--disable_warnings
|
||||
drop procedure if exists bug6898//
|
||||
--enable_warnings
|
||||
create procedure bug6898()
|
||||
begin
|
||||
goto label1;
|
||||
label label1;
|
||||
begin end;
|
||||
goto label1;
|
||||
end//
|
||||
drop procedure bug6898//
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
#--disable_warnings
|
||||
#drop procedure if exists bugNNNN//
|
||||
#--enable_warnings
|
||||
#create procedure bugNNNN...
|
||||
|
||||
|
||||
# Add bugs above this line. Use existing tables t1 and t2 when
|
||||
# practical, or create table t3, t4 etc temporarily (and drop them).
|
||||
delimiter ;//
|
||||
drop table t1;
|
|
@ -5704,6 +5704,81 @@ select * from t1 order by @x|
|
|||
delete from t1|
|
||||
|
||||
|
||||
#
|
||||
# BUG#15728: LAST_INSERT_ID function inside a stored function returns 0
|
||||
#
|
||||
# The solution is not to reset last_insert_id on enter to sub-statement.
|
||||
#
|
||||
--disable_warnings
|
||||
drop function if exists bug15728|
|
||||
drop table if exists t3|
|
||||
--enable_warnings
|
||||
|
||||
create table t3 (
|
||||
id int not null auto_increment,
|
||||
primary key (id)
|
||||
)|
|
||||
create function bug15728() returns int(11)
|
||||
return last_insert_id()|
|
||||
|
||||
insert into t3 values (0)|
|
||||
select last_insert_id()|
|
||||
select bug15728()|
|
||||
|
||||
drop function bug15728|
|
||||
drop table t3|
|
||||
|
||||
|
||||
#
|
||||
# BUG#18787: Server crashed when calling a stored procedure containing
|
||||
# a misnamed function
|
||||
#
|
||||
--disable_warnings
|
||||
drop procedure if exists bug18787|
|
||||
--enable_warnings
|
||||
create procedure bug18787()
|
||||
begin
|
||||
declare continue handler for sqlexception begin end;
|
||||
|
||||
select no_such_function();
|
||||
end|
|
||||
|
||||
call bug18787()|
|
||||
drop procedure bug18787|
|
||||
|
||||
|
||||
#
|
||||
# BUG#18344: DROP DATABASE does not drop associated routines
|
||||
# (... if the database name is longer than 21 characters)
|
||||
#
|
||||
# 1234567890123456789012
|
||||
create database bug18344_012345678901|
|
||||
use bug18344_012345678901|
|
||||
create procedure bug18344() begin end|
|
||||
create procedure bug18344_2() begin end|
|
||||
|
||||
create database bug18344_0123456789012|
|
||||
use bug18344_0123456789012|
|
||||
create procedure bug18344() begin end|
|
||||
create procedure bug18344_2() begin end|
|
||||
|
||||
use test|
|
||||
|
||||
select schema_name from information_schema.schemata where
|
||||
schema_name like 'bug18344%'|
|
||||
select routine_name,routine_schema from information_schema.routines where
|
||||
routine_schema like 'bug18344%'|
|
||||
|
||||
drop database bug18344_012345678901|
|
||||
drop database bug18344_0123456789012|
|
||||
|
||||
# Should be nothing left.
|
||||
select schema_name from information_schema.schemata where
|
||||
schema_name like 'bug18344%'|
|
||||
select routine_name,routine_schema from information_schema.routines where
|
||||
routine_schema like 'bug18344%'|
|
||||
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
# Embedded server testing does not support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
--disable_warnings
|
||||
drop tables if exists t1, t2;
|
||||
drop view if exists v1;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# Test for bug #6116 "SET time_zone := ... requires access to mysql.time_zone
|
||||
# tables". We should allow implicit access to time zone description tables
|
||||
|
@ -82,3 +87,29 @@ flush privileges;
|
|||
drop table t1, t2;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
# Additional test for bug #15153: CONVERT_TZ() is not allowed in all
|
||||
# places in views.
|
||||
#
|
||||
# Let us check that usage of CONVERT_TZ() function in view does not
|
||||
# require additional privileges.
|
||||
|
||||
# Let us rely on that previous tests done proper cleanups
|
||||
create table t1 (a int, b datetime);
|
||||
insert into t1 values (1, 20010101000000), (2, 20020101000000);
|
||||
grant all privileges on test.* to mysqltest_1@localhost;
|
||||
connect (tzuser3, localhost, mysqltest_1,,);
|
||||
create view v1 as select a, convert_tz(b, 'UTC', 'Europe/Moscow') as lb from t1;
|
||||
select * from v1;
|
||||
# Of course we should not be able select from mysql.time_zone tables
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
select * from v1, mysql.time_zone;
|
||||
drop view v1;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
create view v1 as select a, convert_tz(b, 'UTC', 'Europe/Moscow') as lb from t1, mysql.time_zone;
|
||||
connection default;
|
||||
drop table t1;
|
||||
drop user mysqltest_1@localhost;
|
||||
|
||||
# End of 5.0 tests
|
||||
|
|
|
@ -1111,10 +1111,34 @@ insert into t1 values
|
|||
create function f2() returns int return (select max(b) from t2);
|
||||
insert into t2 select a, f2() from t1;
|
||||
load data infile '../std_data_ln/words.dat' into table t1 (a) set b:= f1();
|
||||
drop table t1;
|
||||
drop tables t1, t2;
|
||||
drop function f1;
|
||||
drop function f2;
|
||||
|
||||
#
|
||||
# Test for bug #16021 "Wrong index given to function in trigger" which
|
||||
# was caused by the same bulk insert optimization as bug #17764 but had
|
||||
# slightly different symptoms (instead of reporting table as crashed
|
||||
# storage engine reported error number 124)
|
||||
#
|
||||
create table t1(i int not null, j int not null, n numeric(15,2), primary key(i,j));
|
||||
create table t2(i int not null, n numeric(15,2), primary key(i));
|
||||
delimiter |;
|
||||
create trigger t1_ai after insert on t1 for each row
|
||||
begin
|
||||
declare sn numeric(15,2);
|
||||
select sum(n) into sn from t1 where i=new.i;
|
||||
replace into t2 values(new.i, sn);
|
||||
end|
|
||||
delimiter ;|
|
||||
insert into t1 values
|
||||
(1,1,10.00),(1,2,10.00),(1,3,10.00),(1,4,10.00),(1,5,10.00),
|
||||
(1,6,10.00),(1,7,10.00),(1,8,10.00),(1,9,10.00),(1,10,10.00),
|
||||
(1,11,10.00),(1,12,10.00),(1,13,10.00),(1,14,10.00),(1,15,10.00);
|
||||
select * from t1;
|
||||
select * from t2;
|
||||
drop tables t1, t2;
|
||||
|
||||
#
|
||||
# Test for Bug #16461 connection_id() does not work properly inside trigger
|
||||
#
|
||||
|
|
|
@ -2490,3 +2490,30 @@ rename table v2 to t1;
|
|||
select * from v1;
|
||||
drop function f1;
|
||||
drop view t1, v1;
|
||||
|
||||
#
|
||||
# Bug #15153: CONVERT_TZ() is not allowed in all places in VIEWs
|
||||
#
|
||||
# Error was reported when one tried to use CONVERT_TZ() function
|
||||
# select list of view which was processed using MERGE algorithm.
|
||||
# (Also see additional test in timezone_grant.test)
|
||||
create table t1 (dt datetime);
|
||||
insert into t1 values (20040101000000), (20050101000000), (20060101000000);
|
||||
# Let us test that convert_tz() can be used in view's select list
|
||||
create view v1 as select convert_tz(dt, 'UTC', 'Europe/Moscow') as ldt from t1;
|
||||
select * from v1;
|
||||
drop view v1;
|
||||
# And in its where part
|
||||
create view v1 as select * from t1 where convert_tz(dt, 'UTC', 'Europe/Moscow') >= 20050101000000;
|
||||
select * from v1;
|
||||
# Other interesting case - a view which uses convert_tz() function
|
||||
# through other view.
|
||||
create view v2 as select * from v1 where dt < 20060101000000;
|
||||
select * from v2;
|
||||
drop view v2;
|
||||
# And even more interesting case when view uses convert_tz() both
|
||||
# directly and indirectly
|
||||
create view v2 as select convert_tz(dt, 'UTC', 'Europe/Moscow') as ldt from v1;
|
||||
select * from v2;
|
||||
drop view v1, v2;
|
||||
drop table t1;
|
||||
|
|
|
@ -4747,7 +4747,9 @@ Item_func_sp::sp_result_field(void) const
|
|||
dummy_table->s->table_name.str= empty_name;
|
||||
dummy_table->s->db.str= empty_name;
|
||||
}
|
||||
field= m_sp->create_result_field(max_length, name, dummy_table);
|
||||
if (!(field= m_sp->create_result_field(max_length, name, dummy_table)))
|
||||
my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
|
||||
|
||||
DBUG_RETURN(field);
|
||||
}
|
||||
|
||||
|
@ -4773,8 +4775,14 @@ Item_func_sp::execute(Field **flp)
|
|||
|
||||
if (!(f= *flp))
|
||||
{
|
||||
*flp= f= sp_result_field();
|
||||
f->move_field((f->pack_length() > sizeof(result_buf)) ?
|
||||
if (!(*flp= f= sp_result_field()))
|
||||
{
|
||||
/* Error set by sp_result_field() */
|
||||
null_value= 1;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
f->move_field((f->pack_length() > sizeof(result_buf)) ?
|
||||
sql_alloc(f->pack_length()) : result_buf);
|
||||
f->null_ptr= (uchar *)&null_value;
|
||||
f->null_bit= 1;
|
||||
|
@ -4926,16 +4934,19 @@ longlong Item_func_found_rows::val_int()
|
|||
Field *
|
||||
Item_func_sp::tmp_table_field(TABLE *t_arg)
|
||||
{
|
||||
Field *res= 0;
|
||||
Field *field= 0;
|
||||
DBUG_ENTER("Item_func_sp::tmp_table_field");
|
||||
|
||||
if (m_sp)
|
||||
res= m_sp->create_result_field(max_length, (const char*) name, t_arg);
|
||||
field= m_sp->create_result_field(max_length, (const char*) name, t_arg);
|
||||
|
||||
if (!res)
|
||||
res= Item_func::tmp_table_field(t_arg);
|
||||
if (!field)
|
||||
field= Item_func::tmp_table_field(t_arg);
|
||||
|
||||
DBUG_RETURN(res);
|
||||
if (!field)
|
||||
my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
|
||||
|
||||
DBUG_RETURN(field);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -227,9 +227,6 @@ static SYMBOL symbols[] = {
|
|||
{ "GEOMETRYCOLLECTION",SYM(GEOMETRYCOLLECTION)},
|
||||
{ "GET_FORMAT", SYM(GET_FORMAT)},
|
||||
{ "GLOBAL", SYM(GLOBAL_SYM)},
|
||||
#ifdef SP_GOTO
|
||||
{ "GOTO", SYM(GOTO_SYM)},
|
||||
#endif
|
||||
{ "GRANT", SYM(GRANT)},
|
||||
{ "GRANTS", SYM(GRANTS)},
|
||||
{ "GROUP", SYM(GROUP)},
|
||||
|
@ -279,10 +276,6 @@ static SYMBOL symbols[] = {
|
|||
{ "KEY", SYM(KEY_SYM)},
|
||||
{ "KEYS", SYM(KEYS)},
|
||||
{ "KILL", SYM(KILL_SYM)},
|
||||
#ifdef SP_GOTO
|
||||
/* QQ This will go away when the GOTO label syntax is fixed */
|
||||
{ "LABEL", SYM(LABEL_SYM)},
|
||||
#endif
|
||||
{ "LANGUAGE", SYM(LANGUAGE_SYM)},
|
||||
{ "LAST", SYM(LAST_SYM)},
|
||||
{ "LEADING", SYM(LEADING)},
|
||||
|
|
20
sql/sp.cc
20
sql/sp.cc
|
@ -885,28 +885,23 @@ int
|
|||
sp_drop_db_routines(THD *thd, char *db)
|
||||
{
|
||||
TABLE *table;
|
||||
byte key[64]; // db
|
||||
uint keylen;
|
||||
int ret;
|
||||
uint key_len;
|
||||
DBUG_ENTER("sp_drop_db_routines");
|
||||
DBUG_PRINT("enter", ("db: %s", db));
|
||||
|
||||
// Put the key used to read the row together
|
||||
keylen= strlen(db);
|
||||
if (keylen > 64)
|
||||
keylen= 64;
|
||||
memcpy(key, db, keylen);
|
||||
memset(key+keylen, (int)' ', 64-keylen); // Pad with space
|
||||
keylen= sizeof(key);
|
||||
|
||||
ret= SP_OPEN_TABLE_FAILED;
|
||||
if (!(table= open_proc_table_for_update(thd)))
|
||||
goto err;
|
||||
|
||||
table->field[MYSQL_PROC_FIELD_DB]->store(db, strlen(db), system_charset_info);
|
||||
key_len= table->key_info->key_part[0].store_length;
|
||||
|
||||
ret= SP_OK;
|
||||
table->file->ha_index_init(0, 1);
|
||||
if (! table->file->index_read(table->record[0],
|
||||
key, keylen, HA_READ_KEY_EXACT))
|
||||
(byte *)table->field[MYSQL_PROC_FIELD_DB]->ptr,
|
||||
key_len, HA_READ_KEY_EXACT))
|
||||
{
|
||||
int nxtres;
|
||||
bool deleted= FALSE;
|
||||
|
@ -922,7 +917,8 @@ sp_drop_db_routines(THD *thd, char *db)
|
|||
break;
|
||||
}
|
||||
} while (! (nxtres= table->file->index_next_same(table->record[0],
|
||||
key, keylen)));
|
||||
(byte *)table->field[MYSQL_PROC_FIELD_DB]->ptr,
|
||||
key_len)));
|
||||
if (nxtres != HA_ERR_END_OF_FILE)
|
||||
ret= SP_KEY_NOT_FOUND;
|
||||
if (deleted)
|
||||
|
|
|
@ -1709,44 +1709,11 @@ sp_head::backpatch(sp_label_t *lab)
|
|||
|
||||
while ((bp= li++))
|
||||
{
|
||||
if (bp->lab == lab ||
|
||||
(bp->lab->type == SP_LAB_REF &&
|
||||
my_strcasecmp(system_charset_info, bp->lab->name, lab->name) == 0))
|
||||
{
|
||||
if (bp->lab->type != SP_LAB_REF)
|
||||
bp->instr->backpatch(dest, lab->ctx);
|
||||
else
|
||||
{
|
||||
sp_label_t *dstlab= bp->lab->ctx->find_label(lab->name);
|
||||
|
||||
if (dstlab)
|
||||
{
|
||||
bp->lab= lab;
|
||||
bp->instr->backpatch(dest, dstlab->ctx);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bp->lab == lab)
|
||||
bp->instr->backpatch(dest, lab->ctx);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sp_head::check_backpatch(THD *thd)
|
||||
{
|
||||
bp_t *bp;
|
||||
List_iterator_fast<bp_t> li(m_backpatch);
|
||||
|
||||
while ((bp= li++))
|
||||
{
|
||||
if (bp->lab->type == SP_LAB_REF)
|
||||
{
|
||||
my_error(ER_SP_LILABEL_MISMATCH, MYF(0), "GOTO", bp->lab->name);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Prepare an instance of create_field for field creation (fill all necessary
|
||||
attributes).
|
||||
|
|
|
@ -264,13 +264,6 @@ public:
|
|||
void
|
||||
backpatch(struct sp_label *);
|
||||
|
||||
// Check that no unresolved references exist.
|
||||
// If none found, 0 is returned, otherwise errors have been issued
|
||||
// and -1 is returned.
|
||||
// This is called by the parser at the end of a create procedure/function.
|
||||
int
|
||||
check_backpatch(THD *thd);
|
||||
|
||||
// Start a new cont. backpatch level. If 'i' is NULL, the level is just incr.
|
||||
void
|
||||
new_cont_backpatch(sp_instr_opt_meta *i);
|
||||
|
|
|
@ -241,7 +241,7 @@ sp_pcontext::push_label(char *name, uint ip)
|
|||
{
|
||||
lab->name= name;
|
||||
lab->ip= ip;
|
||||
lab->type= SP_LAB_GOTO;
|
||||
lab->type= SP_LAB_IMPL;
|
||||
lab->ctx= this;
|
||||
m_label.push_front(lab);
|
||||
}
|
||||
|
|
|
@ -48,10 +48,9 @@ typedef struct sp_variable
|
|||
} sp_variable_t;
|
||||
|
||||
|
||||
#define SP_LAB_REF 0 // Unresolved reference (for goto)
|
||||
#define SP_LAB_GOTO 1 // Free goto label
|
||||
#define SP_LAB_BEGIN 2 // Label at BEGIN
|
||||
#define SP_LAB_ITER 3 // Label at iteration control
|
||||
#define SP_LAB_IMPL 0 // Implicit label generated by parser
|
||||
#define SP_LAB_BEGIN 1 // Label at BEGIN
|
||||
#define SP_LAB_ITER 2 // Label at iteration control
|
||||
|
||||
/*
|
||||
An SQL/PSM label. Can refer to the identifier used with the
|
||||
|
|
|
@ -2074,7 +2074,7 @@ void THD::restore_backup_open_tables_state(Open_tables_state *backup)
|
|||
The following things is done
|
||||
- Disable binary logging for the duration of the statement
|
||||
- Disable multi-result-sets for the duration of the statement
|
||||
- Value of last_insert_id() is reset and restored
|
||||
- Value of last_insert_id() is saved and restored
|
||||
- Value set by 'SET INSERT_ID=#' is reset and restored
|
||||
- Value for found_rows() is reset and restored
|
||||
- examined_row_count is added to the total
|
||||
|
@ -2086,6 +2086,8 @@ void THD::restore_backup_open_tables_state(Open_tables_state *backup)
|
|||
We reset examined_row_count and cuted_fields and add these to the
|
||||
result to ensure that if we have a bug that would reset these within
|
||||
a function, we are not loosing any rows from the main statement.
|
||||
|
||||
We do not reset value of last_insert_id().
|
||||
****************************************************************************/
|
||||
|
||||
void THD::reset_sub_statement_state(Sub_statement_state *backup,
|
||||
|
@ -2112,7 +2114,6 @@ void THD::reset_sub_statement_state(Sub_statement_state *backup,
|
|||
/* Disable result sets */
|
||||
client_capabilities &= ~CLIENT_MULTI_RESULTS;
|
||||
in_sub_stmt|= new_state;
|
||||
last_insert_id= 0;
|
||||
next_insert_id= 0;
|
||||
insert_id_used= 0;
|
||||
examined_row_count= 0;
|
||||
|
|
|
@ -1059,15 +1059,23 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table)
|
|||
!old_lex->can_not_use_merged())
|
||||
{
|
||||
List_iterator_fast<TABLE_LIST> ti(view_select->top_join_list);
|
||||
/*
|
||||
Currently 'view_main_select_tables' differs from 'view_tables'
|
||||
only then view has CONVERT_TZ() function in its select list.
|
||||
This may change in future, for example if we enable merging
|
||||
of views with subqueries in select list.
|
||||
*/
|
||||
TABLE_LIST *view_main_select_tables=
|
||||
(TABLE_LIST*)lex->select_lex.table_list.first;
|
||||
/* lex should contain at least one table */
|
||||
DBUG_ASSERT(view_tables != 0);
|
||||
DBUG_ASSERT(view_main_select_tables != 0);
|
||||
|
||||
table->effective_algorithm= VIEW_ALGORITHM_MERGE;
|
||||
DBUG_PRINT("info", ("algorithm: MERGE"));
|
||||
table->updatable= (table->updatable_view != 0);
|
||||
table->effective_with_check=
|
||||
old_lex->get_effective_with_check(table);
|
||||
table->merge_underlying_list= view_tables;
|
||||
table->merge_underlying_list= view_main_select_tables;
|
||||
/*
|
||||
Let us set proper lock type for tables of the view's main select
|
||||
since we may want to perform update or insert on view. This won't
|
||||
|
@ -1083,7 +1091,7 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table)
|
|||
}
|
||||
|
||||
/* prepare view context */
|
||||
lex->select_lex.context.resolve_in_table_list_only(view_tables);
|
||||
lex->select_lex.context.resolve_in_table_list_only(view_main_select_tables);
|
||||
lex->select_lex.context.outer_context= 0;
|
||||
lex->select_lex.context.select_lex= table->select_lex;
|
||||
lex->select_lex.select_n_having_items+=
|
||||
|
@ -1099,7 +1107,7 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table)
|
|||
tbl->select_lex= table->select_lex;
|
||||
|
||||
{
|
||||
if (view_tables->next_local)
|
||||
if (view_main_select_tables->next_local)
|
||||
{
|
||||
table->multitable_view= TRUE;
|
||||
if (table->belong_to_view)
|
||||
|
|
|
@ -317,7 +317,6 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||
%token GEOMFROMWKB
|
||||
%token GET_FORMAT
|
||||
%token GLOBAL_SYM
|
||||
%token GOTO_SYM
|
||||
%token GRANT
|
||||
%token GRANTS
|
||||
%token GREATEST_SYM
|
||||
|
@ -1691,8 +1690,6 @@ create_function_tail:
|
|||
if (sp->is_not_allowed_in_function("function"))
|
||||
YYABORT;
|
||||
|
||||
if (sp->check_backpatch(YYTHD))
|
||||
YYABORT;
|
||||
lex->sql_command= SQLCOM_CREATE_SPFUNCTION;
|
||||
sp->init_strings(YYTHD, lex, lex->spname);
|
||||
if (!(sp->m_flags & sp_head::HAS_RETURN))
|
||||
|
@ -11064,8 +11061,6 @@ sp_tail:
|
|||
LEX *lex= Lex;
|
||||
sp_head *sp= lex->sphead;
|
||||
|
||||
if (sp->check_backpatch(YYTHD))
|
||||
YYABORT;
|
||||
sp->init_strings(YYTHD, lex, $3);
|
||||
lex->sql_command= SQLCOM_CREATE_PROCEDURE;
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue