summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <pem@mysql.com>2006-01-17 12:44:51 +0100
committerunknown <pem@mysql.com>2006-01-17 12:44:51 +0100
commita1187b7123b3e0a380efe33a8f255f9a15976e4b (patch)
tree1540fdb20ca903664095813a3f691a2f85ff11bb
parent21e29cff1b10be9148c07b4a6f9e2b16397b8c7a (diff)
parent2111e2035be48f1a6b40f995d1eef304a1a01ff8 (diff)
downloadmariadb-git-a1187b7123b3e0a380efe33a8f255f9a15976e4b.tar.gz
Merge mysql.com:/extern/mysql/bk/mysql-5.0
into mysql.com:/extern/mysql/work/bug15231/mysql-5.0 mysql-test/r/sp.result: Manual merge. mysql-test/t/sp.test: Manual merge.
-rw-r--r--mysql-test/r/sp.result74
-rw-r--r--mysql-test/t/sp.test82
-rw-r--r--sql/sp_rcontext.cc23
3 files changed, 132 insertions, 47 deletions
diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result
index 238fd53c860..4c2f7b7f03b 100644
--- a/mysql-test/r/sp.result
+++ b/mysql-test/r/sp.result
@@ -3624,8 +3624,6 @@ drop procedure if exists bug7049_1|
drop procedure if exists bug7049_2|
drop procedure if exists bug7049_3|
drop procedure if exists bug7049_4|
-drop procedure if exists bug7049_5|
-drop procedure if exists bug7049_6|
drop function if exists bug7049_1|
drop function if exists bug7049_2|
create table t3 ( x int unique )|
@@ -3650,18 +3648,6 @@ select 'Caught it' as 'Result';
call bug7049_3();
select 'Missed it' as 'Result';
end|
-create procedure bug7049_5()
-begin
-declare x decimal(2,1);
-set x = 'zap';
-end|
-create procedure bug7049_6()
-begin
-declare exit handler for sqlwarning
-select 'Caught it' as 'Result';
-call bug7049_5();
-select 'Missed it' as 'Result';
-end|
create function bug7049_1()
returns int
begin
@@ -3691,9 +3677,6 @@ Caught it
select * from t3|
x
42
-call bug7049_6()|
-Result
-Caught it
select bug7049_2()|
bug7049_2()
1
@@ -3702,8 +3685,6 @@ drop procedure bug7049_1|
drop procedure bug7049_2|
drop procedure bug7049_3|
drop procedure bug7049_4|
-drop procedure bug7049_5|
-drop procedure bug7049_6|
drop function bug7049_1|
drop function bug7049_2|
drop function if exists bug13941|
@@ -4471,4 +4452,59 @@ drop procedure bug14498_2|
drop procedure bug14498_3|
drop procedure bug14498_4|
drop procedure bug14498_5|
+drop table if exists t3|
+drop procedure if exists bug15231_1|
+drop procedure if exists bug15231_2|
+drop procedure if exists bug15231_3|
+drop procedure if exists bug15231_4|
+create table t3 (id int not null)|
+create procedure bug15231_1()
+begin
+declare xid integer;
+declare xdone integer default 0;
+declare continue handler for not found set xdone = 1;
+set xid=null;
+call bug15231_2(xid);
+select xid, xdone;
+end|
+create procedure bug15231_2(inout ioid integer)
+begin
+select "Before NOT FOUND condition is triggered" as '1';
+select id into ioid from t3 where id=ioid;
+select "After NOT FOUND condtition is triggered" as '2';
+if ioid is null then
+set ioid=1;
+end if;
+end|
+create procedure bug15231_3()
+begin
+declare exit handler for sqlwarning
+select 'Caught it (wrong)' as 'Result';
+call bug15231_4();
+end|
+create procedure bug15231_4()
+begin
+declare x decimal(2,1);
+set x = 'zap';
+select 'Missed it (correct)' as 'Result';
+end|
+call bug15231_1()|
+1
+Before NOT FOUND condition is triggered
+2
+After NOT FOUND condtition is triggered
+xid xdone
+1 0
+Warnings:
+Warning 1329 No data to FETCH
+call bug15231_3()|
+Result
+Missed it (correct)
+Warnings:
+Warning 1366 Incorrect decimal value: 'zap' for column 'x' at row 1
+drop table if exists t3|
+drop procedure if exists bug15231_1|
+drop procedure if exists bug15231_2|
+drop procedure if exists bug15231_3|
+drop procedure if exists bug15231_4|
drop table t1,t2;
diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test
index b5751c6da63..68ce9cdb118 100644
--- a/mysql-test/t/sp.test
+++ b/mysql-test/t/sp.test
@@ -4364,8 +4364,6 @@ drop procedure if exists bug7049_1|
drop procedure if exists bug7049_2|
drop procedure if exists bug7049_3|
drop procedure if exists bug7049_4|
-drop procedure if exists bug7049_5|
-drop procedure if exists bug7049_6|
drop function if exists bug7049_1|
drop function if exists bug7049_2|
--enable_warnings
@@ -4399,22 +4397,6 @@ begin
select 'Missed it' as 'Result';
end|
-create procedure bug7049_5()
-begin
- declare x decimal(2,1);
-
- set x = 'zap';
-end|
-
-create procedure bug7049_6()
-begin
- declare exit handler for sqlwarning
- select 'Caught it' as 'Result';
-
- call bug7049_5();
- select 'Missed it' as 'Result';
-end|
-
create function bug7049_1()
returns int
begin
@@ -4439,7 +4421,6 @@ select * from t3|
delete from t3|
call bug7049_4()|
select * from t3|
-call bug7049_6()|
select bug7049_2()|
drop table t3|
@@ -4447,8 +4428,6 @@ drop procedure bug7049_1|
drop procedure bug7049_2|
drop procedure bug7049_3|
drop procedure bug7049_4|
-drop procedure bug7049_5|
-drop procedure bug7049_6|
drop function bug7049_1|
drop function bug7049_2|
@@ -5243,6 +5222,67 @@ drop procedure bug14498_4|
drop procedure bug14498_5|
#
+# BUG#15231: Stored procedure bug with not found condition handler
+#
+--disable_warnings
+drop table if exists t3|
+drop procedure if exists bug15231_1|
+drop procedure if exists bug15231_2|
+drop procedure if exists bug15231_3|
+drop procedure if exists bug15231_4|
+--enable_warnings
+
+create table t3 (id int not null)|
+
+create procedure bug15231_1()
+begin
+ declare xid integer;
+ declare xdone integer default 0;
+ declare continue handler for not found set xdone = 1;
+
+ set xid=null;
+ call bug15231_2(xid);
+ select xid, xdone;
+end|
+
+create procedure bug15231_2(inout ioid integer)
+begin
+ select "Before NOT FOUND condition is triggered" as '1';
+ select id into ioid from t3 where id=ioid;
+ select "After NOT FOUND condtition is triggered" as '2';
+
+ if ioid is null then
+ set ioid=1;
+ end if;
+end|
+
+create procedure bug15231_3()
+begin
+ declare exit handler for sqlwarning
+ select 'Caught it (wrong)' as 'Result';
+
+ call bug15231_4();
+end|
+
+create procedure bug15231_4()
+begin
+ declare x decimal(2,1);
+
+ set x = 'zap';
+ select 'Missed it (correct)' as 'Result';
+end|
+
+call bug15231_1()|
+call bug15231_3()|
+
+drop table if exists t3|
+drop procedure if exists bug15231_1|
+drop procedure if exists bug15231_2|
+drop procedure if exists bug15231_3|
+drop procedure if exists bug15231_4|
+
+
+#
# BUG#NNNN: New bug synopsis
#
#--disable_warnings
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc
index eca87e69f8e..c36c904f45d 100644
--- a/sql/sp_rcontext.cc
+++ b/sql/sp_rcontext.cc
@@ -160,6 +160,10 @@ sp_rcontext::set_return_value(THD *thd, Item *return_value_item)
}
+#define IS_WARNING_CONDITION(S) ((S)[0] == '0' && (S)[1] == '1')
+#define IS_NOT_FOUND_CONDITION(S) ((S)[0] == '0' && (S)[1] == '2')
+#define IS_EXCEPTION_CONDITION(S) ((S)[0] != '0' || (S)[1] > '2')
+
bool
sp_rcontext::find_handler(uint sql_errno,
MYSQL_ERROR::enum_warning_level level)
@@ -193,18 +197,17 @@ sp_rcontext::find_handler(uint sql_errno,
found= i;
break;
case sp_cond_type_t::warning:
- if ((sqlstate[0] == '0' && sqlstate[1] == '1' ||
- level == MYSQL_ERROR::WARN_LEVEL_WARN) &&
- found < 0)
+ if ((IS_WARNING_CONDITION(sqlstate) ||
+ level == MYSQL_ERROR::WARN_LEVEL_WARN) &&
+ found < 0)
found= i;
break;
case sp_cond_type_t::notfound:
- if (sqlstate[0] == '0' && sqlstate[1] == '2' &&
- found < 0)
+ if (IS_NOT_FOUND_CONDITION(sqlstate) && found < 0)
found= i;
break;
case sp_cond_type_t::exception:
- if ((sqlstate[0] != '0' || sqlstate[1] > '2') &&
+ if (IS_EXCEPTION_CONDITION(sqlstate) &&
level == MYSQL_ERROR::WARN_LEVEL_ERROR &&
found < 0)
found= i;
@@ -213,7 +216,13 @@ sp_rcontext::find_handler(uint sql_errno,
}
if (found < 0)
{
- if (m_prev_runtime_ctx)
+ /*
+ Only "exception conditions" are propagated to handlers in calling
+ contexts. If no handler is found locally for a "completion condition"
+ (warning or "not found") we will simply resume execution.
+ */
+ if (m_prev_runtime_ctx && IS_EXCEPTION_CONDITION(sqlstate) &&
+ level == MYSQL_ERROR::WARN_LEVEL_ERROR)
return m_prev_runtime_ctx->find_handler(sql_errno, level);
return FALSE;
}