From: Sergey Glukhov Date: November 23 2010 10:18am Subject: bzr commit into mysql-5.1-bugteam branch (sergey.glukhov:3516) Bug#56862 List-Archive: http://lists.mysql.com/commits/124718 X-Bug: 56862 Message-Id: <201011231028.oAN3CDEa012763@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4381999509923509267==" --===============4381999509923509267== 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:alexander.nozdrin@stripped 3516 Sergey Glukhov 2010-11-23 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-11-10 08:32:42 +0000 +++ b/mysql-test/suite/innodb/r/innodb_mysql.result 2010-11-23 10:18:47 +0000 @@ -2599,6 +2599,46 @@ rows 3 Extra Using index 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; +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 # # Test for bug #39932 "create table fails if column for FK is in different === modified file 'mysql-test/suite/innodb/t/innodb_mysql.test' --- a/mysql-test/suite/innodb/t/innodb_mysql.test 2010-11-19 09:29:08 +0000 +++ b/mysql-test/suite/innodb/t/innodb_mysql.test 2010-11-23 10:18:47 +0000 @@ -824,6 +824,48 @@ CREATE INDEX b ON t1(a,b,c,d); DROP TABLE t1; --echo # +--echo # Bug#56862 Execution of a query that uses index merge returns a wrong result +--echo # + +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 '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-23 10:18:47 +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-23 10:18:47 +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-23 10:18:47 +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-23 10:18:47 +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 --===============4381999509923509267== 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\ # q8qigcsxo7ieank9 # target_branch: file:///home/gluh/MySQL/mysql-5.1-bugteam/ # testament_sha1: e01fde947c9b78378c161d5dfbccd99e709f4429 # timestamp: 2010-11-23 13:18:57 +0300 # base_revision_id: alexander.nozdrin@stripped\ # rksgxm2ol291wxfu # # Begin bundle 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 --===============4381999509923509267==--