Fixed BUG#13729 Stored procedures: packet error after exception handled
Don't set thd->is_fatal_error in sql_update for duplicate key errors. mysql-test/r/sp.result: New test case for BUG#13729. mysql-test/r/sp_trans.result: New test case for BUG#14840. mysql-test/t/sp.test: New test case for BUG#13729. mysql-test/t/sp_trans.test: New test case for BUG#14840. sql/sql_update.cc: Don't set thd->is_fatal_error if it's a duplicate key error.
This commit is contained in:
parent
0026b6f46e
commit
b118282377
@ -3667,4 +3667,22 @@ call bug14845()|
|
||||
a
|
||||
0
|
||||
drop procedure bug14845|
|
||||
drop procedure if exists bug13729|
|
||||
drop table if exists t3|
|
||||
create table t3 (s1 int, primary key (s1))|
|
||||
insert into t3 values (1),(2)|
|
||||
create procedure bug13729()
|
||||
begin
|
||||
declare continue handler for sqlexception select 55;
|
||||
update t3 set s1 = 1;
|
||||
end|
|
||||
call bug13729()|
|
||||
55
|
||||
55
|
||||
select * from t3|
|
||||
s1
|
||||
1
|
||||
2
|
||||
drop procedure bug13729|
|
||||
drop table t3|
|
||||
drop table t1,t2;
|
||||
|
@ -369,3 +369,59 @@ drop procedure bug13825_0|
|
||||
drop procedure bug13825_1|
|
||||
drop procedure bug13825_2|
|
||||
drop table t1, t2|
|
||||
drop table if exists t3|
|
||||
drop procedure if exists bug14840_1|
|
||||
drop procedure if exists bug14840_2|
|
||||
create table t3
|
||||
(
|
||||
x int,
|
||||
y int,
|
||||
primary key (x)
|
||||
) engine=InnoDB|
|
||||
create procedure bug14840_1()
|
||||
begin
|
||||
declare err int default 0;
|
||||
declare continue handler for sqlexception
|
||||
set err = err + 1;
|
||||
start transaction;
|
||||
update t3 set x = 1, y = 42 where x = 2;
|
||||
insert into t3 values (3, 4711);
|
||||
if err > 0 then
|
||||
rollback;
|
||||
else
|
||||
commit;
|
||||
end if;
|
||||
select * from t3;
|
||||
end|
|
||||
create procedure bug14840_2()
|
||||
begin
|
||||
declare err int default 0;
|
||||
declare continue handler for sqlexception
|
||||
begin
|
||||
set err = err + 1;
|
||||
select err as 'Ping';
|
||||
end;
|
||||
update t3 set x = 1, y = 42 where x = 2;
|
||||
update t3 set x = 1, y = 42 where x = 2;
|
||||
insert into t3 values (3, 4711);
|
||||
select * from t3;
|
||||
end|
|
||||
insert into t3 values (1, 3), (2, 5)|
|
||||
call bug14840_1()|
|
||||
x y
|
||||
1 3
|
||||
2 5
|
||||
delete from t3|
|
||||
insert into t3 values (1, 3), (2, 5)|
|
||||
call bug14840_2()|
|
||||
Ping
|
||||
1
|
||||
Ping
|
||||
2
|
||||
x y
|
||||
1 3
|
||||
2 5
|
||||
3 4711
|
||||
drop procedure bug14840_1|
|
||||
drop procedure bug14840_2|
|
||||
drop table t3|
|
||||
|
@ -4594,6 +4594,33 @@ end|
|
||||
call bug14845()|
|
||||
drop procedure bug14845|
|
||||
|
||||
#
|
||||
# BUG#13729: Stored procedures: packet error after exception handled
|
||||
#
|
||||
--disable_warnings
|
||||
drop procedure if exists bug13729|
|
||||
drop table if exists t3|
|
||||
--enable_warnings
|
||||
|
||||
create table t3 (s1 int, primary key (s1))|
|
||||
|
||||
insert into t3 values (1),(2)|
|
||||
|
||||
create procedure bug13729()
|
||||
begin
|
||||
declare continue handler for sqlexception select 55;
|
||||
|
||||
update t3 set s1 = 1;
|
||||
end|
|
||||
|
||||
call bug13729()|
|
||||
# Used to cause Packets out of order
|
||||
select * from t3|
|
||||
|
||||
drop procedure bug13729|
|
||||
drop table t3|
|
||||
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
|
@ -355,6 +355,70 @@ drop procedure bug13825_2|
|
||||
drop table t1, t2|
|
||||
|
||||
|
||||
#
|
||||
# BUG#14840: CONTINUE handler problem
|
||||
#
|
||||
--disable_warnings
|
||||
drop table if exists t3|
|
||||
drop procedure if exists bug14840_1|
|
||||
drop procedure if exists bug14840_2|
|
||||
--enable_warnings
|
||||
|
||||
create table t3
|
||||
(
|
||||
x int,
|
||||
y int,
|
||||
primary key (x)
|
||||
) engine=InnoDB|
|
||||
|
||||
# This used to hang the client since the insert returned with an
|
||||
# error status (left over from the update) even though it succeeded,
|
||||
# which caused the execution to end at that point.
|
||||
create procedure bug14840_1()
|
||||
begin
|
||||
declare err int default 0;
|
||||
declare continue handler for sqlexception
|
||||
set err = err + 1;
|
||||
|
||||
start transaction;
|
||||
update t3 set x = 1, y = 42 where x = 2;
|
||||
insert into t3 values (3, 4711);
|
||||
if err > 0 then
|
||||
rollback;
|
||||
else
|
||||
commit;
|
||||
end if;
|
||||
select * from t3;
|
||||
end|
|
||||
|
||||
# A simpler (non-transactional) case: insert at select should be done
|
||||
create procedure bug14840_2()
|
||||
begin
|
||||
declare err int default 0;
|
||||
declare continue handler for sqlexception
|
||||
begin
|
||||
set err = err + 1;
|
||||
select err as 'Ping';
|
||||
end;
|
||||
|
||||
update t3 set x = 1, y = 42 where x = 2;
|
||||
update t3 set x = 1, y = 42 where x = 2;
|
||||
insert into t3 values (3, 4711);
|
||||
select * from t3;
|
||||
end|
|
||||
|
||||
insert into t3 values (1, 3), (2, 5)|
|
||||
call bug14840_1()|
|
||||
|
||||
delete from t3|
|
||||
insert into t3 values (1, 3), (2, 5)|
|
||||
call bug14840_2()|
|
||||
|
||||
drop procedure bug14840_1|
|
||||
drop procedure bug14840_2|
|
||||
drop table t3|
|
||||
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
|
@ -465,7 +465,12 @@ int mysql_update(THD *thd,
|
||||
}
|
||||
else if (!ignore || error != HA_ERR_FOUND_DUPP_KEY)
|
||||
{
|
||||
thd->fatal_error(); // Force error message
|
||||
/*
|
||||
If (ignore && error == HA_ERR_FOUND_DUPP_KEY) we don't have to
|
||||
do anything; otherwise...
|
||||
*/
|
||||
if (error != HA_ERR_FOUND_DUPP_KEY)
|
||||
thd->fatal_error(); /* Other handler errors are fatal */
|
||||
table->file->print_error(error,MYF(0));
|
||||
error= 1;
|
||||
break;
|
||||
@ -1259,7 +1264,12 @@ bool multi_update::send_data(List<Item> ¬_used_values)
|
||||
updated--;
|
||||
if (!ignore || error != HA_ERR_FOUND_DUPP_KEY)
|
||||
{
|
||||
thd->fatal_error(); // Force error message
|
||||
/*
|
||||
If (ignore && error == HA_ERR_FOUND_DUPP_KEY) we don't have to
|
||||
do anything; otherwise...
|
||||
*/
|
||||
if (error != HA_ERR_FOUND_DUPP_KEY)
|
||||
thd->fatal_error(); /* Other handler errors are fatal */
|
||||
table->file->print_error(error,MYF(0));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user