From: Sergey Vojtovich Date: February 5 2009 1:03pm Subject: bzr commit into mysql-5.1-bugteam branch (svoj:2785) Bug#39185 List-Archive: http://lists.mysql.com/commits/65347 X-Bug: 39185 Message-Id: <20090205130357.A050241CED9@june.myoffice.izhnet.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7BIT #At file:///home/svoj/devel/bzr-mysql/mysql-5.1-bugteam-bug39185/ based on revid:gshchepa@stripped 2785 Sergey Vojtovich 2009-02-05 BUG#39185 - Cardinality for merge tables calculated incorrectly. Every subsequent query to a merge table with indexes was lowering down cardinality. The problem was that key statistics was not cleared when merge children were detached. Causing next attach children perform incremental key statistics calculation. Fixed by clearing key statistics when attaching first child. modified: mysql-test/r/merge.result mysql-test/t/merge.test storage/myisammrg/myrg_open.c per-file messages: mysql-test/r/merge.result A test case for BUG#39185. mysql-test/t/merge.test A test case for BUG#39185. storage/myisammrg/myrg_open.c Clear key statistics when we're attaching first child, even if it's buffer was allocated before. This is needed because detach_children() doesn't clear statistics, causing incremental statistics calculation. === modified file 'mysql-test/r/merge.result' --- a/mysql-test/r/merge.result 2009-02-04 13:00:40 +0000 +++ b/mysql-test/r/merge.result 2009-02-05 13:03:47 +0000 @@ -2041,4 +2041,23 @@ EXPLAIN SELECT COUNT(*) FROM t4; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away DROP TABLE t1, t2, t3, t4; +CREATE TABLE t1(a INT, KEY(a)); +INSERT INTO t1 VALUES(0),(1),(2),(3),(4); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +CREATE TABLE m1(a INT, KEY(a)) ENGINE=MERGE UNION=(t1); +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; +CARDINALITY +5 +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; +CARDINALITY +5 +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; +CARDINALITY +5 +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; +CARDINALITY +5 +DROP TABLE t1, m1; End of 5.1 tests === modified file 'mysql-test/t/merge.test' --- a/mysql-test/t/merge.test 2009-02-04 13:00:40 +0000 +++ b/mysql-test/t/merge.test 2009-02-05 13:03:47 +0000 @@ -1435,4 +1435,17 @@ EXPLAIN SELECT COUNT(*) FROM t1; EXPLAIN SELECT COUNT(*) FROM t4; DROP TABLE t1, t2, t3, t4; +# +# BUG#39185 - Cardinality for merge tables calculated incorrectly. +# +CREATE TABLE t1(a INT, KEY(a)); +INSERT INTO t1 VALUES(0),(1),(2),(3),(4); +ANALYZE TABLE t1; +CREATE TABLE m1(a INT, KEY(a)) ENGINE=MERGE UNION=(t1); +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; +DROP TABLE t1, m1; + --echo End of 5.1 tests === modified file 'storage/myisammrg/myrg_open.c' --- a/storage/myisammrg/myrg_open.c 2009-02-04 13:00:40 +0000 +++ b/storage/myisammrg/myrg_open.c 2009-02-05 13:03:47 +0000 @@ -428,10 +428,11 @@ int myrg_attach_children(MYRG_INFO *m_in if (!m_info->rec_per_key_part) { if(!(m_info->rec_per_key_part= (ulong*) - my_malloc(key_parts * sizeof(long), MYF(MY_WME|MY_ZEROFILL)))) + my_malloc(key_parts * sizeof(long), MYF(MY_WME)))) goto err; /* purecov: inspected */ errpos= 1; } + bzero((char*) m_info->rec_per_key_part, key_parts * sizeof(long)); } /* Add MyISAM table info. */