From f20cab1a8397c3ec4baeadb33c29e466ac977b59 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya Date: Fri, 7 Mar 2014 13:00:20 +0100 Subject: [PATCH] BUG#13803810: TOO FEW ROWS RETURNED FOR RANGE ACCESS IN VARCHAR INDEX USING DATETIME VALUE - Backport the testcase from mysql-5.6 --- mysql-test/r/range.result | 54 +++++++++++++++++++++++++++++++ mysql-test/r/range_mrr_icp.result | 54 +++++++++++++++++++++++++++++++ mysql-test/t/range.test | 38 ++++++++++++++++++++++ 3 files changed, 146 insertions(+) diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index 3568f886eb9..01be3cbfe2c 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -2058,6 +2058,60 @@ pk 5 DROP TABLE t1; # +# BUG#13803810: TOO FEW ROWS RETURNED FOR RANGE ACCESS IN +# VARCHAR INDEX USING DATETIME VALUE + +CREATE TABLE t1 (a DATETIME); +INSERT INTO t1 VALUES ('2001-01-01 00:00:00'); +INSERT INTO t1 VALUES ('2001-01-01 11:22:33'); +CREATE TABLE t2 (b VARCHAR(64), KEY (b)); +INSERT INTO t2 VALUES ('2001-01-01'); +INSERT INTO t2 VALUES ('2001.01.01'); +INSERT INTO t2 VALUES ('2001#01#01'); +INSERT INTO t2 VALUES ('2001-01-01 00:00:00'); +INSERT INTO t2 VALUES ('2001-01-01 11:22:33'); + +# range/ref access cannot be used for this query + +EXPLAIN SELECT * FROM t2 WHERE b=CAST('2001-01-01' AS DATE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 index b b 67 NULL 5 Using where; Using index +SELECT * FROM t2 WHERE b=CAST('2001-01-01' AS DATE); +b +2001#01#01 +2001-01-01 +2001-01-01 00:00:00 +2001.01.01 + +# range/ref access cannot be used for any of the queries below. +# See BUG#13814468 about 'Range checked for each record' + +EXPLAIN SELECT * FROM t1, t2 WHERE a=b ORDER BY BINARY a, BINARY b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort +1 SIMPLE t2 ALL b NULL NULL NULL 5 Range checked for each record (index map: 0x1) +SELECT * FROM t1, t2 WHERE a=b ORDER BY BINARY a, BINARY b; +a b +2001-01-01 00:00:00 2001#01#01 +2001-01-01 00:00:00 2001-01-01 +2001-01-01 00:00:00 2001-01-01 00:00:00 +2001-01-01 00:00:00 2001.01.01 +2001-01-01 11:22:33 2001-01-01 11:22:33 + +EXPLAIN SELECT * FROM t1, t2 WHERE b=a ORDER BY BINARY a, BINARY b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort +1 SIMPLE t2 ALL b NULL NULL NULL 5 Range checked for each record (index map: 0x1) +SELECT * FROM t1, t2 WHERE b=a ORDER BY BINARY a, BINARY b; +a b +2001-01-01 00:00:00 2001#01#01 +2001-01-01 00:00:00 2001-01-01 +2001-01-01 00:00:00 2001-01-01 00:00:00 +2001-01-01 00:00:00 2001.01.01 +2001-01-01 11:22:33 2001-01-01 11:22:33 + +DROP TABLE t1,t2; +# # MDEV-5606: range optimizer: "x < y" is sargable, while "y > x" is not # create table t1(a int); diff --git a/mysql-test/r/range_mrr_icp.result b/mysql-test/r/range_mrr_icp.result index 924682827f9..dc6bed5fd98 100644 --- a/mysql-test/r/range_mrr_icp.result +++ b/mysql-test/r/range_mrr_icp.result @@ -2060,6 +2060,60 @@ pk 5 DROP TABLE t1; # +# BUG#13803810: TOO FEW ROWS RETURNED FOR RANGE ACCESS IN +# VARCHAR INDEX USING DATETIME VALUE + +CREATE TABLE t1 (a DATETIME); +INSERT INTO t1 VALUES ('2001-01-01 00:00:00'); +INSERT INTO t1 VALUES ('2001-01-01 11:22:33'); +CREATE TABLE t2 (b VARCHAR(64), KEY (b)); +INSERT INTO t2 VALUES ('2001-01-01'); +INSERT INTO t2 VALUES ('2001.01.01'); +INSERT INTO t2 VALUES ('2001#01#01'); +INSERT INTO t2 VALUES ('2001-01-01 00:00:00'); +INSERT INTO t2 VALUES ('2001-01-01 11:22:33'); + +# range/ref access cannot be used for this query + +EXPLAIN SELECT * FROM t2 WHERE b=CAST('2001-01-01' AS DATE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 index b b 67 NULL 5 Using where; Using index +SELECT * FROM t2 WHERE b=CAST('2001-01-01' AS DATE); +b +2001#01#01 +2001-01-01 +2001-01-01 00:00:00 +2001.01.01 + +# range/ref access cannot be used for any of the queries below. +# See BUG#13814468 about 'Range checked for each record' + +EXPLAIN SELECT * FROM t1, t2 WHERE a=b ORDER BY BINARY a, BINARY b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort +1 SIMPLE t2 ALL b NULL NULL NULL 5 Range checked for each record (index map: 0x1) +SELECT * FROM t1, t2 WHERE a=b ORDER BY BINARY a, BINARY b; +a b +2001-01-01 00:00:00 2001#01#01 +2001-01-01 00:00:00 2001-01-01 +2001-01-01 00:00:00 2001-01-01 00:00:00 +2001-01-01 00:00:00 2001.01.01 +2001-01-01 11:22:33 2001-01-01 11:22:33 + +EXPLAIN SELECT * FROM t1, t2 WHERE b=a ORDER BY BINARY a, BINARY b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort +1 SIMPLE t2 ALL b NULL NULL NULL 5 Range checked for each record (index map: 0x1) +SELECT * FROM t1, t2 WHERE b=a ORDER BY BINARY a, BINARY b; +a b +2001-01-01 00:00:00 2001#01#01 +2001-01-01 00:00:00 2001-01-01 +2001-01-01 00:00:00 2001-01-01 00:00:00 +2001-01-01 00:00:00 2001.01.01 +2001-01-01 11:22:33 2001-01-01 11:22:33 + +DROP TABLE t1,t2; +# # MDEV-5606: range optimizer: "x < y" is sargable, while "y > x" is not # create table t1(a int); diff --git a/mysql-test/t/range.test b/mysql-test/t/range.test index a9a12db88d1..f0434f50c98 100644 --- a/mysql-test/t/range.test +++ b/mysql-test/t/range.test @@ -1648,6 +1648,44 @@ INSERT INTO t1 VALUES (1),(3),(5); SELECT * FROM t1 WHERE pk <> 3 OR pk < 4; DROP TABLE t1; +--echo # +--echo # BUG#13803810: TOO FEW ROWS RETURNED FOR RANGE ACCESS IN +--echo # VARCHAR INDEX USING DATETIME VALUE +--echo +CREATE TABLE t1 (a DATETIME); +INSERT INTO t1 VALUES ('2001-01-01 00:00:00'); +INSERT INTO t1 VALUES ('2001-01-01 11:22:33'); + +CREATE TABLE t2 (b VARCHAR(64), KEY (b)); +INSERT INTO t2 VALUES ('2001-01-01'); +INSERT INTO t2 VALUES ('2001.01.01'); +INSERT INTO t2 VALUES ('2001#01#01'); +INSERT INTO t2 VALUES ('2001-01-01 00:00:00'); +INSERT INTO t2 VALUES ('2001-01-01 11:22:33'); + + +--echo +--echo # range/ref access cannot be used for this query +--echo +EXPLAIN SELECT * FROM t2 WHERE b=CAST('2001-01-01' AS DATE); +SELECT * FROM t2 WHERE b=CAST('2001-01-01' AS DATE); + +let $query_ab=SELECT * FROM t1, t2 WHERE a=b ORDER BY BINARY a, BINARY b; +let $query_ba=SELECT * FROM t1, t2 WHERE b=a ORDER BY BINARY a, BINARY b; + +--echo +--echo # range/ref access cannot be used for any of the queries below. +--echo # See BUG#13814468 about 'Range checked for each record' +--echo +eval EXPLAIN $query_ab; +eval $query_ab; +--echo +eval EXPLAIN $query_ba; +eval $query_ba; + +--echo +DROP TABLE t1,t2; + --echo # --echo # MDEV-5606: range optimizer: "x < y" is sargable, while "y > x" is not --echo #