From: Mattias Jonsson Date: August 10 2010 8:43am Subject: bzr commit into mysql-5.1-bugteam branch (mattias.jonsson:3480) Bug#55458 List-Archive: http://lists.mysql.com/commits/115373 X-Bug: 55458 Message-Id: <201008100843.o7A2IfKp027382@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5044594654315131102==" --===============5044594654315131102== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mattiasj/mysql-bzr/b55458-51-bt/ based on revid:jon.hauglid@stripped 3480 Mattias Jonsson 2010-08-10 Bug#55458: Partitioned MyISAM table gets crashed by multi-table update Problem was that the handler call ::extra(HA_EXTRA_CACHE) was cached but the ::extra(HA_EXTRA_PREPARE_FOR_UPDATE) was not. Solution was to also cache the other call and forward it when moving to a new partition to scan. @ mysql-test/r/partition.result test result @ mysql-test/t/partition.test New test from bug report. @ sql/ha_partition.cc cache the HA_EXTRA_PREPARE_FOR_UPDATE just like HA_EXTRA_CACHE. @ sql/ha_partition.h Added cache flag for HA_EXTRA_PREPARE_FOR_UPDATE modified: mysql-test/r/partition.result mysql-test/t/partition.test sql/ha_partition.cc sql/ha_partition.h === modified file 'mysql-test/r/partition.result' --- a/mysql-test/r/partition.result 2010-03-22 12:30:27 +0000 +++ b/mysql-test/r/partition.result 2010-08-10 08:43:12 +0000 @@ -1,4 +1,29 @@ drop table if exists t1, t2; +# +# Bug#55458: Partitioned MyISAM table gets crashed by multi-table update +# +CREATE TABLE t1 ( +`id` int NOT NULL, +`user_num` int DEFAULT NULL, +PRIMARY KEY (`id`) +) ENGINE=MyISAM CHARSET=latin1; +INSERT INTO t1 VALUES (1,8601); +INSERT INTO t1 VALUES (2,8601); +INSERT INTO t1 VALUES (3,8601); +INSERT INTO t1 VALUES (4,8601); +CREATE TABLE t2 ( +`id` int(11) NOT NULL, +`user_num` int DEFAULT NULL, +`name` varchar(64) NOT NULL, +PRIMARY KEY (`id`) +) ENGINE=MyISAM CHARSET=latin1 +PARTITION BY HASH (id) +PARTITIONS 2; +INSERT INTO t2 VALUES (1,8601,'John'); +INSERT INTO t2 VALUES (2,8601,'JS'); +INSERT INTO t2 VALUES (3,8601,'John S'); +UPDATE t1, t2 SET t2.name = 'John Smith' WHERE t1.user_num = t2.user_num; +DROP TABLE t1, t2; CREATE TABLE t1 (a INT, b INT) PARTITION BY LIST (a) SUBPARTITION BY HASH (b) === modified file 'mysql-test/t/partition.test' --- a/mysql-test/t/partition.test 2010-03-22 12:30:27 +0000 +++ b/mysql-test/t/partition.test 2010-08-10 08:43:12 +0000 @@ -14,6 +14,33 @@ drop table if exists t1, t2; --enable_warnings +--echo # +--echo # Bug#55458: Partitioned MyISAM table gets crashed by multi-table update +--echo # +CREATE TABLE t1 ( + `id` int NOT NULL, + `user_num` int DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM CHARSET=latin1; +INSERT INTO t1 VALUES (1,8601); +INSERT INTO t1 VALUES (2,8601); +INSERT INTO t1 VALUES (3,8601); +INSERT INTO t1 VALUES (4,8601); +CREATE TABLE t2 ( + `id` int(11) NOT NULL, + `user_num` int DEFAULT NULL, + `name` varchar(64) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM CHARSET=latin1 +PARTITION BY HASH (id) +PARTITIONS 2; +INSERT INTO t2 VALUES (1,8601,'John'); +INSERT INTO t2 VALUES (2,8601,'JS'); +INSERT INTO t2 VALUES (3,8601,'John S'); + +UPDATE t1, t2 SET t2.name = 'John Smith' WHERE t1.user_num = t2.user_num; + +DROP TABLE t1, t2; # # Bug#48276: can't add column if subpartition exists CREATE TABLE t1 (a INT, b INT) === modified file 'sql/ha_partition.cc' --- a/sql/ha_partition.cc 2010-07-08 23:09:31 +0000 +++ b/sql/ha_partition.cc 2010-08-10 08:43:12 +0000 @@ -232,6 +232,7 @@ void ha_partition::init_handler_variable m_innodb= FALSE; m_extra_cache= FALSE; m_extra_cache_size= 0; + m_extra_prepare_for_update= FALSE; m_handler_status= handler_not_initialized; m_low_byte_first= 1; m_part_field_array= NULL; @@ -5549,9 +5550,20 @@ int ha_partition::extra(enum ha_extra_fu case HA_EXTRA_PREPARE_FOR_RENAME: DBUG_RETURN(prepare_for_rename()); break; + case HA_EXTRA_PREPARE_FOR_UPDATE: + DBUG_ASSERT(m_extra_cache); + /* + Needs to be run on the first partition in the range now, and + later in late_extra_cache, when switching to a new partition to scan. + */ + m_extra_prepare_for_update= TRUE; + if (m_part_spec.start_part != NO_CURRENT_PART_ID) + { + VOID(m_file[m_part_spec.start_part]->extra(HA_EXTRA_PREPARE_FOR_UPDATE)); + } + break; case HA_EXTRA_NORMAL: case HA_EXTRA_QUICK: - case HA_EXTRA_PREPARE_FOR_UPDATE: case HA_EXTRA_FORCE_REOPEN: case HA_EXTRA_PREPARE_FOR_DROP: case HA_EXTRA_FLUSH_CACHE: @@ -5578,6 +5590,7 @@ int ha_partition::extra(enum ha_extra_fu { m_extra_cache= FALSE; m_extra_cache_size= 0; + m_extra_prepare_for_update= FALSE; DBUG_RETURN(loop_extra(operation)); } case HA_EXTRA_IGNORE_NO_KEY: @@ -5705,6 +5718,7 @@ int ha_partition::extra_opt(enum ha_extr void ha_partition::prepare_extra_cache(uint cachesize) { DBUG_ENTER("ha_partition::prepare_extra_cache()"); + DBUG_PRINT("info", ("cachesize %u", cachesize)); m_extra_cache= TRUE; m_extra_cache_size= cachesize; @@ -5793,14 +5807,21 @@ void ha_partition::late_extra_cache(uint { handler *file; DBUG_ENTER("ha_partition::late_extra_cache"); + DBUG_PRINT("info", ("extra_cache %u partid %u size %u", m_extra_cache, + partition_id, m_extra_cache_size)); - if (!m_extra_cache) + if (!m_extra_cache && !m_extra_prepare_for_update) DBUG_VOID_RETURN; file= m_file[partition_id]; if (m_extra_cache_size == 0) VOID(file->extra(HA_EXTRA_CACHE)); else VOID(file->extra_opt(HA_EXTRA_CACHE, m_extra_cache_size)); + if (m_extra_prepare_for_update) + { + DBUG_ASSERT(m_extra_cache); + VOID(file->extra(HA_EXTRA_PREPARE_FOR_UPDATE)); + } DBUG_VOID_RETURN; } @@ -5821,7 +5842,7 @@ void ha_partition::late_extra_no_cache(u handler *file; DBUG_ENTER("ha_partition::late_extra_no_cache"); - if (!m_extra_cache) + if (!m_extra_cache && !m_extra_prepare_for_update) DBUG_VOID_RETURN; file= m_file[partition_id]; VOID(file->extra(HA_EXTRA_NO_CACHE)); === modified file 'sql/ha_partition.h' --- a/sql/ha_partition.h 2010-07-09 13:00:33 +0000 +++ b/sql/ha_partition.h 2010-08-10 08:43:12 +0000 @@ -154,6 +154,8 @@ private: */ bool m_extra_cache; uint m_extra_cache_size; + /* The same goes for HA_EXTRA_PREPARE_FOR_UPDATE */ + bool m_extra_prepare_for_update; void init_handler_variables(); /* --===============5044594654315131102== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/mattias.jonsson@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: mattias.jonsson@stripped\ # 7pqozmh1gv90aq90 # target_branch: file:///Users/mattiasj/mysql-bzr/b55458-51-bt/ # testament_sha1: a2c1a1bbc5194856d0df7966362d449b220aa245 # timestamp: 2010-08-10 10:43:40 +0200 # base_revision_id: jon.hauglid@stripped\ # 6aoc8dxzcl3otfn5 # # Begin bundle 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 oedz6Qb+br5vTEf/F3JFOFCQXzf8Xg== --===============5044594654315131102==--