summaryrefslogtreecommitdiff
path: root/mysql-test/t/sp.test
diff options
context:
space:
mode:
authorunknown <konstantin@mysql.com>2005-08-19 17:03:21 +0400
committerunknown <konstantin@mysql.com>2005-08-19 17:03:21 +0400
commit276bd123b7b9cf516c8ddd7a28952f6e1275aa8c (patch)
tree26a81b589a2bfea1429209a300325def59f036f8 /mysql-test/t/sp.test
parent1568be583be2a715994967679fe418eec174a311 (diff)
downloadmariadb-git-276bd123b7b9cf516c8ddd7a28952f6e1275aa8c.tar.gz
A fix and a test case for "Bug #12168 'DECLARE CONTINUE HANDLER FOR
NOT FOUND ...' in conditional handled incorrectly". Whenever we remove an instruction during optimization, we need to adjust instruction numbers (ip - instruction pointer) stored in all instructions. In addition to that, sp_instr_hpush_jump, which corresponds to DECLARE CONTINUE HANDLER needs adjustment for m_handler, which holds the number of instruction with the continue handler. In the bug report, a wrong ip stored in m_handler was pointing at FETCH, which resulted in an error message and abnormal SP termination. The fix is to just remove m_handler member from sp_instr_hpush_jump, as it's always points to the instruction next to the DECLARE statement itself (m_ip+1). mysql-test/r/sp.result: Test results fixed (Bug#12168) mysql-test/t/sp.test: A test case for Bug#12168 "'DECLARE CONTINUE HANDLER FOR NOT FOUND ...' in conditional handled incorrectly" sql/sp_head.cc: Remove m_handler (the number of continue handler instruction) as it always equal to m_ip+1 sql/sp_head.h: Remove m_handler (the number of continue handler instruction) as it always equal to m_ip+1
Diffstat (limited to 'mysql-test/t/sp.test')
-rw-r--r--mysql-test/t/sp.test66
1 files changed, 66 insertions, 0 deletions
diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test
index cde5d3922ab..f3e7c3e07a0 100644
--- a/mysql-test/t/sp.test
+++ b/mysql-test/t/sp.test
@@ -3928,6 +3928,72 @@ end|
call p_bug11247(10)|
drop function f_bug11247|
drop procedure p_bug11247|
+#
+# BUG#12168: "'DECLARE CONTINUE HANDLER FOR NOT FOUND ...' in conditional
+# handled incorrectly"
+#
+--disable_warnings
+drop procedure if exists bug12168|
+drop table if exists t1, t2|
+--enable_warnings
+
+create table t1 (a int)|
+insert into t1 values (1),(2),(3),(4)|
+
+create table t2 (a int)|
+
+create procedure bug12168(arg1 char(1))
+begin
+ declare b, c integer;
+ if arg1 = 'a' then
+ begin
+ declare c1 cursor for select a from t1 where a % 2;
+ declare continue handler for not found set b = 1;
+ set b = 0;
+ open c1;
+ c1_repeat: repeat
+ fetch c1 into c;
+ if (b = 1) then
+ leave c1_repeat;
+ end if;
+
+ insert into t2 values (c);
+ until b = 1
+ end repeat;
+ end;
+ end if;
+ if arg1 = 'b' then
+ begin
+ declare c2 cursor for select a from t1 where not a % 2;
+ declare continue handler for not found set b = 1;
+ set b = 0;
+ open c2;
+ c2_repeat: repeat
+ fetch c2 into c;
+ if (b = 1) then
+ leave c2_repeat;
+ end if;
+
+ insert into t2 values (c);
+ until b = 1
+ end repeat;
+ end;
+ end if;
+end|
+
+call bug12168('a')|
+select * from t2|
+truncate t2|
+call bug12168('b')|
+select * from t2|
+truncate t2|
+call bug12168('a')|
+select * from t2|
+truncate t2|
+call bug12168('b')|
+select * from t2|
+truncate t2|
+drop procedure if exists bug12168|
#
# BUG#NNNN: New bug synopsis