From: Mattias Jonsson Date: February 1 2011 11:38am Subject: bzr commit into mysql-trunk branch (mattias.jonsson:3571) Bug#59864 List-Archive: http://lists.mysql.com/commits/130115 X-Bug: 59864 Message-Id: <201102011139.p11BSdQa028956@rcsinet13.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7722189009162034156==" --===============7722189009162034156== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mattiasj/mysql-bzr/merge-trunk-wl5217_3/ based on revid:mattias.jonsson@stripped 3571 Mattias Jonsson 2011-02-01 Bug#59864: Crash if table empty: DELETE FROM t2 PARTITION (subp3). Crash was due to a DBUG_ASSERT, asserting that a handler was locked before ha_delete_all_rows was called. This did not happen for partitioning since the lock was pruned, but ha_partition::delete_all_rows did not follow the pruning, resulting in calling ha_delete_all_rows on a non locked partition Fixed by only call ha_delete_all_rows() for non pruned partitions. @ mysql-test/r/partition_explicit_prune.result Updated result @ mysql-test/t/partition_explicit_prune.test Added test @ sql/ha_partition.cc Only call ha_delete_all_rows for non pruned partitions modified: mysql-test/r/partition_explicit_prune.result mysql-test/t/partition_explicit_prune.test sql/ha_partition.cc === modified file 'mysql-test/r/partition_explicit_prune.result' --- a/mysql-test/r/partition_explicit_prune.result 2011-01-31 13:51:59 +0000 +++ b/mysql-test/r/partition_explicit_prune.result 2011-02-01 11:38:39 +0000 @@ -1432,4 +1432,240 @@ explain partitions select * from t1 part id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 0 Using where drop table t1; +# +# Bug#59864: Crash if table empty: DELETE FROM t2 PARTITION (subp3). +# +CREATE TABLE t1 +(a INT NOT NULL, +b varchar (64), +INDEX (b,a), +PRIMARY KEY (a)) +PARTITION BY RANGE (a) +SUBPARTITION BY HASH (a) SUBPARTITIONS 3 +(PARTITION pNeg VALUES LESS THAN (0) +(SUBPARTITION subp0, +SUBPARTITION subp1, +SUBPARTITION subp2), +PARTITION `p0-29` VALUES LESS THAN (30) +(SUBPARTITION subp3, +SUBPARTITION subp4, +SUBPARTITION subp5), +PARTITION `p30-299` VALUES LESS THAN (300) +(SUBPARTITION subp6, +SUBPARTITION subp7, +SUBPARTITION subp8), +PARTITION `p300-2999` VALUES LESS THAN (3000) +(SUBPARTITION subp9, +SUBPARTITION subp10, +SUBPARTITION subp11), +PARTITION `p3000-299999` VALUES LESS THAN (300000) +(SUBPARTITION subp12, +SUBPARTITION subp13, +SUBPARTITION subp14)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `b` varchar(64) DEFAULT NULL, + PRIMARY KEY (`a`), + KEY `b` (`b`,`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY RANGE (a) +SUBPARTITION BY HASH (a) +(PARTITION pNeg VALUES LESS THAN (0) + (SUBPARTITION subp0 ENGINE = InnoDB, + SUBPARTITION subp1 ENGINE = InnoDB, + SUBPARTITION subp2 ENGINE = InnoDB), + PARTITION `p0-29` VALUES LESS THAN (30) + (SUBPARTITION subp3 ENGINE = InnoDB, + SUBPARTITION subp4 ENGINE = InnoDB, + SUBPARTITION subp5 ENGINE = InnoDB), + PARTITION `p30-299` VALUES LESS THAN (300) + (SUBPARTITION subp6 ENGINE = InnoDB, + SUBPARTITION subp7 ENGINE = InnoDB, + SUBPARTITION subp8 ENGINE = InnoDB), + PARTITION `p300-2999` VALUES LESS THAN (3000) + (SUBPARTITION subp9 ENGINE = InnoDB, + SUBPARTITION subp10 ENGINE = InnoDB, + SUBPARTITION subp11 ENGINE = InnoDB), + PARTITION `p3000-299999` VALUES LESS THAN (300000) + (SUBPARTITION subp12 ENGINE = InnoDB, + SUBPARTITION subp13 ENGINE = InnoDB, + SUBPARTITION subp14 ENGINE = InnoDB)) */ +INSERT INTO t1 VALUES (-9, "negative nine"), (-8, "-8"), (-7, "-7"), (-6, "-6"), (-5, "-5"), (-4, "-4"), (-3, "-3"), (-2, "-2"), (-1, "-1"); +INSERT INTO t1 VALUES (9, "nine"), (8, "8"), (7, "7"), (6, "6"), (5, "5"), (4, "4"), (3, "3"), (2, "2"), (1, "1"); +INSERT INTO t1 VALUES (39, "Thirty nine"), (38, "38"), (37, "37"), (36, "36"), (35, "35"), (34, "34"), (33, "33"), (32, "32"), (31, "31"); +INSERT INTO t1 VALUES (339, "Three hundred thirty nine"), (338, "338"), (337, "337"), (336, "336"), (335, "335"), (334, "334"), (333, "333"), (332, "332"), (331, "331"); +INSERT INTO t1 VALUES (3339, "Three thousand three hundred thirty nine"), (3338, "3338"), (3337, "3337"), (3336, "3336"), (3335, "3335"), (3334, "3334"), (3333, "3333"), (3332, "3332"), (3331, "3331"); +SELECT * FROM t1; +a b +-1 -1 +-2 -2 +-3 -3 +-4 -4 +-5 -5 +-6 -6 +-7 -7 +-8 -8 +-9 negative nine +1 1 +2 2 +3 3 +31 31 +32 32 +33 33 +331 331 +332 332 +333 333 +3331 3331 +3332 3332 +3333 3333 +3334 3334 +3335 3335 +3336 3336 +3337 3337 +3338 3338 +3339 Three thousand three hundred thirty nine +334 334 +335 335 +336 336 +337 337 +338 338 +339 Three hundred thirty nine +34 34 +35 35 +36 36 +37 37 +38 38 +39 Thirty nine +4 4 +5 5 +6 6 +7 7 +8 8 +9 nine +SELECT * FROM t1 PARTITION (subp3); +a b +3 3 +6 6 +9 nine +DELETE FROM t1 PARTITION (subp3); +SELECT * FROM t1; +a b +-1 -1 +-2 -2 +-3 -3 +-4 -4 +-5 -5 +-6 -6 +-7 -7 +-8 -8 +-9 negative nine +1 1 +2 2 +31 31 +32 32 +33 33 +331 331 +332 332 +333 333 +3331 3331 +3332 3332 +3333 3333 +3334 3334 +3335 3335 +3336 3336 +3337 3337 +3338 3338 +3339 Three thousand three hundred thirty nine +334 334 +335 335 +336 336 +337 337 +338 338 +339 Three hundred thirty nine +34 34 +35 35 +36 36 +37 37 +38 38 +39 Thirty nine +4 4 +5 5 +7 7 +8 8 +SELECT * FROM t1 PARTITION (subp3); +a b +DELETE FROM t1 PARTITION (`p0-29`); +SELECT * FROM t1; +a b +-1 -1 +-2 -2 +-3 -3 +-4 -4 +-5 -5 +-6 -6 +-7 -7 +-8 -8 +-9 negative nine +31 31 +32 32 +33 33 +331 331 +332 332 +333 333 +3331 3331 +3332 3332 +3333 3333 +3334 3334 +3335 3335 +3336 3336 +3337 3337 +3338 3338 +3339 Three thousand three hundred thirty nine +334 334 +335 335 +336 336 +337 337 +338 338 +339 Three hundred thirty nine +34 34 +35 35 +36 36 +37 37 +38 38 +39 Thirty nine +SELECT * FROM t1 PARTITION (`p0-29`); +a b +ALTER TABLE t1 PARTITION BY HASH (a) PARTITIONS 3; +DELETE FROM t1 PARTITION (p2); +SELECT * FROM t1; +a b +-1 -1 +-3 -3 +-4 -4 +-6 -6 +-7 -7 +-9 negative nine +31 31 +33 33 +331 331 +333 333 +3331 3331 +3333 3333 +3334 3334 +3336 3336 +3337 3337 +3339 Three thousand three hundred thirty nine +334 334 +336 336 +337 337 +339 Three hundred thirty nine +34 34 +36 36 +37 37 +39 Thirty nine +SELECT * FROM t1 PARTITION (p2); +a b +DROP TABLE t1; SET @@default_storage_engine = @old_default_storage_engine; === modified file 'mysql-test/t/partition_explicit_prune.test' --- a/mysql-test/t/partition_explicit_prune.test 2011-01-31 13:51:59 +0000 +++ b/mysql-test/t/partition_explicit_prune.test 2011-02-01 11:38:39 +0000 @@ -647,4 +647,74 @@ explain partitions select * from t1 part explain partitions select * from t1 partition (p2) where a=1; drop table t1; + +--echo # +--echo # Bug#59864: Crash if table empty: DELETE FROM t2 PARTITION (subp3). +--echo # +CREATE TABLE t1 +(a INT NOT NULL, + b varchar (64), + INDEX (b,a), + PRIMARY KEY (a)) +PARTITION BY RANGE (a) +SUBPARTITION BY HASH (a) SUBPARTITIONS 3 +(PARTITION pNeg VALUES LESS THAN (0) + (SUBPARTITION subp0, + SUBPARTITION subp1, + SUBPARTITION subp2), + PARTITION `p0-29` VALUES LESS THAN (30) + (SUBPARTITION subp3, + SUBPARTITION subp4, + SUBPARTITION subp5), + PARTITION `p30-299` VALUES LESS THAN (300) + (SUBPARTITION subp6, + SUBPARTITION subp7, + SUBPARTITION subp8), + PARTITION `p300-2999` VALUES LESS THAN (3000) + (SUBPARTITION subp9, + SUBPARTITION subp10, + SUBPARTITION subp11), + PARTITION `p3000-299999` VALUES LESS THAN (300000) + (SUBPARTITION subp12, + SUBPARTITION subp13, + SUBPARTITION subp14)); + +eval SHOW CREATE TABLE t1; + +INSERT INTO t1 VALUES (-9, "negative nine"), (-8, "-8"), (-7, "-7"), (-6, "-6"), (-5, "-5"), (-4, "-4"), (-3, "-3"), (-2, "-2"), (-1, "-1"); +INSERT INTO t1 VALUES (9, "nine"), (8, "8"), (7, "7"), (6, "6"), (5, "5"), (4, "4"), (3, "3"), (2, "2"), (1, "1"); +INSERT INTO t1 VALUES (39, "Thirty nine"), (38, "38"), (37, "37"), (36, "36"), (35, "35"), (34, "34"), (33, "33"), (32, "32"), (31, "31"); +INSERT INTO t1 VALUES (339, "Three hundred thirty nine"), (338, "338"), (337, "337"), (336, "336"), (335, "335"), (334, "334"), (333, "333"), (332, "332"), (331, "331"); +INSERT INTO t1 VALUES (3339, "Three thousand three hundred thirty nine"), (3338, "3338"), (3337, "3337"), (3336, "3336"), (3335, "3335"), (3334, "3334"), (3333, "3333"), (3332, "3332"), (3331, "3331"); + +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT * FROM t1 PARTITION (subp3); + +DELETE FROM t1 PARTITION (subp3); + +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT * FROM t1 PARTITION (subp3); + +DELETE FROM t1 PARTITION (`p0-29`); + +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT * FROM t1 PARTITION (`p0-29`); + +ALTER TABLE t1 PARTITION BY HASH (a) PARTITIONS 3; + +DELETE FROM t1 PARTITION (p2); + +--sorted_result +SELECT * FROM t1; +--sorted_result +SELECT * FROM t1 PARTITION (p2); + +DROP TABLE t1; + SET @@default_storage_engine = @old_default_storage_engine; === modified file 'sql/ha_partition.cc' --- a/sql/ha_partition.cc 2011-01-28 17:18:34 +0000 +++ b/sql/ha_partition.cc 2011-02-01 11:38:39 +0000 @@ -3536,8 +3536,12 @@ int ha_partition::delete_all_rows() file= m_file; do { - if ((error= (*file)->ha_delete_all_rows())) - DBUG_RETURN(error); + /* Can be pruned, like DELETE FROM t PARTITION (pX) */ + if (bitmap_is_set(&(m_part_info->read_partitions), file - m_file)) + { + if ((error= (*file)->ha_delete_all_rows())) + DBUG_RETURN(error); + } } while (*(++file)); DBUG_RETURN(0); } --===============7722189009162034156== 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\ # hej4ul3rswpx0l2r # target_branch: file:///Users/mattiasj/mysql-bzr/merge-trunk-\ # wl5217_3/ # testament_sha1: 7803426b7093173543a84242258db9c6228c75b6 # timestamp: 2011-02-01 12:38:55 +0100 # source_branch: file:///Users/mattiasj/mysql-bzr/merge-trunk-wl5217/ # base_revision_id: mattias.jonsson@stripped\ # j9eeuvtu407mm4aj # # Begin bundle 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 YZN+Q/xdyRThQkKtLTAA --===============7722189009162034156==--