List:Commits« Previous MessageNext Message »
From:Konstantin Osipov Date:April 20 2008 2:33pm
Subject:Re: bk commit into 6.0 tree (davi:1.2618) BUG#23032
View as plain text  
* Davi Arnaut <davi@stripped> [08/04/18 17:34]:
> Below is the list of changes that have just been committed into a local
> 6.0 repository of davi.  When davi does a push these changes
> will be propagated to the main repository and, within 24 hours after the
> push, to the public repository.
> For information on how to access the public repository
> see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
> 
> ChangeSet@stripped, 2008-04-18 08:39:09-03:00, davi@stripped +18 -0
>   Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
>   
>   The problem is that warnings generated by a statement executed
>   inside a stored procedure should only invoke handlers in the
>   calling context, unless the warning is generated by the last
>   statement of the stored procedure.

Please indicate in the changeset comment that the patch contains
an incompatible change and explain the nature of the change for
the documentation team.

>   
>   The solution is to prepare the environment before the execution
>   of procedure statements and tightly control if warning were generated
>   during the execution of the statement. Also handlers now are only
>   called for handling warnings generated in the calling context of the
>   executed statement, unless it's the last statement of the stored
>   procedure.
>   
>   Now statements executed inside stored procedure fallow the same
>   rules as non-sp statements with respect to effects on the message
>   list (refer to SHOW WARNINGS manual entry for more details).
>   
>   Bug#36185: Incorrect precedence for warning and exception handlers
>   
>   The problem is that MySQL calls the handler for the first signaled
>   condition during the execution of a stored procedure statement,
>   meaning that if a warning is signaled first, it will search for a
>   handler at that point and if a handler is found it won't look further
>   for other handlers even if new warning/exception conditions occur.
>   
>   The solution is to look for handler only at the end of the execution
>   of a statement. At the end, it looks first for error and not found
>   conditions. If the execution completed successfully (no errors)
>   but warnings were generated, it searches for a single handler in a
>   first generated first served schema.
> 
>   mysql-test/r/partition.result@stripped, 2008-04-18 08:39:04-03:00, davi@stripped +0
> -5
>     Update test case result which reflects new rules for
>     reset of the message list inside stored procedures.
> 
>   mysql-test/r/sp-dynamic.result@stripped, 2008-04-18 08:39:04-03:00, davi@stripped +0
> -8
>     Update test case result which reflects new rules for
>     reset of the message list inside stored procedures.
> 
>   mysql-test/r/sp-error.result@stripped, 2008-04-18 08:39:04-03:00, davi@stripped +87
> -0
>     Add test case result for Bug#23032 and Bug#36185
> 
>   mysql-test/r/sp-prelocking.result@stripped, 2008-04-18 08:39:04-03:00, davi@stripped
> +0 -6
>     Update test case result which reflects new rules for
>     reset of the message list inside stored procedures.
> 
>   mysql-test/r/sp-vars.result@stripped, 2008-04-18 08:39:05-03:00, davi@stripped +0 -96
>     Update test case result which reflects new rules for
>     reset of the message list inside stored procedures.
> 
>   mysql-test/r/sp.result@stripped, 2008-04-18 08:39:05-03:00, davi@stripped +1 -91
>     Update test case result which reflects new rules for
>     reset of the message list inside stored procedures.
> 
>   mysql-test/r/trigger.result@stripped, 2008-04-18 08:39:05-03:00, davi@stripped +0 -12
>     Update test case result which reflects new rules for
>     reset of the message list inside stored procedures.
> 
>   mysql-test/r/view_grant.result@stripped, 2008-04-18 08:39:05-03:00, davi@stripped +0
> -8
>     Update test case result which reflects new rules for
>     reset of the message list inside stored procedures.
> 
>   mysql-test/suite/binlog/r/binlog_unsafe.result@stripped, 2008-04-18 08:39:05-03:00,
> davi@stripped +4 -30
>     Update test case result which reflects new rules for
>     reset of the message list inside stored procedures.
> 
>   mysql-test/t/sp-error.test@stripped, 2008-04-18 08:39:05-03:00, davi@stripped +104
> -0
>     Add test case for Bug#23032 and Bug#36185
> 
>   sql/mysqld.cc@stripped, 2008-04-18 08:39:05-03:00, davi@stripped +0 -17
>     Remove the internal error handler for stored procedures,
>     now warnings are always pushed and the search for handlers
>     is after the statement execution.
> 
>   sql/sp_head.cc@stripped, 2008-04-18 08:39:06-03:00, davi@stripped +77 -60
>     Reset the per-statement warning count before executing
>     a stored procedure instruction.
>     
>     Move to a separate function code which checks the
>     completion status of the executed statement and searches
>     for a handler.
>     
>     Remove redundant code now that search for a handler is
>     done after execution, errors are always pushed.
> 
>   sql/sp_rcontext.cc@stripped, 2008-04-18 08:39:06-03:00, davi@stripped +0 -40
>     Remove runtime error handler for SP and add helper function
>     which finds a handler for the current status of the diagnostics
>     area.
> 
>   sql/sp_rcontext.h@stripped, 2008-04-18 08:39:06-03:00, davi@stripped +0 -13
>     Remove handler_error method and now unnused
>     found_handler_here method.
> 
>   sql/sql_class.cc@stripped, 2008-04-18 08:39:06-03:00, davi@stripped +4 -7
>     Handlers now are searched for at the end of the
>     execution, default to abort when inside SP.
> 
>   sql/sql_error.cc@stripped, 2008-04-18 08:39:06-03:00, davi@stripped +0 -5
>     Remove SP runtime context error handler.
> 
>   sql/sql_parse.cc@stripped, 2008-04-18 08:39:06-03:00, davi@stripped +1 -1
>     Now reset of the message list follows same rules when 
>     executing inside stored procedures.
> 
>   sql/sql_prepare.cc@stripped, 2008-04-18 08:39:06-03:00, davi@stripped +1 -1
>     Now reset of the message list follows same rules when 
>     executing inside stored procedures.
> 
> diff -Nrup a/mysql-test/r/partition.result b/mysql-test/r/partition.result
> --- a/mysql-test/r/partition.result	2008-03-27 15:58:36 -03:00
> +++ b/mysql-test/r/partition.result	2008-04-18 08:39:04 -03:00
> @@ -816,12 +816,7 @@ ROLLBACK to savepoint t1_save;
>  COMMIT;
>  END|
>  CALL test.p1(12);
> -Warnings:
> -Note	1051	Unknown table 't1'
> -Warning	1196	Some non-transactional changed tables couldn't be rolled back
>  CALL test.p1(13);
> -Warnings:
> -Warning	1196	Some non-transactional changed tables couldn't be rolled back
>  drop table t1;
>  drop procedure test.p1;
>  CREATE TABLE t1 (a int not null)
> diff -Nrup a/mysql-test/r/sp-dynamic.result b/mysql-test/r/sp-dynamic.result
> --- a/mysql-test/r/sp-dynamic.result	2007-06-22 10:10:36 -03:00
> +++ b/mysql-test/r/sp-dynamic.result	2008-04-18 08:39:04 -03:00
> @@ -97,8 +97,6 @@ end|
>  call p1()|
>  a
>  1
> -Warnings:
> -Note	1051	Unknown table 't1'
>  call p1()|
>  a
>  1
> @@ -371,9 +369,6 @@ call p1(@a)|
>  create table t1 (a int)
>  @rsql
>  create table t2 (a int)
> -Warnings:
> -Note	1051	Unknown table 't1'
> -Note	1051	Unknown table 't2'
>  select @a|
>  @a
>  0
> @@ -382,9 +377,6 @@ call p1(@a)|
>  create table t1 (a int)
>  @rsql
>  create table t2 (a int)
> -Warnings:
> -Note	1051	Unknown table 't1'
> -Note	1051	Unknown table 't2'
>  select @a|
>  @a
>  0
> diff -Nrup a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result
> --- a/mysql-test/r/sp-error.result	2008-04-14 20:28:13 -03:00
> +++ b/mysql-test/r/sp-error.result	2008-04-18 08:39:04 -03:00
> @@ -1635,3 +1635,90 @@ end|
>  call p1(1);
>  set @@max_sp_recursion_depth = @old_recursion_depth;
>  drop procedure p1;
> +DROP PROCEDURE IF EXISTS p1;
> +DROP PROCEDURE IF EXISTS p2;
> +CREATE PROCEDURE p1()
> +BEGIN
> +SELECT CAST('10 ' as unsigned integer);
> +SELECT 1;
> +CALL p2();
> +END|
> +CREATE PROCEDURE p2()
> +BEGIN
> +SELECT CAST('10 ' as unsigned integer);
> +END|
> +CALL p1();
> +CAST('10 ' as unsigned integer)
> +10
> +1
> +1
> +CAST('10 ' as unsigned integer)
> +10
> +Warnings:
> +Warning	1292	Truncated incorrect INTEGER value: '10 '
> +DROP PROCEDURE p1;
> +DROP PROCEDURE p2;
> +DROP PROCEDURE IF EXISTS p1;
> +DROP PROCEDURE IF EXISTS p2;
> +DROP PROCEDURE IF EXISTS p3;
> +DROP PROCEDURE IF EXISTS p4;
> +CREATE PROCEDURE p1()
> +BEGIN
> +DECLARE c INT DEFAULT 0;
> +DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1;
> +CALL p2();
> +CALL p3();
> +CALL p4();
> +SELECT c;
> +SELECT @@warning_count;
> +SHOW WARNINGS;
> +END|
> +CREATE PROCEDURE p2()
> +BEGIN
> +SELECT CAST('10 ' as unsigned integer);
> +END|
> +CREATE PROCEDURE p3()
> +BEGIN
> +SELECT CAST('10 ' as unsigned integer);
> +SELECT 1;
> +END|
> +CREATE PROCEDURE p4()
> +BEGIN
> +SELECT CAST('10 ' as unsigned integer);
> +CALL p2();
> +END|
> +CALL p1();
> +CAST('10 ' as unsigned integer)
> +10
> +CAST('10 ' as unsigned integer)
> +10
> +1
> +1
> +CAST('10 ' as unsigned integer)
> +10
> +CAST('10 ' as unsigned integer)
> +10
> +c
> +2
> +@@warning_count
> +1
> +Level	Code	Message
> +Warning	1292	Truncated incorrect INTEGER value: '10 '
> +DROP PROCEDURE p1;
> +DROP PROCEDURE p2;
> +DROP PROCEDURE p3;
> +DROP PROCEDURE p4;
> +DROP TABLE IF EXISTS t1;
> +DROP PROCEDURE IF EXISTS p1;
> +CREATE TABLE t1 (a INT, b INT NOT NULL);
> +CREATE PROCEDURE p1()
> +BEGIN
> +DECLARE CONTINUE HANDLER FOR SQLWARNING SELECT 'warning';
> +DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT 'exception';
> +INSERT INTO T1 VALUES (CAST('10 ' AS SIGNED), NULL);
> +END|
> +CALL p1();
> +exception
> +exception
> +DROP TABLE t1;
> +DROP PROCEDURE p1;
> diff -Nrup a/mysql-test/r/sp-prelocking.result b/mysql-test/r/sp-prelocking.result
> --- a/mysql-test/r/sp-prelocking.result	2007-07-27 11:57:55 -03:00
> +++ b/mysql-test/r/sp-prelocking.result	2008-04-18 08:39:04 -03:00
> @@ -21,8 +21,6 @@ mysqltest
>  call sp1();
>  my-col
>  1
> -Warnings:
> -Note	1051	Unknown table 't1'
>  select database();
>  database()
>  mysqltest
> @@ -33,8 +31,6 @@ test
>  call mysqltest.sp1();
>  my-col
>  1
> -Warnings:
> -Note	1051	Unknown table 't1'
>  select database();
>  database()
>  test
> @@ -283,8 +279,6 @@ select f_bug22427();
>  f_bug22427()
>  1
>  create table if not exists t1 select f_bug22427() as i;
> -Warnings:
> -Note	1050	Table 't1' already exists
>  create table t1 select f_bug22427() as i;
>  ERROR 42S01: Table 't1' already exists
>  drop table t1;
> diff -Nrup a/mysql-test/r/sp-vars.result b/mysql-test/r/sp-vars.result
> --- a/mysql-test/r/sp-vars.result	2007-05-18 09:29:22 -03:00
> +++ b/mysql-test/r/sp-vars.result	2008-04-18 08:39:05 -03:00
> @@ -109,26 +109,6 @@ v7	v8	v9	v10	v11	v12	v13	v14	v15	v16
>  10	10	10	0	0	10	10	10	10	0
>  v17	v18	v19	v20
>  12.00	12.12	12.00	12.12
> -Warnings:
> -Warning	1264	Out of range value for column 'v1' at row 1
> -Warning	1264	Out of range value for column 'v1u' at row 1
> -Warning	1264	Out of range value for column 'v2' at row 1
> -Warning	1264	Out of range value for column 'v2u' at row 1
> -Warning	1264	Out of range value for column 'v3' at row 1
> -Warning	1264	Out of range value for column 'v3u' at row 1
> -Warning	1264	Out of range value for column 'v4' at row 1
> -Warning	1264	Out of range value for column 'v4u' at row 1
> -Warning	1264	Out of range value for column 'v5' at row 1
> -Warning	1264	Out of range value for column 'v5u' at row 1
> -Warning	1264	Out of range value for column 'v6' at row 1
> -Warning	1264	Out of range value for column 'v6u' at row 1
> -Warning	1366	Incorrect integer value: 'String 10 ' for column 'v10' at row 1
> -Warning	1366	Incorrect integer value: 'String10' for column 'v11' at row 1
> -Warning	1265	Data truncated for column 'v12' at row 1
> -Warning	1265	Data truncated for column 'v13' at row 1
> -Warning	1366	Incorrect integer value: 'Hello, world' for column 'v16' at row 1
> -Note	1265	Data truncated for column 'v18' at row 1
> -Note	1265	Data truncated for column 'v20' at row 1
>  CALL sp_vars_check_assignment();
>  i1	i2	i3	i4
>  127	-128	127	-128
> @@ -142,23 +122,6 @@ d1	d2	d3
>  1234.00	1234.12	1234.12
>  d1	d2	d3
>  1234.00	1234.12	1234.12
> -Warnings:
> -Warning	1264	Out of range value for column 'i1' at row 1
> -Warning	1264	Out of range value for column 'i2' at row 1
> -Warning	1264	Out of range value for column 'i3' at row 1
> -Warning	1264	Out of range value for column 'i4' at row 1
> -Warning	1264	Out of range value for column 'i1' at row 1
> -Warning	1264	Out of range value for column 'i2' at row 1
> -Warning	1264	Out of range value for column 'i3' at row 1
> -Warning	1264	Out of range value for column 'i4' at row 1
> -Warning	1264	Out of range value for column 'u1' at row 1
> -Warning	1264	Out of range value for column 'u2' at row 1
> -Warning	1264	Out of range value for column 'u3' at row 1
> -Warning	1264	Out of range value for column 'u4' at row 1
> -Warning	1264	Out of range value for column 'u1' at row 1
> -Warning	1264	Out of range value for column 'u2' at row 1
> -Note	1265	Data truncated for column 'd3' at row 1
> -Note	1265	Data truncated for column 'd3' at row 1
>  SELECT sp_vars_check_ret1();
>  sp_vars_check_ret1()
>  127
> @@ -197,26 +160,6 @@ v7	v8	v9	v10	v11	v12	v13	v14	v15	v16
>  10	10	10	0	0	10	10	10	10	0
>  v17	v18	v19	v20
>  12.00	12.12	12.00	12.12
> -Warnings:
> -Warning	1264	Out of range value for column 'v1' at row 1
> -Warning	1264	Out of range value for column 'v1u' at row 1
> -Warning	1264	Out of range value for column 'v2' at row 1
> -Warning	1264	Out of range value for column 'v2u' at row 1
> -Warning	1264	Out of range value for column 'v3' at row 1
> -Warning	1264	Out of range value for column 'v3u' at row 1
> -Warning	1264	Out of range value for column 'v4' at row 1
> -Warning	1264	Out of range value for column 'v4u' at row 1
> -Warning	1264	Out of range value for column 'v5' at row 1
> -Warning	1264	Out of range value for column 'v5u' at row 1
> -Warning	1264	Out of range value for column 'v6' at row 1
> -Warning	1264	Out of range value for column 'v6u' at row 1
> -Warning	1366	Incorrect integer value: 'String 10 ' for column 'v10' at row 1
> -Warning	1366	Incorrect integer value: 'String10' for column 'v11' at row 1
> -Warning	1265	Data truncated for column 'v12' at row 1
> -Warning	1265	Data truncated for column 'v13' at row 1
> -Warning	1366	Incorrect integer value: 'Hello, world' for column 'v16' at row 1
> -Note	1265	Data truncated for column 'v18' at row 1
> -Note	1265	Data truncated for column 'v20' at row 1
>  CALL sp_vars_check_assignment();
>  i1	i2	i3	i4
>  127	-128	127	-128
> @@ -230,23 +173,6 @@ d1	d2	d3
>  1234.00	1234.12	1234.12
>  d1	d2	d3
>  1234.00	1234.12	1234.12
> -Warnings:
> -Warning	1264	Out of range value for column 'i1' at row 1
> -Warning	1264	Out of range value for column 'i2' at row 1
> -Warning	1264	Out of range value for column 'i3' at row 1
> -Warning	1264	Out of range value for column 'i4' at row 1
> -Warning	1264	Out of range value for column 'i1' at row 1
> -Warning	1264	Out of range value for column 'i2' at row 1
> -Warning	1264	Out of range value for column 'i3' at row 1
> -Warning	1264	Out of range value for column 'i4' at row 1
> -Warning	1264	Out of range value for column 'u1' at row 1
> -Warning	1264	Out of range value for column 'u2' at row 1
> -Warning	1264	Out of range value for column 'u3' at row 1
> -Warning	1264	Out of range value for column 'u4' at row 1
> -Warning	1264	Out of range value for column 'u1' at row 1
> -Warning	1264	Out of range value for column 'u2' at row 1
> -Note	1265	Data truncated for column 'd3' at row 1
> -Note	1265	Data truncated for column 'd3' at row 1
>  SELECT sp_vars_check_ret1();
>  sp_vars_check_ret1()
>  127
> @@ -450,12 +376,6 @@ HEX(v9)
>  FF
>  HEX(v10)
>  FF
> -Warnings:
> -Warning	1264	Out of range value for column 'v8' at row 1
> -Warning	1264	Out of range value for column 'v9' at row 1
> -Warning	1264	Out of range value for column 'v10' at row 1
> -Warning	1264	Out of range value for column 'v1' at row 1
> -Warning	1264	Out of range value for column 'v5' at row 1
>  DROP PROCEDURE p1;

These tests were written for the warnings they generate.
Later I suggest that the warnings can not be simply removed -- the
test cases need to be changed to preserve the warnings.

>  
>  ---------------------------------------------------------------
> @@ -671,8 +591,6 @@ alpha	abc
>  CALL p1('alpha', 'abcdef');
>  x	y
>  alpha	abc
> -Warnings:
> -Warning	1265	Data truncated for column 'y' at row 1
>  DROP PROCEDURE p1;
>  
>  ---------------------------------------------------------------
> @@ -697,8 +615,6 @@ Table	Create Table
>  t1	CREATE TABLE "t1" (
>    "x" datetime DEFAULT NULL
>  )
> -Warnings:
> -Warning	1264	Out of range value for column 'x' at row 1
>  DROP PROCEDURE p1;
>  
>  ---------------------------------------------------------------
> @@ -887,8 +803,6 @@ var
>  CALL p1(1929.003);
>  var
>  1929.00
> -Warnings:
> -Note	1265	Data truncated for column 'arg' at row 1
>  DROP PROCEDURE p1;
>  
>  ---------------------------------------------------------------
> @@ -903,8 +817,6 @@ END|
>  SELECT f1(-2500);
>  f1(-2500)
>  0
> -Warnings:
> -Warning	1264	Out of range value for column 'arg' at row 1
>  SET @@sql_mode = 'traditional';
>  SELECT f1(-2500);
>  ERROR 22003: Out of range value for column 'arg' at row 1
> @@ -930,8 +842,6 @@ END|
>  SELECT f1(8388699);
>  f1(8388699)
>  8388607
> -Warnings:
> -Warning	1264	Out of range value for column 'arg' at row 1
>  SET @@sql_mode = 'traditional';
>  SELECT f1(8388699);
>  ERROR 22003: Out of range value for column 'arg' at row 1
> @@ -966,8 +876,6 @@ sp_var
>  0
>  @user_var
>  0
> -Warnings:
> -Warning	1366	Incorrect integer value: 'Hello, world!' for column 'sp_var' at row 1
>  DROP PROCEDURE p1;
>  DROP TABLE t1;
>  
> @@ -1020,13 +928,9 @@ END|
>  CALL p1('c');
>  arg
>  
> -Warnings:
> -Warning	1265	Data truncated for column 'arg' at row 1
>  CALL p2('a');
>  arg	var
>  a	
> -Warnings:
> -Warning	1265	Data truncated for column 'var' at row 1
>  SELECT f1('a');
>  f1('a')
>  
> diff -Nrup a/mysql-test/r/sp.result b/mysql-test/r/sp.result
> --- a/mysql-test/r/sp.result	2008-03-27 06:56:01 -03:00
> +++ b/mysql-test/r/sp.result	2008-04-18 08:39:05 -03:00
> @@ -526,8 +526,6 @@ end|
>  delete from t1|
>  create table t3 ( s char(16), d int)|
>  call into_test4()|
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select * from t3|
>  s	d
>  into4	NULL
> @@ -1120,8 +1118,6 @@ end|
>  select f9()|
>  f9()
>  6
> -Warnings:
> -Note	1051	Unknown table 't3'
>  select f9() from t1 limit 1|
>  f9()
>  6
> @@ -1162,8 +1158,6 @@ drop temporary table t3|
>  select f12_1()|
>  f12_1()
>  3
> -Warnings:
> -Note	1051	Unknown table 't3'
>  select f12_1() from t1 limit 1|
>  f12_1()
>  3
> @@ -2115,12 +2109,7 @@ end if;
>  insert into t4 values (2, rc, t3);
>  end|
>  call bug1863(10)|
> -Warnings:
> -Note	1051	Unknown table 'temp_t1'
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  call bug1863(10)|
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select * from t4|
>  f1	rc	t3
>  2	0	NULL
> @@ -2385,11 +2374,7 @@ begin
>  end|
>  call bug4579_1()|
>  call bug4579_1()|
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  call bug4579_1()|
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  drop procedure bug4579_1|
>  drop procedure bug4579_2|
>  drop table t3|
> @@ -2808,16 +2793,12 @@ var
>  call bug7743("OneWord")|
>  var
>  NULL
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  call bug7743("anotherword")|
>  var
>  2
>  call bug7743("AnotherWord")|
>  var
>  NULL
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  drop procedure bug7743|
>  drop table t4|
>  delete from t3|
> @@ -3234,11 +3215,7 @@ end|
>  create procedure bug9004_2(x char(16))
>  call bug9004_1(x)|
>  call bug9004_1('12345678901234567')|
> -Warnings:
> -Warning	1265	Data truncated for column 'x' at row 1
>  call bug9004_2('12345678901234567890')|
> -Warnings:
> -Warning	1265	Data truncated for column 'x' at row 1
>  delete from t1|
>  drop procedure bug9004_1|
>  drop procedure bug9004_2|
> @@ -3745,6 +3722,7 @@ select 3|
>  3
>  3
>  call bug12379_3()|
> +bug12379()
>  ERROR 23000: Duplicate entry 'X' for key 'PRIMARY'
>  select 4|
>  4
> @@ -3841,9 +3819,6 @@ Table	Create Table
>  tm1	CREATE TEMPORARY TABLE `tm1` (
>    `spv1` decimal(3,3) DEFAULT NULL
>  ) ENGINE=MyISAM DEFAULT CHARSET=latin1
> -Warnings:
> -Warning	1264	Out of range value for column 'spv1' at row 1
> -Warning	1366	Incorrect decimal value: 'test' for column 'spv1' at row 1
>  call bug12589_2()|
>  Table	Create Table
>  tm1	CREATE TEMPORARY TABLE `tm1` (
> @@ -4682,13 +4657,9 @@ Before NOT FOUND condition is triggered
>  After NOT FOUND condtition is triggered
>  xid	xdone
>  1	0
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  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|
> @@ -5501,13 +5472,9 @@ end|
>  select func_20028_a()|
>  func_20028_a()
>  0
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select func_20028_b()|
>  func_20028_b()
>  0
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select func_20028_c()|
>  ERROR 22012: Division by 0
>  call proc_20028_a()|
> @@ -5560,13 +5527,9 @@ end|
>  select func_20028_a()|
>  func_20028_a()
>  0
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select func_20028_b()|
>  func_20028_b()
>  0
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select func_20028_c()|
>  func_20028_c()
>  NULL
> @@ -6122,8 +6085,6 @@ select bug20777(9223372036854775810) as 
>  select bug20777(-9223372036854775808) as 'lower bounds signed bigint';
>  lower bounds signed bigint
>  0
> -Warnings:
> -Warning	1264	Out of range value for column 'f1' at row 1
>  select bug20777(9223372036854775807) as 'upper bounds signed bigint';
>  upper bounds signed bigint
>  9223372036854775807
> @@ -6136,13 +6097,9 @@ upper bounds unsigned bigint
>  select bug20777(18446744073709551616) as 'upper bounds unsigned bigint + 1';
>  upper bounds unsigned bigint + 1
>  18446744073709551615
> -Warnings:
> -Warning	1264	Out of range value for column 'f1' at row 1
>  select bug20777(-1) as 'lower bounds unsigned bigint - 1';
>  lower bounds unsigned bigint - 1
>  0
> -Warnings:
> -Warning	1264	Out of range value for column 'f1' at row 1
>  create table examplebug20777 as select 
>  0 as 'i',
>  bug20777(9223372036854775806) as '2**63-2',
> @@ -6154,9 +6111,6 @@ bug20777(18446744073709551615) as '2**64
>  bug20777(18446744073709551616) as '2**64',
>  bug20777(0) as '0',
>  bug20777(-1) as '-1';
> -Warnings:
> -Warning	1264	Out of range value for column 'f1' at row 1
> -Warning	1264	Out of range value for column 'f1' at row 1
>  insert into examplebug20777 values (1, 9223372036854775806, 9223372036854775807,
> 223372036854775808, 9223372036854775809, 18446744073709551614, 18446744073709551615,
> 8446744073709551616, 0, -1);
>  Warnings:
>  Warning	1264	Out of range value for column '-1' at row 1
> @@ -6200,37 +6154,6 @@ END|
>  SELECT bug5274_f2()|
>  bug5274_f2()
>  x
> -Warnings:
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
> -Warning	1265	Data truncated for column 'bug5274_f1' at row 1
>  DROP FUNCTION bug5274_f1|
>  DROP FUNCTION bug5274_f2|
>  drop procedure if exists proc_21513|
> @@ -6323,22 +6246,13 @@ c1
>  SELECT f1(2);
>  f1(2)
>  0
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  PREPARE s1 FROM 'SELECT f1(2)';
>  EXECUTE s1;
>  f1(2)
>  0
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  EXECUTE s1;
>  f1(2)
>  0
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  DROP PROCEDURE p1;
>  DROP PROCEDURE p2;
>  DROP FUNCTION f1;
> @@ -6579,8 +6493,6 @@ t1	CREATE TABLE `t1` (
>  DROP TABLE t1;
>  
>  CALL p1('text');
> -Warnings:
> -Warning	1264	Out of range value for column 'v' at row 1
>  SHOW CREATE TABLE t1;
>  Table	Create Table
>  t1	CREATE TABLE `t1` (
> @@ -6599,8 +6511,6 @@ t1	CREATE TABLE `t1` (
>  DROP TABLE t1;
>  
>  CALL p2('text');
> -Warnings:
> -Warning	1366	Incorrect integer value: 'text' for column 'v' at row 1
>  SHOW CREATE TABLE t1;
>  Table	Create Table
>  t1	CREATE TABLE `t1` (
> diff -Nrup a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result
> --- a/mysql-test/r/trigger.result	2008-02-12 09:44:24 -02:00
> +++ b/mysql-test/r/trigger.result	2008-04-18 08:39:05 -03:00
> @@ -1422,8 +1422,6 @@ create table t2 (j int);
>  insert into t2 values (1), (2);
>  set @a:="";
>  create table if not exists t1 select * from t2;
> -Warnings:
> -Note	1050	Table 't1' already exists

Hmm, this is very interesting. I would double check it with PeterG
 -- it turns out a trigger may silence warnings in the outer
statement now. Is it really the intended effect of the standard? 

>  select * from t1;
>  i
>  7
> @@ -1436,8 +1434,6 @@ drop trigger t1_ai;
>  create table t3 (isave int);
>  create trigger t1_bi before insert on t1 for each row insert into t3 values
> (new.i);
>  create table if not exists t1 select * from t2;
> -Warnings:
> -Note	1050	Table 't1' already exists
>  select * from t1;
>  i
>  7
> @@ -1625,8 +1621,6 @@ truncate t1;
>  truncate t1_op_log;
>  create table if not exists t1
>  select NULL, "CREATE TABLE ... SELECT, inserting a new key";
> -Warnings:
> -Note	1050	Table 't1' already exists
>  set @id=last_insert_id();
>  select * from t1;
>  id	operation
> @@ -1638,8 +1632,6 @@ After INSERT, new=CREATE TABLE ... SELEC
>  truncate t1_op_log;
>  create table if not exists t1 replace
>  select @id, "CREATE TABLE ... REPLACE SELECT, deleting a duplicate key";
> -Warnings:
> -Note	1050	Table 't1' already exists
>  select * from t1;
>  id	operation
>  1	CREATE TABLE ... REPLACE SELECT, deleting a duplicate key
> @@ -1820,8 +1812,6 @@ truncate t1;
>  truncate t1_op_log;
>  create table if not exists v1
>  select NULL, "CREATE TABLE ... SELECT, inserting a new key";
> -Warnings:
> -Note	1050	Table 'v1' already exists
>  set @id=last_insert_id();
>  select * from t1;
>  id	operation
> @@ -1833,8 +1823,6 @@ After INSERT, new=CREATE TABLE ... SELEC
>  truncate t1_op_log;
>  create table if not exists v1 replace
>  select @id, "CREATE TABLE ... REPLACE SELECT, deleting a duplicate key";
> -Warnings:
> -Note	1050	Table 'v1' already exists
>  select * from t1;
>  id	operation
>  1	CREATE TABLE ... REPLACE SELECT, deleting a duplicate key
> diff -Nrup a/mysql-test/r/view_grant.result b/mysql-test/r/view_grant.result
> --- a/mysql-test/r/view_grant.result	2008-03-22 05:02:23 -03:00
> +++ b/mysql-test/r/view_grant.result	2008-04-18 08:39:05 -03:00
> @@ -341,13 +341,9 @@ use mysqltest;
>  select * from v1;
>  f2()
>  NULL
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select * from v2;
>  f2()
>  NULL
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select * from v3;
>  ERROR HY000: View 'mysqltest.v3' references invalid table(s) or column(s) or
> function(s) or definer/invoker of view lack rights to use them
>  select * from v4;
> @@ -387,13 +383,9 @@ ERROR HY000: View 'mysqltest.v2' referen
>  select * from v3;
>  f2()
>  NULL
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select * from v4;
>  f2()
>  NULL
> -Warnings:
> -Warning	1329	No data - zero rows fetched, selected, or processed
>  select * from v5;
>  ERROR HY000: View 'mysqltest.v5' references invalid table(s) or column(s) or
> function(s) or definer/invoker of view lack rights to use them
>  drop view v1, v2, v3, v4, v5;
> diff -Nrup a/mysql-test/suite/binlog/r/binlog_unsafe.result
> b/mysql-test/suite/binlog/r/binlog_unsafe.result
> --- a/mysql-test/suite/binlog/r/binlog_unsafe.result	2008-03-27 07:13:12 -03:00
> +++ b/mysql-test/suite/binlog/r/binlog_unsafe.result	2008-04-18 08:39:05 -03:00
> @@ -43,12 +43,6 @@ END|
>  CALL proc();
>  Warnings:
>  Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.

In many of these tests we call a function or a procedure for its
effect, to see the warning it generates. 

Please instead of simply removing the warnings from the test
results, rewrite the test cases to have one statement per
routine. Feel free to do it in a separate patch, to ease code
reviews.

>  ---- Insert from stored function ----
>  CREATE FUNCTION func()
>  RETURNS INT
> @@ -65,13 +59,8 @@ END|
>  SELECT func();
>  func()
>  0
> -Warnings:
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> +SHOW WARNINGS;
> +Level	Code	Message
>  Warning	1592	Statement is not safe to log in statement format.
>  ---- Insert from trigger ----
>  CREATE TRIGGER trig
> @@ -89,13 +78,6 @@ END|
>  INSERT INTO trigger_table VALUES ('bye.');
>  Warnings:
>  Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
>  ---- Insert from prepared statement ----
>  PREPARE p1 FROM 'INSERT INTO t1 VALUES (@@global.sync_binlog)';
>  PREPARE p2 FROM 'INSERT INTO t1 VALUES (@@session.insert_id)';
> @@ -153,13 +135,8 @@ PREPARE prep6 FROM 'SELECT func5()'|
>  EXECUTE prep6;
>  func5()
>  0
> -Warnings:
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> +SHOW WARNINGS;
> +Level	Code	Message
>  Warning	1592	Statement is not safe to log in statement format.
>  ==== Variables that should *not* be unsafe ====
>  INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
> @@ -214,9 +191,6 @@ DELETE FROM t1 LIMIT 1;
>  END|
>  CALL p1();
>  Warnings:
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
> -Warning	1592	Statement is not safe to log in statement format.
>  Warning	1592	Statement is not safe to log in statement format.
>  DROP PROCEDURE p1;
>  DROP TABLE t1;
> diff -Nrup a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test
> --- a/mysql-test/t/sp-error.test	2008-04-14 20:28:13 -03:00
> +++ b/mysql-test/t/sp-error.test	2008-04-18 08:39:05 -03:00
> @@ -2420,6 +2420,110 @@ set @@max_sp_recursion_depth = @old_recu
>  drop procedure p1;
>  
>  #
> +# Bug#23032: Handlers declared in a SP do not handle warnings generated in sub-SP
> +#
> +
> +--disable_warnings
> +DROP PROCEDURE IF EXISTS p1;
> +DROP PROCEDURE IF EXISTS p2;
> +--enable_warnings
> +
> +delimiter |;
> +
> +CREATE PROCEDURE p1()
> +  BEGIN
> +    SELECT CAST('10 ' as unsigned integer);
> +    SELECT 1;
> +    CALL p2();
> +  END|
> +
> +CREATE PROCEDURE p2()
> +  BEGIN
> +    SELECT CAST('10 ' as unsigned integer);
> +  END|
> +
> +delimiter ;|
> +
> +CALL p1();
> +
> +DROP PROCEDURE p1;
> +DROP PROCEDURE p2;
> +
> +--disable_warnings
> +DROP PROCEDURE IF EXISTS p1;
> +DROP PROCEDURE IF EXISTS p2;
> +DROP PROCEDURE IF EXISTS p3;
> +DROP PROCEDURE IF EXISTS p4;
> +--enable_warnings
> +
> +delimiter |;
> +
> +CREATE PROCEDURE p1()
> +  BEGIN
> +    DECLARE c INT DEFAULT 0;
> +    DECLARE CONTINUE HANDLER FOR SQLWARNING SET c = c + 1;
> +    CALL p2();
> +    CALL p3();
> +    CALL p4();
> +    SELECT c;
> +    SELECT @@warning_count;
> +    SHOW WARNINGS;
> +  END|
> +
> +CREATE PROCEDURE p2()
> +  BEGIN
> +    SELECT CAST('10 ' as unsigned integer);
> +  END|
> +
> +CREATE PROCEDURE p3()
> +  BEGIN
> +    SELECT CAST('10 ' as unsigned integer);
> +    SELECT 1;
> +  END|
> +
> +CREATE PROCEDURE p4()
> +  BEGIN
> +    SELECT CAST('10 ' as unsigned integer);
> +    CALL p2();
> +  END|
> +
> +delimiter ;|
> +
> +CALL p1();
> +
> +DROP PROCEDURE p1;
> +DROP PROCEDURE p2;
> +DROP PROCEDURE p3;
> +DROP PROCEDURE p4;
> +
> +#
> +# Bug#36185: Incorrect precedence for warning and exception handlers
> +#
> +
> +--disable_warnings
> +DROP TABLE IF EXISTS t1;
> +DROP PROCEDURE IF EXISTS p1;
> +--enable_warnings
> +
> +CREATE TABLE t1 (a INT, b INT NOT NULL);
> +
> +delimiter |;
> +
> +CREATE PROCEDURE p1()
> +BEGIN
> +  DECLARE CONTINUE HANDLER FOR SQLWARNING SELECT 'warning';
> +  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SELECT 'exception';
> +  INSERT INTO T1 VALUES (CAST('10 ' AS SIGNED), NULL);
> +END|
> +
> +delimiter ;|
> +
> +CALL p1();
> +
> +DROP TABLE t1;
> +DROP PROCEDURE p1;
> +
> +#
>  # BUG#NNNN: New bug synopsis
>  #
>  #--disable_warnings
> diff -Nrup a/sql/mysqld.cc b/sql/mysqld.cc
> --- a/sql/mysqld.cc	2008-04-16 04:53:13 -03:00
> +++ b/sql/mysqld.cc	2008-04-18 08:39:05 -03:00
> @@ -2929,10 +2929,6 @@ void my_message_sql(uint error, const ch
>                          thd->row_count);
>  
>  
> -    /*
> -      TODO: There are two exceptions mechanism (THD and sp_rcontext),
> -      this could be improved by having a common stack of handlers.
> -    */
>      if (thd->handle_error(error, str,
>                            MYSQL_ERROR::WARN_LEVEL_ERROR))
>        DBUG_VOID_RETURN;
> @@ -2964,19 +2960,6 @@ void my_message_sql(uint error, const ch
>          thd->main_da.set_error_status(thd, error, str);
>        }
>        query_cache_abort(&thd->query_cache_tls);
> -    }
> -    /*
> -      If a continue handler is found, the error message will be cleared
> -      by the stored procedures code.
> -    */
> -    if (!thd->is_fatal_error && thd->spcont &&
> -        thd->spcont->handle_error(error, MYSQL_ERROR::WARN_LEVEL_ERROR, thd))
> -    {
> -      /*
> -        Do not push any warnings, a handled error must be completely
> -        silenced.
> -      */
> -      DBUG_VOID_RETURN;
>      }
>  
>      if (!thd->no_warnings_for_error && !thd->is_fatal_error)
> diff -Nrup a/sql/sp_head.cc b/sql/sp_head.cc
> --- a/sql/sp_head.cc	2008-04-08 12:37:10 -03:00
> +++ b/sql/sp_head.cc	2008-04-18 08:39:06 -03:00
> @@ -1027,6 +1027,72 @@ void sp_head::recursion_level_error(THD 
>  
>  
>  /**
> +  Check if an exception has occurred and a handler has been found
> +
> +  @param thd thread handle
> +  @param ctx runtime context of the stored routine
> +  @param ip location of the found handler
> +  @param instr stored procedure instruction
> +  @param execute_arena per-instruction arena
> +  @param backup_arena per-instruction arena
> +
> +  @return TRUE if a handler has been found, FALSE otherwise.
> +*/
> +
> +static bool
> +find_and_push_handler(THD *thd, sp_rcontext *ctx, uint *ip,
> +                      sp_instr *instr, Query_arena *execute_arena,
> +                      Query_arena *backup_arena)
> +{
> +  uint hf;
> +
> +  /* Fatal errors are not catchable. */
> +  if (! ctx || thd->is_fatal_error)
> +    return FALSE;
> +
> +  /* Precaution: ditch any previously found handler. */
> +  ctx->clear_handler();
> +
> +  if (thd->is_error())
> +    ctx->find_handler(thd, thd->main_da.sql_errno(),
> +                      MYSQL_ERROR::WARN_LEVEL_ERROR);
> +  else if (thd->total_warn_count)
> +  {
> +    MYSQL_ERROR *err;
> +    List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
> +    while ((err= it++))
> +    {
> +      if (err->level != MYSQL_ERROR::WARN_LEVEL_WARN)
> +        continue;
> +      if (ctx->find_handler(thd, err->code, err->level))
> +        break;
> +    }
> +  }
> +  else
> +    return FALSE;
> +
> +  switch (ctx->found_handler(ip, &hf)) {
> +  case SP_HANDLER_NONE:
> +    break;
> +  case SP_HANDLER_CONTINUE:
> +    thd->restore_active_arena(execute_arena, backup_arena);
> +    thd->set_n_backup_active_arena(execute_arena, backup_arena);
> +    ctx->push_hstack(instr->get_cont_dest());
> +    /* Fall through */
> +  default:
> +    ctx->clear_handler();
> +    ctx->enter_handler(*ip);
> +    thd->clear_error();
> +    thd->is_fatal_error= 0;
> +    thd->killed= THD::NOT_KILLED;
> +    thd->mysys_var->abort= 0;
> +    return TRUE;

Partially this code is now legacy. I.e. instead of resetting
thd->killed  and thd->mysys_var->abort, you should check for
thd->killed and return without trying to find a handler if the
thread was killed.


> +  }
> +  return FALSE;
> +}
> +
> +
> @@ -1191,6 +1256,9 @@ sp_head::execute(THD *thd)
>        break;
>      }
>  
> +    /* Reset number of warnings for this query */
> +    thd->total_warn_count= 0;
> +

OK, but I suggest to move the assignment of this variable to
find_and_push_handler(), place where we call thd->clear_error().
This will keep the logic of cleaning up after an sp instruction in
one  place.

When looking for a handler for a warning, we should not look at
the value of this variable anyway, since in case of the following
scenario:

sp_inner()
  <a statement that generates a warning>
  show warnings;

sp_outer():
  <declares a continue handler for warning>
  call sp_inner();

sp_outer() won't be able to catch the warning.

BTW, please add this test case to the test suite.

> diff -Nrup a/sql/sql_class.cc b/sql/sql_class.cc
> --- a/sql/sql_class.cc	2008-04-16 04:53:13 -03:00
> +++ b/sql/sql_class.cc	2008-04-18 08:39:06 -03:00
> @@ -1539,16 +1539,13 @@ bool select_send::send_fields(List<Item>
>  void select_send::abort()
>  {
>    DBUG_ENTER("select_send::abort");
> -  if (is_result_set_started && thd->spcont &&
> -      thd->spcont->find_handler(thd, thd->main_da.sql_errno(),
> -                                MYSQL_ERROR::WARN_LEVEL_ERROR))
> +  if (is_result_set_started && thd->spcont)
>    {
>      /*
>        We're executing a stored procedure, have an open result
> -      set, an SQL exception condition and a handler for it.
> -      In this situation we must abort the current statement,
> -      silence the error and start executing the continue/exit
> -      handler.
> +      set and an SQL exception condition. In this situation we
> +      must abort the current statement, silence the error and
> +      start executing the continue/exit handler if one is found.
>        Before aborting the statement, let's end the open result set, as
>        otherwise the client will hang due to the violation of the
>        client/server protocol.

Hmm, this is a tricky place.

This code used to send "eof" packet with no warnings for a partial 
result set but *only* if there is a handler for an error.

Now you silence the error simply if you're inside a stored
procedure, so the client will get "OK" regardless of whether there
is a handler or isn't.

I think the way out is to convert this piece to use the
Sp_rcontext.
Instead of sending "OK" directly to the user if the handler is
found, we should be able to indicate in the runtime context that
the client needs to be sent "eof" if the handler is found later.

Otherwise the patch looks good.

Thank you for working on this, it's another small step forward!

-- 
Konstantin Osipov                    Moscow, Russia
MySQL Server Runtime Team Lead       Database Group, Sun Microsystems
Thread
bk commit into 6.0 tree (davi:1.2618) BUG#23032Davi Arnaut18 Apr
  • Re: bk commit into 6.0 tree (davi:1.2618) BUG#23032Konstantin Osipov20 Apr
    • Re: bk commit into 6.0 tree (davi:1.2618) BUG#23032Davi Arnaut21 Apr