Loading mysql-test/r/sp.result +55 −19 Original line number Diff line number Diff line Loading @@ -3554,8 +3554,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 )| Loading @@ -3580,18 +3578,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 Loading Loading @@ -3621,9 +3607,6 @@ Caught it select * from t3| x 42 call bug7049_6()| Result Caught it select bug7049_2()| bug7049_2() 1 Loading @@ -3632,8 +3615,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| Loading Loading @@ -4315,4 +4296,59 @@ id county 2 NULL drop table t3| drop procedure bug15441| 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; mysql-test/t/sp.test +62 −21 Original line number Diff line number Diff line Loading @@ -4297,8 +4297,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 Loading Loading @@ -4332,22 +4330,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 Loading @@ -4372,7 +4354,6 @@ select * from t3| delete from t3| call bug7049_4()| select * from t3| call bug7049_6()| select bug7049_2()| drop table t3| Loading @@ -4380,8 +4361,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| Loading Loading @@ -5069,6 +5048,68 @@ call bug15441('Yale')| drop table t3| drop procedure bug15441| # # 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 # Loading sql/sp_rcontext.cc +16 −7 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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' || 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; Loading @@ -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; } Loading Loading
mysql-test/r/sp.result +55 −19 Original line number Diff line number Diff line Loading @@ -3554,8 +3554,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 )| Loading @@ -3580,18 +3578,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 Loading Loading @@ -3621,9 +3607,6 @@ Caught it select * from t3| x 42 call bug7049_6()| Result Caught it select bug7049_2()| bug7049_2() 1 Loading @@ -3632,8 +3615,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| Loading Loading @@ -4315,4 +4296,59 @@ id county 2 NULL drop table t3| drop procedure bug15441| 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;
mysql-test/t/sp.test +62 −21 Original line number Diff line number Diff line Loading @@ -4297,8 +4297,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 Loading Loading @@ -4332,22 +4330,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 Loading @@ -4372,7 +4354,6 @@ select * from t3| delete from t3| call bug7049_4()| select * from t3| call bug7049_6()| select bug7049_2()| drop table t3| Loading @@ -4380,8 +4361,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| Loading Loading @@ -5069,6 +5048,68 @@ call bug15441('Yale')| drop table t3| drop procedure bug15441| # # 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 # Loading
sql/sp_rcontext.cc +16 −7 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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' || 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; Loading @@ -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; } Loading