diff options
author | unknown <pem@mysql.com> | 2006-01-17 12:44:51 +0100 |
---|---|---|
committer | unknown <pem@mysql.com> | 2006-01-17 12:44:51 +0100 |
commit | a1187b7123b3e0a380efe33a8f255f9a15976e4b (patch) | |
tree | 1540fdb20ca903664095813a3f691a2f85ff11bb | |
parent | 21e29cff1b10be9148c07b4a6f9e2b16397b8c7a (diff) | |
parent | 2111e2035be48f1a6b40f995d1eef304a1a01ff8 (diff) | |
download | mariadb-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.result | 74 | ||||
-rw-r--r-- | mysql-test/t/sp.test | 82 | ||||
-rw-r--r-- | sql/sp_rcontext.cc | 23 |
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; } |