From: Sergey Glukhov Date: November 2 2010 3:07pm Subject: bzr commit into mysql-5.1-bugteam branch (sergey.glukhov:3551) Bug#56862 List-Archive: http://lists.mysql.com/commits/122559 X-Bug: 56862 Message-Id: <201011021515.oA28ffxp031017@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2299187415938691901==" --===============2299187415938691901== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/gluh/MySQL/mysql-5.1-bugteam/ based on revid:georgi.kodinov@stripped 3551 Sergey Glukhov 2010-11-02 Bug#56862 Execution of a query that uses index merge returns a wrong result In case of low memory sort buffer QUICK_INDEX_MERGE_SELECT creates temporary file where is stores row ids which meet QUICK_SELECT ranges except of clustered pk range, clustered range is processed separately. In init_read_record we check if temporary file is used and choose appropriate record access method. It does not take into account that temporary file contains partial result in case of QUICK_INDEX_MERGE_SELECT with clustered pk range. The fix is always to use rr_quick if QUICK_INDEX_MERGE_SELECT with clustered pk range is used. @ mysql-test/suite/innodb/r/innodb_mysql.result test case @ mysql-test/suite/innodb/t/innodb_mysql.test test case @ mysql-test/suite/innodb_plugin/r/innodb_mysql.result test case @ mysql-test/suite/innodb_plugin/t/innodb_mysql.test test case @ sql/opt_range.h added new method @ sql/records.cc The fix is always to use rr_quick if QUICK_INDEX_MERGE_SELECT with clustered pk range is used. modified: mysql-test/suite/innodb/r/innodb_mysql.result mysql-test/suite/innodb/t/innodb_mysql.test mysql-test/suite/innodb_plugin/r/innodb_mysql.result mysql-test/suite/innodb_plugin/t/innodb_mysql.test sql/opt_range.h sql/records.cc === modified file 'mysql-test/suite/innodb/r/innodb_mysql.result' --- a/mysql-test/suite/innodb/r/innodb_mysql.result 2010-10-05 08:11:56 +0000 +++ b/mysql-test/suite/innodb/r/innodb_mysql.result 2010-11-02 15:07:45 +0000 @@ -2620,3 +2620,41 @@ t2 CREATE TABLE `t2` ( CONSTRAINT `x` FOREIGN KEY (`fk`) REFERENCES `t1` (`pk`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 drop table t2, t1; +CREATE TABLE t1 ( +pk int NOT NULL AUTO_INCREMENT PRIMARY KEY, +a int, +b int, +INDEX idx(a)) +ENGINE=INNODB; +INSERT INTO t1(a,b) VALUES +(11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500), +(3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800), +(6, 600), (18, 1800), (9, 900), (10, 1000), (7, 700), +(13, 1300), (15, 1500), (19, 1900), (16, 1600), (20, 2000); +INSERT INTO t1(a,b) SELECT a+20, b+2000 FROM t1; +INSERT INTO t1(a,b) SELECT a+40, b+4000 FROM t1; +INSERT INTO t1(a,b) SELECT a+80, b+8000 FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1 VALUES (1000000, 0, 0); +SET SESSION sort_buffer_size = 1024*36; +EXPLAIN +SELECT COUNT(*) FROM +(SELECT * FROM t1 FORCE INDEX (idx,PRIMARY) +WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away +2 DERIVED t1 index_merge PRIMARY,idx idx,PRIMARY 5,4 NULL 3537 Using sort_union(idx,PRIMARY); Using where +SELECT COUNT(*) FROM +(SELECT * FROM t1 FORCE INDEX (idx,PRIMARY) +WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t; +COUNT(*) +1537 +SET SESSION sort_buffer_size = DEFAULT; +DROP TABLE t1; === modified file 'mysql-test/suite/innodb/t/innodb_mysql.test' --- a/mysql-test/suite/innodb/t/innodb_mysql.test 2010-10-05 08:11:56 +0000 +++ b/mysql-test/suite/innodb/t/innodb_mysql.test 2010-11-02 15:07:45 +0000 @@ -845,3 +845,47 @@ create table t2 (fk int, key x (fk), constraint x foreign key (FK) references t1 (PK)) engine=InnoDB; show create table t2; drop table t2, t1; + +# +# Bug#56862 Execution of a query that uses index merge returns a wrong result +# + +CREATE TABLE t1 ( + pk int NOT NULL AUTO_INCREMENT PRIMARY KEY, + a int, + b int, + INDEX idx(a)) +ENGINE=INNODB; + +INSERT INTO t1(a,b) VALUES + (11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500), + (3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800), + (6, 600), (18, 1800), (9, 900), (10, 1000), (7, 700), + (13, 1300), (15, 1500), (19, 1900), (16, 1600), (20, 2000); +INSERT INTO t1(a,b) SELECT a+20, b+2000 FROM t1; +INSERT INTO t1(a,b) SELECT a+40, b+4000 FROM t1; +INSERT INTO t1(a,b) SELECT a+80, b+8000 FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1 VALUES (1000000, 0, 0); + +SET SESSION sort_buffer_size = 1024*36; + +EXPLAIN +SELECT COUNT(*) FROM + (SELECT * FROM t1 FORCE INDEX (idx,PRIMARY) + WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t; + +SELECT COUNT(*) FROM + (SELECT * FROM t1 FORCE INDEX (idx,PRIMARY) + WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t; + +SET SESSION sort_buffer_size = DEFAULT; + +DROP TABLE t1; === modified file 'mysql-test/suite/innodb_plugin/r/innodb_mysql.result' --- a/mysql-test/suite/innodb_plugin/r/innodb_mysql.result 2010-09-16 10:51:08 +0000 +++ b/mysql-test/suite/innodb_plugin/r/innodb_mysql.result 2010-11-02 15:07:45 +0000 @@ -2400,4 +2400,42 @@ PACK_KEYS=0; CREATE INDEX a ON t1 (a); CREATE INDEX c on t1 (c); DROP TABLE t1; +CREATE TABLE t1 ( +pk int NOT NULL AUTO_INCREMENT PRIMARY KEY, +a int, +b int, +INDEX idx(a)) +ENGINE=INNODB; +INSERT INTO t1(a,b) VALUES +(11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500), +(3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800), +(6, 600), (18, 1800), (9, 900), (10, 1000), (7, 700), +(13, 1300), (15, 1500), (19, 1900), (16, 1600), (20, 2000); +INSERT INTO t1(a,b) SELECT a+20, b+2000 FROM t1; +INSERT INTO t1(a,b) SELECT a+40, b+4000 FROM t1; +INSERT INTO t1(a,b) SELECT a+80, b+8000 FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1 VALUES (1000000, 0, 0); +SET SESSION sort_buffer_size = 1024*36; +EXPLAIN +SELECT COUNT(*) FROM +(SELECT * FROM t1 FORCE INDEX (idx,PRIMARY) +WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away +2 DERIVED t1 index_merge PRIMARY,idx idx,PRIMARY 5,4 NULL 3537 Using sort_union(idx,PRIMARY); Using where +SELECT COUNT(*) FROM +(SELECT * FROM t1 FORCE INDEX (idx,PRIMARY) +WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t; +COUNT(*) +1537 +SET SESSION sort_buffer_size = DEFAULT; +DROP TABLE t1; End of 5.1 tests === modified file 'mysql-test/suite/innodb_plugin/t/innodb_mysql.test' --- a/mysql-test/suite/innodb_plugin/t/innodb_mysql.test 2010-09-16 10:51:08 +0000 +++ b/mysql-test/suite/innodb_plugin/t/innodb_mysql.test 2010-11-02 15:07:45 +0000 @@ -645,5 +645,48 @@ CREATE INDEX c on t1 (c); DROP TABLE t1; +# +# Bug#56862 Execution of a query that uses index merge returns a wrong result +# + +CREATE TABLE t1 ( + pk int NOT NULL AUTO_INCREMENT PRIMARY KEY, + a int, + b int, + INDEX idx(a)) +ENGINE=INNODB; + +INSERT INTO t1(a,b) VALUES + (11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500), + (3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800), + (6, 600), (18, 1800), (9, 900), (10, 1000), (7, 700), + (13, 1300), (15, 1500), (19, 1900), (16, 1600), (20, 2000); +INSERT INTO t1(a,b) SELECT a+20, b+2000 FROM t1; +INSERT INTO t1(a,b) SELECT a+40, b+4000 FROM t1; +INSERT INTO t1(a,b) SELECT a+80, b+8000 FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1(a,b) SELECT a,b FROM t1; +INSERT INTO t1 VALUES (1000000, 0, 0); + +SET SESSION sort_buffer_size = 1024*36; + +EXPLAIN +SELECT COUNT(*) FROM + (SELECT * FROM t1 FORCE INDEX (idx,PRIMARY) + WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t; + +SELECT COUNT(*) FROM + (SELECT * FROM t1 FORCE INDEX (idx,PRIMARY) + WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t; + +SET SESSION sort_buffer_size = DEFAULT; + +DROP TABLE t1; --echo End of 5.1 tests === modified file 'sql/opt_range.h' --- a/sql/opt_range.h 2010-07-19 09:03:52 +0000 +++ b/sql/opt_range.h 2010-11-02 15:07:45 +0000 @@ -265,6 +265,7 @@ public: virtual bool reverse_sorted() = 0; virtual bool unique_key_range() { return false; } + virtual bool clustered_pk_range() { return false; } enum { QS_TYPE_RANGE = 0, @@ -533,6 +534,8 @@ public: THD *thd; int read_keys_and_merge(); + bool clustered_pk_range() { return test(pk_quick_select); } + /* used to get rows collected in Unique */ READ_RECORD read_record; }; === modified file 'sql/records.cc' --- a/sql/records.cc 2010-02-26 13:16:46 +0000 +++ b/sql/records.cc 2010-11-02 15:07:45 +0000 @@ -194,6 +194,15 @@ void init_read_record(READ_RECORD *info, if (select && my_b_inited(&select->file)) tempfile= &select->file; + else if (select && select->quick && select->quick->clustered_pk_range()) + { + /* + In case of QUICK_INDEX_MERGE_SELECT with clustered pk range we have to + use its own access method(i.e QUICK_INDEX_MERGE_SELECT::get_next()) as + sort file does not contain rowids which satisfy clustered pk range. + */ + tempfile= 0; + } else tempfile= table->sort.io_cache; if (tempfile && my_b_inited(tempfile)) // Test if ref-records was used --===============2299187415938691901== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/sergey.glukhov@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: sergey.glukhov@stripped\ # ejxt7p1n0ibukvr2 # target_branch: file:///home/gluh/MySQL/mysql-5.1-bugteam/ # testament_sha1: 8f4dd96a36858b41e9d753f5238cfab49b126178 # timestamp: 2010-11-02 18:07:50 +0300 # base_revision_id: georgi.kodinov@stripped\ # 8nlpjfmfia37n2q2 # # Begin bundle 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 LwA= --===============2299187415938691901==--