Skip to content

Commit 62a3470

Browse files
author
thek@adventure.(none)
committed
Merge adventure.(none):/home/thek/Development/cpp/bug26977/my50-bug26977
into adventure.(none):/home/thek/Development/cpp/bug26977/my51-bug26977
2 parents 62fd6aa + ae10d3d commit 62a3470

File tree

4 files changed

+207
-3
lines changed

4 files changed

+207
-3
lines changed

mysql-test/r/sp-code.result

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,119 @@ SHOW PROCEDURE CODE p1;
620620
Pos Instruction
621621
0 stmt 2 "CREATE INDEX idx ON t1 (c1)"
622622
DROP PROCEDURE p1;
623+
drop table if exists t1;
624+
drop procedure if exists proc_26977_broken;
625+
drop procedure if exists proc_26977_works;
626+
create table t1(a int unique);
627+
create procedure proc_26977_broken(v int)
628+
begin
629+
declare i int default 5;
630+
declare continue handler for sqlexception
631+
begin
632+
select 'caught something';
633+
retry:
634+
while i > 0 do
635+
begin
636+
set i = i - 1;
637+
select 'looping', i;
638+
end;
639+
end while retry;
640+
end;
641+
select 'do something';
642+
insert into t1 values (v);
643+
select 'do something again';
644+
insert into t1 values (v);
645+
end//
646+
create procedure proc_26977_works(v int)
647+
begin
648+
declare i int default 5;
649+
declare continue handler for sqlexception
650+
begin
651+
select 'caught something';
652+
retry:
653+
while i > 0 do
654+
begin
655+
set i = i - 1;
656+
select 'looping', i;
657+
end;
658+
end while retry;
659+
select 'optimizer: keep hreturn';
660+
end;
661+
select 'do something';
662+
insert into t1 values (v);
663+
select 'do something again';
664+
insert into t1 values (v);
665+
end//
666+
show procedure code proc_26977_broken;
667+
Pos Instruction
668+
0 set i@1 5
669+
1 hpush_jump 8 2 CONTINUE
670+
2 stmt 0 "select 'caught something'"
671+
3 jump_if_not 7(7) (i@1 > 0)
672+
4 set i@1 (i@1 - 1)
673+
5 stmt 0 "select 'looping', i"
674+
6 jump 3
675+
7 hreturn 2
676+
8 stmt 0 "select 'do something'"
677+
9 stmt 5 "insert into t1 values (v)"
678+
10 stmt 0 "select 'do something again'"
679+
11 stmt 5 "insert into t1 values (v)"
680+
12 hpop 1
681+
show procedure code proc_26977_works;
682+
Pos Instruction
683+
0 set i@1 5
684+
1 hpush_jump 9 2 CONTINUE
685+
2 stmt 0 "select 'caught something'"
686+
3 jump_if_not 7(7) (i@1 > 0)
687+
4 set i@1 (i@1 - 1)
688+
5 stmt 0 "select 'looping', i"
689+
6 jump 3
690+
7 stmt 0 "select 'optimizer: keep hreturn'"
691+
8 hreturn 2
692+
9 stmt 0 "select 'do something'"
693+
10 stmt 5 "insert into t1 values (v)"
694+
11 stmt 0 "select 'do something again'"
695+
12 stmt 5 "insert into t1 values (v)"
696+
13 hpop 1
697+
call proc_26977_broken(1);
698+
do something
699+
do something
700+
do something again
701+
do something again
702+
caught something
703+
caught something
704+
looping i
705+
looping 4
706+
looping i
707+
looping 3
708+
looping i
709+
looping 2
710+
looping i
711+
looping 1
712+
looping i
713+
looping 0
714+
call proc_26977_works(2);
715+
do something
716+
do something
717+
do something again
718+
do something again
719+
caught something
720+
caught something
721+
looping i
722+
looping 4
723+
looping i
724+
looping 3
725+
looping i
726+
looping 2
727+
looping i
728+
looping 1
729+
looping i
730+
looping 0
731+
optimizer: keep hreturn
732+
optimizer: keep hreturn
733+
drop table t1;
734+
drop procedure proc_26977_broken;
735+
drop procedure proc_26977_works;
623736
End of 5.0 tests.
624737
CREATE PROCEDURE p1()
625738
BEGIN

mysql-test/t/sp-code.test

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,81 @@ SHOW PROCEDURE CODE p1;
446446
DROP PROCEDURE p1;
447447

448448

449+
#
450+
# Bug#26977 exception handlers never hreturn
451+
#
452+
--disable_warnings
453+
drop table if exists t1;
454+
drop procedure if exists proc_26977_broken;
455+
drop procedure if exists proc_26977_works;
456+
--enable_warnings
457+
458+
create table t1(a int unique);
459+
460+
delimiter //;
461+
462+
create procedure proc_26977_broken(v int)
463+
begin
464+
declare i int default 5;
465+
466+
declare continue handler for sqlexception
467+
begin
468+
select 'caught something';
469+
retry:
470+
while i > 0 do
471+
begin
472+
set i = i - 1;
473+
select 'looping', i;
474+
end;
475+
end while retry;
476+
end;
477+
478+
select 'do something';
479+
insert into t1 values (v);
480+
select 'do something again';
481+
insert into t1 values (v);
482+
end//
483+
484+
create procedure proc_26977_works(v int)
485+
begin
486+
declare i int default 5;
487+
488+
declare continue handler for sqlexception
489+
begin
490+
select 'caught something';
491+
retry:
492+
while i > 0 do
493+
begin
494+
set i = i - 1;
495+
select 'looping', i;
496+
end;
497+
end while retry;
498+
select 'optimizer: keep hreturn';
499+
end;
500+
501+
select 'do something';
502+
insert into t1 values (v);
503+
select 'do something again';
504+
insert into t1 values (v);
505+
end//
506+
delimiter ;//
507+
508+
show procedure code proc_26977_broken;
509+
510+
show procedure code proc_26977_works;
511+
512+
## This caust an error because of jump short cut
513+
## optimization.
514+
call proc_26977_broken(1);
515+
516+
## This works
517+
call proc_26977_works(2);
518+
519+
drop table t1;
520+
drop procedure proc_26977_broken;
521+
drop procedure proc_26977_works;
522+
523+
449524
--echo End of 5.0 tests.
450525

451526
#

sql/sp_head.cc

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3047,10 +3047,20 @@ sp_instr_hreturn::print(String *str)
30473047
uint
30483048
sp_instr_hreturn::opt_mark(sp_head *sp, List<sp_instr> *leads)
30493049
{
3050-
if (m_dest)
3051-
return sp_instr_jump::opt_mark(sp, leads);
3052-
30533050
marked= 1;
3051+
3052+
if (m_dest)
3053+
{
3054+
/*
3055+
This is an EXIT handler; next instruction step is in m_dest.
3056+
*/
3057+
return m_dest;
3058+
}
3059+
3060+
/*
3061+
This is a CONTINUE handler; next instruction step will come from
3062+
the handler stack and not from opt_mark.
3063+
*/
30543064
return UINT_MAX;
30553065
}
30563066

sql/sp_head.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,12 @@ class sp_instr_hreturn : public sp_instr_jump
992992

993993
virtual void print(String *str);
994994

995+
/* This instruction will not be short cut optimized. */
996+
virtual uint opt_shortcut_jump(sp_head *sp, sp_instr *start)
997+
{
998+
return m_ip;
999+
}
1000+
9951001
virtual uint opt_mark(sp_head *sp, List<sp_instr> *leads);
9961002

9971003
private:

0 commit comments

Comments
 (0)