From 95dcdde134c93a0d183b9d8cf09d3d3f7fa08eb5 Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Mon, 5 Apr 2004 17:01:19 +0200 Subject: [PATCH] Fixed BUG#3287: Stored procedure handler scope outside of begin/end. Backpatching overwrote already backpatched instructions, which made it skip the hpop instruction; possibly not only a problem for handlers, but this is one known case when it happened. --- mysql-test/r/sp-error.result | 26 +++++++++++++++++++++++++- mysql-test/t/sp-error.test | 33 ++++++++++++++++++++++++++++++++- sql/sp_head.cc | 6 ++++-- sql/sp_head.h | 5 +++-- 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index a48256e6824..05e9379dd79 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -295,7 +295,7 @@ create function bug1654() returns int return (select sum(t.data) from test.t2 t)| ERROR 0A000: Statements like SELECT, INSERT, UPDATE (and others) are not allowed in a FUNCTION -drop table if exists table_1| +drop table if exists t3| create table t3 (column_1_0 int)| create procedure bug1653() update t3 set column_1 = 0| @@ -362,4 +362,28 @@ 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| drop table t1| diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index ad96d0b403b..03ab44b3e46 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -400,7 +400,7 @@ return (select sum(t.data) from test.t2 t)| # BUG#1653 # --disable_warnings -drop table if exists table_1| +drop table if exists t3| --enable_warnings create table t3 (column_1_0 int)| @@ -500,6 +500,37 @@ end case| call bug3287(2)| drop procedure bug3287| + +# +# BUG#3297 +# +--disable_warnings +drop table if exists t3| +--enable_warnings +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| +--error 1062 +call bug3279(@x)| +select @x| +drop procedure bug3279| +drop table t3| + drop table t1| delimiter ;| diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 4c883d4cd3d..dfc3e8190fe 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1144,10 +1144,12 @@ sp_instr_hpush_jump::print(String *str) { str->reserve(32); str->append("hpush_jump "); + str->qs_append(m_dest); + str->append(" t="); str->qs_append(m_type); - str->append(' '); + str->append(" f="); str->qs_append(m_frame); - str->append(' '); + str->append(" h="); str->qs_append(m_handler); } diff --git a/sql/sp_head.h b/sql/sp_head.h index 19d1cb8254a..3aebd80d686 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -351,7 +351,7 @@ class sp_instr_jump : public sp_instr public: sp_instr_jump(uint ip) - : sp_instr(ip) + : sp_instr(ip), m_dest(0) {} sp_instr_jump(uint ip, uint dest) @@ -368,7 +368,8 @@ public: virtual void set_destination(uint dest) { - m_dest= dest; + if (m_dest == 0) // Don't reset + m_dest= dest; } protected: