List:Commits« Previous MessageNext Message »
From:Konstantin Osipov Date:November 10 2010 7:25pm
Subject:Re: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3545)
Bug#54375
View as plain text  
* Dmitry Shulga <Dmitry.Shulga@stripped> [10/10/25 22:57]:

The patch is OK to push.

Please see below.

>  3545 Dmitry Shulga	2010-10-26
>       Fixed bug#54375 - Error in stored procedure leaves
         connection
>       in different default schema.

Please explain the issue that caused the bug:

In strict mode, when data truncation or conversion happens,
THD::killed is set to THD::KILL_BAD_DATA.

This is abuse of KILL mechanism to guarantee that execution
of statement is aborted.

The stored procedures execution, on the other hand,
upon detection that a connection was killed, would
terminate immediately, without trying to restore the caller's
context, in particular, restore the caller's current schema.

The fix is, when terminating a stored procedure execution,
to only bypass cleanup if the entire connection was killed,
not in case of other forms of KILL.


>      @ mysql-test/r/sp-bugs.result
>         It was added result for test case for bug#54375.
Simply "Added a result for a test case for Bug#54375"
>      @ mysql-test/t/sp-bugs.test
>         It was added test case for bug#54375.
>      @ sql/sp_head.cc
>         sp_head::execute modified: restore saved current db if
>         connection is not broken.

s/broken/killed.

> 
>     modified:
>       mysql-test/r/sp-bugs.result
>       mysql-test/t/sp-bugs.test
>       sql/sp_head.cc
> === modified file 'mysql-test/r/sp-bugs.result'
> --- a/mysql-test/r/sp-bugs.result	2010-02-13 10:35:14 +0000
> +++ b/mysql-test/r/sp-bugs.result	2010-10-25 17:04:48 +0000
> @@ -73,4 +73,39 @@ CALL p1 ();
>  ERROR HY000: Trigger does not exist
>  DROP TABLE t1;
>  DROP PROCEDURE p1;
> +#
> +# Bug#54375: Error in stored procedure leaves connection in different default
> schema
> +#
> +SET @@SQL_MODE = 'STRICT_ALL_TABLES';
> +DROP DATABASE IF EXISTS db1;
> +CREATE DATABASE db1;
> +USE db1;
> +DROP TABLE IF EXISTS t1;
> +CREATE TABLE t1 (c1 int NOT NULL PRIMARY KEY);
> +INSERT INTO t1 VALUES (1);
> +CREATE FUNCTION f1 (
> +some_value int
> +)
> +RETURNS smallint
> +DETERMINISTIC
> +BEGIN
> +INSERT INTO t1 SET c1 = some_value;
> +RETURN(LAST_INSERT_ID());
> +END$$
> +DROP DATABASE IF EXISTS db2;
> +CREATE DATABASE db2;
> +USE db2;
> +SELECT DATABASE();
> +DATABASE()
> +db2
> +SELECT db1.f1(1);
> +ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
> +SELECT DATABASE();
> +DATABASE()
> +db2
> +USE test;
> +DROP FUNCTION db1.f1;
> +DROP TABLE db1.t1;
> +DROP DATABASE db1;
> +DROP DATABASE db2;
>  End of 5.1 tests
> 
> === modified file 'mysql-test/t/sp-bugs.test'
> --- a/mysql-test/t/sp-bugs.test	2010-02-13 10:35:14 +0000
> +++ b/mysql-test/t/sp-bugs.test	2010-10-25 17:04:48 +0000
> @@ -101,4 +101,40 @@ CALL p1 ();
>  DROP TABLE t1;
>  DROP PROCEDURE p1;
>  
> +--echo #
> +--echo # Bug#54375: Error in stored procedure leaves connection in different default
> schema
> +--echo #

80 columns.

> +
> +--disable_warnings
> +SET @@SQL_MODE = 'STRICT_ALL_TABLES';
> +DROP DATABASE IF EXISTS db1;
> +CREATE DATABASE db1;
> +USE db1;
> +DROP TABLE IF EXISTS t1;
> +CREATE TABLE t1 (c1 int NOT NULL PRIMARY KEY);
> +INSERT INTO t1 VALUES (1);
> +DELIMITER $$;
> +CREATE FUNCTION f1 (
> +	some_value int
> +)
> +RETURNS smallint
> +DETERMINISTIC
> +BEGIN
> +	INSERT INTO t1 SET c1 = some_value;
> +        RETURN(LAST_INSERT_ID());
> +END$$
> +DELIMITER ;$$
> +DROP DATABASE IF EXISTS db2;
> +CREATE DATABASE db2;
> +--enable_warnings
> +USE db2;
> +SELECT DATABASE();
> +--error ER_DUP_ENTRY
> +SELECT db1.f1(1);
> +SELECT DATABASE();
> +USE test;
> +DROP FUNCTION db1.f1;
> +DROP TABLE db1.t1;
> +DROP DATABASE db1;
> +DROP DATABASE db2;
>  --echo End of 5.1 tests
> 
> === modified file 'sql/sp_head.cc'
> --- a/sql/sp_head.cc	2010-07-19 14:30:34 +0000
> +++ b/sql/sp_head.cc	2010-10-25 17:04:48 +0000
> @@ -1372,7 +1372,7 @@ sp_head::execute(THD *thd)
>      If the DB has changed, the pointer has changed too, but the
>      original thd->db will then have been freed
>    */
> -  if (cur_db_changed && !thd->killed)
> +  if (cur_db_changed && thd->killed != THD::KILL_CONNECTION)
>    {
>      /*
>        Force switching back to the saved current database, because it may be
> 

-- 
Thread
bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3545) Bug#54375Dmitry Shulga25 Oct
  • Re: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3545)Bug#54375Konstantin Osipov10 Nov