From: Jon Olav Hauglid Date: October 4 2010 9:23am Subject: bzr commit into mysql-5.5-runtime branch (jon.hauglid:3152) Bug#57002 List-Archive: http://lists.mysql.com/commits/119799 X-Bug: 57002 Message-Id: <201010040924.o949OSiI002217@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4600263542154058799==" --===============4600263542154058799== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.5-runtime-bug57002/ based on revid:jon.hauglid@stripped 3152 Jon Olav Hauglid 2010-10-04 Bug #57002 Assert in upgrade_shared_lock_to_exclusive() for ALTER TABLE + MERGE tables The patch for Bug#56292 changed how metadata locks are taken for MERGE tables. After the patch, locking the MERGE table will also lock the children tables with the same metadata lock type. This means that LOCK TABLES on a MERGE table also will implicitly do LOCK TABLES on the children tables. A consequence of this change, is that it is possible to do LOCK TABLES on a child table both explicitly and implicitly with the same statement and that these two locks can be of different strength. For example, LOCK TABLES child READ, merge WRITE. In LOCK TABLES mode, we are not allowed to take new locks and each statement must therefore try to find an existing TABLE instance with a suitable lock. The code that searched for a suitable TABLE instance, only considered table level locks. If a child table was locked twice, it was therefore possible for this code to find a TABLE instance with suitable table level locks but without suitable metadata lock. This problem caused the assert in upgrade_shared_lock_to_exclusive() to be triggered as it tried to upgrade a MDL_SHARED lock to EXCLUSIVE. The problem was a regression caused by the patch for Bug#56292. This patch fixes the problem by taking metadata lock type into account when trying to find a suitable TABLE instance in LOCK TABLES mode. Test case added to merge.test. modified: mysql-test/r/create.result mysql-test/r/events_2.result mysql-test/r/lock.result mysql-test/r/merge.result mysql-test/r/multi_update.result mysql-test/t/create.test mysql-test/t/events_2.test mysql-test/t/lock.test mysql-test/t/merge.test mysql-test/t/multi_update.test sql/sql_base.cc === modified file 'mysql-test/r/create.result' --- a/mysql-test/r/create.result 2010-08-25 19:00:38 +0000 +++ b/mysql-test/r/create.result 2010-10-04 09:23:26 +0000 @@ -857,10 +857,9 @@ ERROR HY000: Table 't2' was locked with unlock tables; lock table t1 read, t2 write; create table t2 select * from t1; -ERROR 42S01: Table 't2' already exists +ERROR HY000: Table 't2' was not locked with LOCK TABLES create table if not exists t2 select * from t1; -Warnings: -Note 1050 Table 't2' already exists +ERROR HY000: Table 't2' was not locked with LOCK TABLES select * from t1; i 1 === modified file 'mysql-test/r/events_2.result' --- a/mysql-test/r/events_2.result 2009-12-22 09:35:56 +0000 +++ b/mysql-test/r/events_2.result 2010-10-04 09:23:26 +0000 @@ -169,15 +169,15 @@ select event_name from information_schem event_name e1 create event e2 on schedule every 10 hour do select 1; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES alter event e2 disable; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES alter event e2 rename to e3; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES drop event e2; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES drop event e1; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES unlock tables; lock table t1 write, mysql.event read; show create event e1; @@ -187,15 +187,15 @@ select event_name from information_schem event_name e1 create event e2 on schedule every 10 hour do select 1; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES alter event e2 disable; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES alter event e2 rename to e3; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES drop event e2; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES drop event e1; -ERROR HY000: Table 'event' was locked with a READ lock and can't be updated +ERROR HY000: Table 'event' was not locked with LOCK TABLES unlock tables; lock table t1 read, mysql.event write; ERROR HY000: You can't combine write-locking of system tables with other tables or lock types === modified file 'mysql-test/r/lock.result' --- a/mysql-test/r/lock.result 2010-02-01 11:43:06 +0000 +++ b/mysql-test/r/lock.result 2010-10-04 09:23:26 +0000 @@ -8,7 +8,7 @@ NULL 1 update t1 set id=-1 where id=1; LOCK TABLE t1 READ; update t1 set id=1 where id=1; -ERROR HY000: Table 't1' was locked with a READ lock and can't be updated +ERROR HY000: Table 't1' was not locked with LOCK TABLES create table t2 SELECT * from t1; ERROR HY000: Table 't2' was not locked with LOCK TABLES create temporary table t2 SELECT * from t1; @@ -68,9 +68,9 @@ lock tables t1 write, t2 read; delete from t1 using t1,t2 where t1.a=t2.a; delete t1 from t1,t2 where t1.a=t2.a; delete from t2 using t1,t2 where t1.a=t2.a; -ERROR HY000: Table 't2' was locked with a READ lock and can't be updated +ERROR HY000: Table 't2' was not locked with LOCK TABLES delete t2 from t1,t2 where t1.a=t2.a; -ERROR HY000: Table 't2' was locked with a READ lock and can't be updated +ERROR HY000: Table 't2' was not locked with LOCK TABLES drop table t1,t2; ERROR HY000: Table 't2' was locked with a READ lock and can't be updated unlock tables; @@ -203,7 +203,7 @@ WHERE t1.table1_rowid = t2.table2_rowid # While implementing the patch we didn't break old behavior; # The following sub-select should still requires a write lock: SELECT * FROM t1 WHERE 1 IN (SELECT * FROM t2 FOR UPDATE); -ERROR HY000: Table 't2' was locked with a READ lock and can't be updated +ERROR HY000: Table 't2' was not locked with LOCK TABLES UNLOCK TABLES; DROP TABLE t1,t2; End of 5.1 tests. === modified file 'mysql-test/r/merge.result' --- a/mysql-test/r/merge.result 2010-09-30 10:43:43 +0000 +++ b/mysql-test/r/merge.result 2010-10-04 09:23:26 +0000 @@ -3661,4 +3661,15 @@ REPAIR TABLE t2 USE_FRM; Table Op Msg_type Msg_text test.t2 repair note The storage engine for the table doesn't support repair DROP TABLE t1, t2; +# +# Bug#57002 Assert in upgrade_shared_lock_to_exclusive() +# for ALTER TABLE + MERGE tables +# +DROP TABLE IF EXISTS t1, m1; +CREATE TABLE t1(a INT) engine=myisam; +CREATE TABLE m1(a INT) engine=merge UNION(t1); +LOCK TABLES t1 READ, m1 WRITE; +ALTER TABLE t1 engine=myisam; +UNLOCK TABLES; +DROP TABLE m1, t1; End of 6.0 tests === modified file 'mysql-test/r/multi_update.result' --- a/mysql-test/r/multi_update.result 2010-09-07 08:00:52 +0000 +++ b/mysql-test/r/multi_update.result 2010-10-04 09:23:26 +0000 @@ -152,10 +152,11 @@ insert into t1 values(1,1); insert into t2 values(1,10),(2,20); LOCK TABLES t1 write, t2 read; DELETE t1.*, t2.* FROM t1,t2 where t1.n=t2.n; -ERROR HY000: Table 't2' was locked with a READ lock and can't be updated +ERROR HY000: Table 't2' was not locked with LOCK TABLES UPDATE t1,t2 SET t1.d=t2.d,t2.d=30 WHERE t1.n=t2.n; -ERROR HY000: Table 't2' was locked with a READ lock and can't be updated +ERROR HY000: Table 't2' was not locked with LOCK TABLES UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; +ERROR HY000: Table 't2' was not locked with LOCK TABLES unlock tables; LOCK TABLES t1 write, t2 write; UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; === modified file 'mysql-test/t/create.test' --- a/mysql-test/t/create.test 2010-08-18 09:35:41 +0000 +++ b/mysql-test/t/create.test 2010-10-04 09:23:26 +0000 @@ -795,9 +795,9 @@ create table t2 select * from t1; create table if not exists t2 select * from t1; unlock tables; lock table t1 read, t2 write; ---error ER_TABLE_EXISTS_ERROR +--error ER_TABLE_NOT_LOCKED create table t2 select * from t1; -# This is the only case which really works. +--error ER_TABLE_NOT_LOCKED create table if not exists t2 select * from t1; select * from t1; unlock tables; === modified file 'mysql-test/t/events_2.test' --- a/mysql-test/t/events_2.test 2009-12-22 09:35:56 +0000 +++ b/mysql-test/t/events_2.test 2010-10-04 09:23:26 +0000 @@ -246,15 +246,15 @@ lock table t1 read, mysql.event read; --replace_regex /STARTS '[^']+'/STARTS '#'/ show create event e1; select event_name from information_schema.events; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED create event e2 on schedule every 10 hour do select 1; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED alter event e2 disable; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED alter event e2 rename to e3; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED drop event e2; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED drop event e1; unlock tables; # @@ -263,15 +263,15 @@ lock table t1 write, mysql.event read; --replace_regex /STARTS '[^']+'/STARTS '#'/ show create event e1; select event_name from information_schema.events; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED create event e2 on schedule every 10 hour do select 1; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED alter event e2 disable; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED alter event e2 rename to e3; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED drop event e2; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED drop event e1; unlock tables; # === modified file 'mysql-test/t/lock.test' --- a/mysql-test/t/lock.test 2010-02-01 11:43:06 +0000 +++ b/mysql-test/t/lock.test 2010-10-04 09:23:26 +0000 @@ -14,7 +14,7 @@ LOCK TABLE t1 WRITE; select dummy1,count(distinct id) from t1 group by dummy1; update t1 set id=-1 where id=1; LOCK TABLE t1 READ; ---error 1099 +--error ER_TABLE_NOT_LOCKED update t1 set id=1 where id=1; --error 1100 create table t2 SELECT * from t1; @@ -92,9 +92,9 @@ create table t2 ( a int(11) not null aut lock tables t1 write, t2 read; delete from t1 using t1,t2 where t1.a=t2.a; delete t1 from t1,t2 where t1.a=t2.a; ---error 1099 +--error ER_TABLE_NOT_LOCKED delete from t2 using t1,t2 where t1.a=t2.a; ---error 1099 +--error ER_TABLE_NOT_LOCKED delete t2 from t1,t2 where t1.a=t2.a; --error ER_TABLE_NOT_LOCKED_FOR_WRITE drop table t1,t2; @@ -255,7 +255,7 @@ WHERE t1.table1_rowid = t2.table2_rowid ) ; --echo # While implementing the patch we didn't break old behavior; --echo # The following sub-select should still requires a write lock: ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED SELECT * FROM t1 WHERE 1 IN (SELECT * FROM t2 FOR UPDATE); UNLOCK TABLES; DROP TABLE t1,t2; === modified file 'mysql-test/t/merge.test' --- a/mysql-test/t/merge.test 2010-09-30 10:43:43 +0000 +++ b/mysql-test/t/merge.test 2010-10-04 09:23:26 +0000 @@ -2776,6 +2776,26 @@ REPAIR TABLE t2 USE_FRM; DROP TABLE t1, t2; +--echo # +--echo # Bug#57002 Assert in upgrade_shared_lock_to_exclusive() +--echo # for ALTER TABLE + MERGE tables +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1, m1; +--enable_warnings + +CREATE TABLE t1(a INT) engine=myisam; +CREATE TABLE m1(a INT) engine=merge UNION(t1); +LOCK TABLES t1 READ, m1 WRITE; + +# This caused an assert +ALTER TABLE t1 engine=myisam; + +UNLOCK TABLES; +DROP TABLE m1, t1; + + --echo End of 6.0 tests --disable_result_log === modified file 'mysql-test/t/multi_update.test' --- a/mysql-test/t/multi_update.test 2010-09-07 08:00:52 +0000 +++ b/mysql-test/t/multi_update.test 2010-10-04 09:23:26 +0000 @@ -160,10 +160,11 @@ create table t2 (n int(10) not null prim insert into t1 values(1,1); insert into t2 values(1,10),(2,20); LOCK TABLES t1 write, t2 read; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED DELETE t1.*, t2.* FROM t1,t2 where t1.n=t2.n; ---error ER_TABLE_NOT_LOCKED_FOR_WRITE +--error ER_TABLE_NOT_LOCKED UPDATE t1,t2 SET t1.d=t2.d,t2.d=30 WHERE t1.n=t2.n; +--error ER_TABLE_NOT_LOCKED UPDATE t1,t2 SET t1.d=t2.d WHERE t1.n=t2.n; unlock tables; LOCK TABLES t1 write, t2 write; === modified file 'sql/sql_base.cc' --- a/sql/sql_base.cc 2010-09-30 13:29:12 +0000 +++ b/sql/sql_base.cc 2010-10-04 09:23:26 +0000 @@ -2742,8 +2742,11 @@ bool open_table(THD *thd, TABLE_LIST *ta distance > 0 - we have lock mode higher then we require distance == 0 - we have lock mode exactly which we need */ - if ((best_distance < 0 && distance > best_distance) || - (distance >= 0 && distance < best_distance)) + if (((best_distance < 0 && distance > best_distance) || + (distance >= 0 && distance < best_distance)) && + ((flags & (MYSQL_OPEN_FORCE_SHARED_MDL | + MYSQL_OPEN_FORCE_SHARED_HIGH_PRIO_MDL)) || + table->mdl_ticket->has_stronger_or_equal_type(table_list->mdl_request.type))) { best_distance= distance; best_table= table; --===============4600263542154058799== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.5-runtime-bug57002/ # testament_sha1: c42305ba0cc42f07a6da78d85e33b2030cd047b3 # timestamp: 2010-10-04 11:23:30 +0200 # source_branch: file:///export/home/x/mysql-5.5-bugfixing/ # base_revision_id: jon.hauglid@stripped\ # 0cilpxssqycki8d1 # # Begin bundle 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 HYX+LuSKcKEhsuSIhA== --===============4600263542154058799==--