mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-32958 Unusable key notes do not get reported for some operations
Enable unusable key notes for non-equality predicates: <, <=, =>, >, BETWEEN, IN, LIKE Note, in some scenarios it displays duplicate notes, e.g. for queries with ORDER BY: SELECT * FROM t1 WHERE indexed_string_column >= 10 ORDER BY indexed_string_column LIMIT 5; This should be tolarable. Getting rid of the diplicate note completely would need a much more complex patch, which is not desiable in 10.6. Details: - Changing RANGE_OPT_PARAM::note_unusable_keys from bool to a new data type Item_func::Bitmap, so the caller can choose with a better granuality which predicates should raise unusable key notes inside the range optimizer: a. all predicates (=, <=>, <, <=, =>, >, BETWEEN, IN, LIKE) b. all predicates except equality (=, <=>) c. none of the predicates "b." is needed because in some scenarios equality predicates (=, <=>) send unusable key notes at an earlier stage, before the range optimizer, during update_ref_and_keys(). Calling the range optimizer with "all predicates" would produce duplicate notes for = and <=> in such cases. - Fixing get_quick_record_count() to call the range optimizer with "all predicates except equality" instead of "none of the predicates". Before this change the range optimizer suppressed all notes for non-equality predicates: <, <=, =>, >, BETWEEN, IN, LIKE. This actually fixes the reported problem. - Fixing JOIN::make_range_rowid_filters() to call the range optimizer with "all predicates except equality" instead of "all predicates". Before this change the range optimizer produced duplicate notes for = and <=> during a rowid_filter optimization. - Cleanup: Adding the op_collation argument to Field::raise_note_cannot_use_key_part() and displaying the operation collation rather than the argument collation in the unusable key note. This is important for operations with more than two arguments: BETWEEN and IN, e.g.: SELECT * FROM t1 WHERE column_utf8mb3_general_ci BETWEEN 'a' AND 'b' COLLATE utf8mb3_unicode_ci; SELECT * FROM t1 WHERE column_utf8mb3_general_ci IN ('a', 'b' COLLATE utf8mb3_unicode_ci); The note for 'a' now prints utf8mb3_unicode_ci as the collation. which is the collation of the entire operation: Cannot use key key1 part[0] for lookup: "`column_utf8mb3_general_ci`" of collation `utf8mb3_general_ci` >= "'a'" of collation `utf8mb3_unicode_ci` Before this change it printed the collation of 'a', so the note was confusing: Cannot use key key1 part[0] for lookup: "`column_utf8mb3_general_ci`" of collation `utf8mb3_general_ci` >= "'a'" of collation `utf8mb3_general_ci`"
This commit is contained in:
@@ -614,18 +614,24 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
EXPLAIN SELECT * FROM t1 WHERE s2 BETWEEN 'a' AND 'b' COLLATE latin1_german1_ci;
|
EXPLAIN SELECT * FROM t1 WHERE s2 BETWEEN 'a' AND 'b' COLLATE latin1_german1_ci;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` >= "'a'" of collation `latin1_german1_ci`
|
||||||
EXPLAIN SELECT * FROM t1 WHERE s1 IN ('a','b' COLLATE latin1_german1_ci);
|
EXPLAIN SELECT * FROM t1 WHERE s1 IN ('a','b' COLLATE latin1_german1_ci);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 range s1 s1 11 NULL 2 Using index condition
|
1 SIMPLE t1 range s1 s1 11 NULL 2 Using index condition
|
||||||
EXPLAIN SELECT * FROM t1 WHERE s2 IN ('a','b' COLLATE latin1_german1_ci);
|
EXPLAIN SELECT * FROM t1 WHERE s2 IN ('a','b' COLLATE latin1_german1_ci);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` = "'a'" of collation `latin1_german1_ci`
|
||||||
EXPLAIN SELECT * FROM t1 WHERE s1 LIKE 'a' COLLATE latin1_german1_ci;
|
EXPLAIN SELECT * FROM t1 WHERE s1 LIKE 'a' COLLATE latin1_german1_ci;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 range s1 s1 11 NULL 1 Using index condition
|
1 SIMPLE t1 range s1 s1 11 NULL 1 Using index condition
|
||||||
EXPLAIN SELECT * FROM t1 WHERE s2 LIKE 'a' COLLATE latin1_german1_ci;
|
EXPLAIN SELECT * FROM t1 WHERE s2 LIKE 'a' COLLATE latin1_german1_ci;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` like "'a' collate latin1_german1_ci" of collation `latin1_german1_ci`
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
create table t1(f1 varchar(10) character set latin2 collate latin2_hungarian_ci, key(f1));
|
create table t1(f1 varchar(10) character set latin2 collate latin2_hungarian_ci, key(f1));
|
||||||
insert into t1 set f1=0x3F3F9DC73F;
|
insert into t1 set f1=0x3F3F9DC73F;
|
||||||
|
@@ -531,6 +531,8 @@ Warning 1292 Truncated incorrect DECIMAL value: 'b'
|
|||||||
explain select f1 from t1 where f1 in (2,1);
|
explain select f1 from t1 where f1 in (2,1);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index t1f1_idx t1f1_idx 2 NULL 3 Using where; Using index
|
1 SIMPLE t1 index t1f1_idx t1f1_idx 2 NULL 3 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `t1f1_idx` part[0] for lookup: `test`.`t1`.`f1` of type `char` = "2" of type `int`
|
||||||
create table t2(f2 int, index t2f2(f2));
|
create table t2(f2 int, index t2f2(f2));
|
||||||
insert into t2 values(0),(1),(2);
|
insert into t2 values(0),(1),(2);
|
||||||
select f2 from t2 where f2 in ('a',2);
|
select f2 from t2 where f2 in ('a',2);
|
||||||
|
@@ -3298,6 +3298,8 @@ explain
|
|||||||
SELECT b, min(a) FROM t1 WHERE a > ('0' = b) AND b = 'z' GROUP BY b;
|
SELECT b, min(a) FROM t1 WHERE a > ('0' = b) AND b = 'z' GROUP BY b;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref b b 4 const 1 Using where; Using index
|
1 SIMPLE t1 ref b b 4 const 1 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `b` part[1] for lookup: `test`.`t1`.`a` of type `varchar` > "'0' = 'z'" of type `boolean`
|
||||||
SELECT b, min(a) FROM t1 WHERE a > ('0' = b) AND b = 'z' GROUP BY b;
|
SELECT b, min(a) FROM t1 WHERE a > ('0' = b) AND b = 'z' GROUP BY b;
|
||||||
b min(a)
|
b min(a)
|
||||||
explain
|
explain
|
||||||
@@ -3984,12 +3986,18 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN DATE'2001-01-04' AND DATE'2001-01-05' GROUP BY id;
|
EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN DATE'2001-01-04' AND DATE'2001-01-05' GROUP BY id;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index
|
1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `id` part[1] for lookup: `test`.`t1`.`a` of type `varchar` >= "DATE'2001-01-04'" of type `date`
|
||||||
EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN DATE'2001-01-04' AND '2001-01-05' GROUP BY id;
|
EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN DATE'2001-01-04' AND '2001-01-05' GROUP BY id;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index
|
1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `id` part[1] for lookup: `test`.`t1`.`a` of type `varchar` >= "DATE'2001-01-04'" of type `date`
|
||||||
EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN '2001-01-04' AND DATE'2001-01-05' GROUP BY id;
|
EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN '2001-01-04' AND DATE'2001-01-05' GROUP BY id;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index
|
1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `id` part[1] for lookup: `test`.`t1`.`a` of type `varchar` >= "<cache>('2001-01-04')" of type `date`
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
# MIN() optimization didn't work correctly with BETWEEN when using too
|
# MIN() optimization didn't work correctly with BETWEEN when using too
|
||||||
|
@@ -38,18 +38,24 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
EXPLAIN SELECT * FROM t1 WHERE s2 BETWEEN 'a' AND 'b' COLLATE latin1_german1_ci;
|
EXPLAIN SELECT * FROM t1 WHERE s2 BETWEEN 'a' AND 'b' COLLATE latin1_german1_ci;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` >= "'a'" of collation `latin1_german1_ci`
|
||||||
EXPLAIN SELECT * FROM t1 WHERE s1 IN ('a','b' COLLATE latin1_german1_ci);
|
EXPLAIN SELECT * FROM t1 WHERE s1 IN ('a','b' COLLATE latin1_german1_ci);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 range s1 s1 11 NULL 2 Using index condition; Rowid-ordered scan
|
1 SIMPLE t1 range s1 s1 11 NULL 2 Using index condition; Rowid-ordered scan
|
||||||
EXPLAIN SELECT * FROM t1 WHERE s2 IN ('a','b' COLLATE latin1_german1_ci);
|
EXPLAIN SELECT * FROM t1 WHERE s2 IN ('a','b' COLLATE latin1_german1_ci);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` = "'a'" of collation `latin1_german1_ci`
|
||||||
EXPLAIN SELECT * FROM t1 WHERE s1 LIKE 'a' COLLATE latin1_german1_ci;
|
EXPLAIN SELECT * FROM t1 WHERE s1 LIKE 'a' COLLATE latin1_german1_ci;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 range s1 s1 11 NULL 1 Using index condition; Rowid-ordered scan
|
1 SIMPLE t1 range s1 s1 11 NULL 1 Using index condition; Rowid-ordered scan
|
||||||
EXPLAIN SELECT * FROM t1 WHERE s2 LIKE 'a' COLLATE latin1_german1_ci;
|
EXPLAIN SELECT * FROM t1 WHERE s2 LIKE 'a' COLLATE latin1_german1_ci;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` like "'a' collate latin1_german1_ci" of collation `latin1_german1_ci`
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@@ -1528,6 +1528,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "10" of type `int`
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "10" of type `int`
|
||||||
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` <= "18" of type `int`
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` <= "18" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "10" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` <= "18" of type `int`
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`i` AS `i` from `test`.`t1` where `test`.`t1`.`i` > 10 and `test`.`t1`.`i` <= 18 order by `test`.`t1`.`i` limit 5
|
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`i` AS `i` from `test`.`t1` where `test`.`t1`.`i` > 10 and `test`.`t1`.`i` <= 18 order by `test`.`t1`.`i` limit 5
|
||||||
# Status of EXPLAIN EXTENDED "equivalent" SELECT query execution
|
# Status of EXPLAIN EXTENDED "equivalent" SELECT query execution
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
@@ -1591,6 +1593,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int`
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int`
|
||||||
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "18" of type `int`
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "18" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "18" of type `int`
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`i` AS `i` from `test`.`t1` where `test`.`t1`.`i` >= 10 and `test`.`t1`.`i` < 18 order by `test`.`t1`.`i` limit 5
|
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`i` AS `i` from `test`.`t1` where `test`.`t1`.`i` >= 10 and `test`.`t1`.`i` < 18 order by `test`.`t1`.`i` limit 5
|
||||||
# Status of EXPLAIN EXTENDED "equivalent" SELECT query execution
|
# Status of EXPLAIN EXTENDED "equivalent" SELECT query execution
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
@@ -2142,6 +2146,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` > "10" of type `int`
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` > "10" of type `int`
|
||||||
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` <= "18" of type `int`
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` <= "18" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` > "10" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` <= "18" of type `int`
|
||||||
Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t2`.`i` AS `i` from `test`.`t2` where `test`.`t2`.`i` > 10 and `test`.`t2`.`i` <= 18 order by `test`.`t2`.`i` limit 5
|
Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t2`.`i` AS `i` from `test`.`t2` where `test`.`t2`.`i` > 10 and `test`.`t2`.`i` <= 18 order by `test`.`t2`.`i` limit 5
|
||||||
# Status of EXPLAIN EXTENDED "equivalent" SELECT query execution
|
# Status of EXPLAIN EXTENDED "equivalent" SELECT query execution
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
|
@@ -1892,6 +1892,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
2 SUBQUERY SUBQUERY2_t1 index NULL col_int_key 5 NULL 2 Using index
|
2 SUBQUERY SUBQUERY2_t1 index NULL col_int_key 5 NULL 2 Using index
|
||||||
2 SUBQUERY SUBQUERY2_t2 ALL col_varchar_key NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join)
|
2 SUBQUERY SUBQUERY2_t2 ALL col_varchar_key NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join)
|
||||||
3 MATERIALIZED t1 ALL NULL NULL NULL NULL 2
|
3 MATERIALIZED t1 ALL NULL NULL NULL NULL 2
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `col_varchar_key` part[0] for lookup: `test`.`t1`.`col_varchar_key` of type `varchar` < "0" of type `bigint`
|
||||||
SELECT col_int_key
|
SELECT col_int_key
|
||||||
FROM t2
|
FROM t2
|
||||||
WHERE (SELECT SUBQUERY2_t1.col_int_key
|
WHERE (SELECT SUBQUERY2_t1.col_int_key
|
||||||
@@ -1917,6 +1919,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
2 SUBQUERY SUBQUERY2_t1 index NULL col_int_key 5 NULL 2 Using index
|
2 SUBQUERY SUBQUERY2_t1 index NULL col_int_key 5 NULL 2 Using index
|
||||||
2 SUBQUERY SUBQUERY2_t2 ALL col_varchar_key NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join)
|
2 SUBQUERY SUBQUERY2_t2 ALL col_varchar_key NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join)
|
||||||
3 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
3 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `col_varchar_key` part[0] for lookup: `test`.`t1`.`col_varchar_key` of type `varchar` < "0" of type `bigint`
|
||||||
SELECT col_int_key
|
SELECT col_int_key
|
||||||
FROM t2
|
FROM t2
|
||||||
WHERE (SELECT SUBQUERY2_t1.col_int_key
|
WHERE (SELECT SUBQUERY2_t1.col_int_key
|
||||||
|
@@ -967,10 +967,217 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 SIMPLE t1 ALL i NULL NULL NULL 31 Using where; Using filesort
|
1 SIMPLE t1 ALL i NULL NULL NULL 31 Using where; Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "30" of type `int`
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "30" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "30" of type `int`
|
||||||
EXPLAIN SELECT * FROM t1 WHERE i>=30 ORDER BY i LIMIT 5;
|
EXPLAIN SELECT * FROM t1 WHERE i>=30 ORDER BY i LIMIT 5;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL i NULL NULL NULL 31 Using where; Using filesort
|
1 SIMPLE t1 ALL i NULL NULL NULL 31 Using where; Using filesort
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "30" of type `int`
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "30" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "30" of type `int`
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET note_verbosity=DEFAULT;
|
||||||
|
#
|
||||||
|
# MDEV-32958 Unusable key notes do not get reported for some operations
|
||||||
|
#
|
||||||
|
SET note_verbosity=unusable_keys;
|
||||||
|
CREATE TABLE t1 (c1 varchar(10), KEY(c1)) CHARACTER SET latin1;
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
INSERT INTO t1 VALUES ('b');
|
||||||
|
INSERT INTO t1 VALUES ('c');
|
||||||
|
INSERT INTO t1 VALUES ('d');
|
||||||
|
INSERT INTO t1 VALUES ('e');
|
||||||
|
INSERT INTO t1 VALUES ('f');
|
||||||
|
INSERT INTO t1 VALUES ('g');
|
||||||
|
INSERT INTO t1 VALUES ('h');
|
||||||
|
INSERT INTO t1 VALUES ('i');
|
||||||
|
INSERT INTO t1 VALUES ('j');
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1=10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` = "10" of type `int`
|
||||||
|
SELECT * FROM t1 WHERE c1=10;
|
||||||
|
c1
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` = "10" of type `int`
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'a'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'b'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'c'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'd'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'e'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'f'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'g'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'h'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'i'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'j'
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1<10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` < "10" of type `int`
|
||||||
|
SELECT * FROM t1 WHERE c1<10;
|
||||||
|
c1
|
||||||
|
a
|
||||||
|
b
|
||||||
|
c
|
||||||
|
d
|
||||||
|
e
|
||||||
|
f
|
||||||
|
g
|
||||||
|
h
|
||||||
|
i
|
||||||
|
j
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` < "10" of type `int`
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'a'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'b'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'c'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'd'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'e'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'f'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'g'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'h'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'i'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'j'
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 BETWEEN 10 AND 11;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` >= "10" of type `int`
|
||||||
|
SELECT * FROM t1 WHERE c1 BETWEEN 10 AND 11;
|
||||||
|
c1
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` >= "10" of type `int`
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'a'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'b'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'c'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'd'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'e'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'f'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'g'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'h'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'i'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'j'
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 BETWEEN 10 AND '11';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` >= "10" of type `int`
|
||||||
|
SELECT * FROM t1 WHERE c1 BETWEEN 10 AND '11';
|
||||||
|
c1
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` >= "10" of type `int`
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'a'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'b'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'c'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'd'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'e'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'f'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'g'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'h'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'i'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'j'
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 IN (10,20);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` = "10" of type `int`
|
||||||
|
SELECT * FROM t1 WHERE c1 IN (10,20);
|
||||||
|
c1
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` = "10" of type `int`
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'a'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'b'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'c'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'd'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'e'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'f'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'g'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'h'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'i'
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: 'j'
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 IN (_latin1'a' COLLATE latin1_german2_ci,'b');
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of collation `latin1_swedish_ci` = "_latin1'a' collate latin1_german2_ci" of collation `latin1_german2_ci`
|
||||||
|
SELECT * FROM t1 WHERE c1 IN (_latin1'a' COLLATE latin1_german2_ci,'b');
|
||||||
|
c1
|
||||||
|
a
|
||||||
|
b
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of collation `latin1_swedish_ci` = "_latin1'a' collate latin1_german2_ci" of collation `latin1_german2_ci`
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 IN ('a',_latin1'b' COLLATE latin1_german2_ci);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of collation `latin1_swedish_ci` = "'a'" of collation `latin1_german2_ci`
|
||||||
|
SELECT * FROM t1 WHERE c1 IN ('a',_latin1'b' COLLATE latin1_german2_ci);
|
||||||
|
c1
|
||||||
|
a
|
||||||
|
b
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of collation `latin1_swedish_ci` = "'a'" of collation `latin1_german2_ci`
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1(a INT, i CHAR(2), INDEX(i(1)));
|
||||||
|
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||||
|
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||||
|
(30),(31),(32),(33),(34),(35);
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE i >= 10 ORDER BY i LIMIT 5;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL i NULL NULL NULL 26 Using where; Using filesort
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int`
|
||||||
|
SELECT * FROM t1 WHERE i >= 10 ORDER BY i LIMIT 5;
|
||||||
|
a i
|
||||||
|
NULL 10
|
||||||
|
NULL 11
|
||||||
|
NULL 12
|
||||||
|
NULL 13
|
||||||
|
NULL 14
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int`
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int`
|
||||||
|
EXPLAIN UPDATE t1 SET a = 1 WHERE i = 10 ORDER BY a, i LIMIT 5;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` = "10" of type `int`
|
||||||
|
EXPLAIN UPDATE t1 SET a = 1 WHERE i < 10 ORDER BY a, i LIMIT 5;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "10" of type `int`
|
||||||
|
EXPLAIN DELETE FROM t1 WHERE i = 10 ORDER BY a, i LIMIT 5;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` = "10" of type `int`
|
||||||
|
EXPLAIN DELETE FROM t1 WHERE i < 10 ORDER BY a, i LIMIT 5;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "10" of type `int`
|
||||||
|
EXPLAIN UPDATE t1 SET a = 1 WHERE i = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` = "10" of type `int`
|
||||||
|
EXPLAIN UPDATE t1 SET a = 1 WHERE i < 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "10" of type `int`
|
||||||
|
EXPLAIN DELETE FROM t1 WHERE i = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` = "10" of type `int`
|
||||||
|
EXPLAIN DELETE FROM t1 WHERE i < 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "10" of type `int`
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET note_verbosity=DEFAULT;
|
SET note_verbosity=DEFAULT;
|
||||||
|
@@ -434,3 +434,67 @@ EXPLAIN SELECT * FROM t1 WHERE i>30 ORDER BY i LIMIT 5;
|
|||||||
EXPLAIN SELECT * FROM t1 WHERE i>=30 ORDER BY i LIMIT 5;
|
EXPLAIN SELECT * FROM t1 WHERE i>=30 ORDER BY i LIMIT 5;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET note_verbosity=DEFAULT;
|
SET note_verbosity=DEFAULT;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-32958 Unusable key notes do not get reported for some operations
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET note_verbosity=unusable_keys;
|
||||||
|
CREATE TABLE t1 (c1 varchar(10), KEY(c1)) CHARACTER SET latin1;
|
||||||
|
INSERT INTO t1 VALUES ('a');
|
||||||
|
INSERT INTO t1 VALUES ('b');
|
||||||
|
INSERT INTO t1 VALUES ('c');
|
||||||
|
INSERT INTO t1 VALUES ('d');
|
||||||
|
INSERT INTO t1 VALUES ('e');
|
||||||
|
INSERT INTO t1 VALUES ('f');
|
||||||
|
INSERT INTO t1 VALUES ('g');
|
||||||
|
INSERT INTO t1 VALUES ('h');
|
||||||
|
INSERT INTO t1 VALUES ('i');
|
||||||
|
INSERT INTO t1 VALUES ('j');
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1=10;
|
||||||
|
SELECT * FROM t1 WHERE c1=10;
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1<10;
|
||||||
|
SELECT * FROM t1 WHERE c1<10;
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 BETWEEN 10 AND 11;
|
||||||
|
SELECT * FROM t1 WHERE c1 BETWEEN 10 AND 11;
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 BETWEEN 10 AND '11';
|
||||||
|
SELECT * FROM t1 WHERE c1 BETWEEN 10 AND '11';
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 IN (10,20);
|
||||||
|
SELECT * FROM t1 WHERE c1 IN (10,20);
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 IN (_latin1'a' COLLATE latin1_german2_ci,'b');
|
||||||
|
SELECT * FROM t1 WHERE c1 IN (_latin1'a' COLLATE latin1_german2_ci,'b');
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE c1 IN ('a',_latin1'b' COLLATE latin1_german2_ci);
|
||||||
|
SELECT * FROM t1 WHERE c1 IN ('a',_latin1'b' COLLATE latin1_german2_ci);
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
CREATE TABLE t1(a INT, i CHAR(2), INDEX(i(1)));
|
||||||
|
INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19),
|
||||||
|
(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),
|
||||||
|
(30),(31),(32),(33),(34),(35);
|
||||||
|
|
||||||
|
EXPLAIN SELECT * FROM t1 WHERE i >= 10 ORDER BY i LIMIT 5;
|
||||||
|
SELECT * FROM t1 WHERE i >= 10 ORDER BY i LIMIT 5;
|
||||||
|
|
||||||
|
EXPLAIN UPDATE t1 SET a = 1 WHERE i = 10 ORDER BY a, i LIMIT 5;
|
||||||
|
EXPLAIN UPDATE t1 SET a = 1 WHERE i < 10 ORDER BY a, i LIMIT 5;
|
||||||
|
EXPLAIN DELETE FROM t1 WHERE i = 10 ORDER BY a, i LIMIT 5;
|
||||||
|
EXPLAIN DELETE FROM t1 WHERE i < 10 ORDER BY a, i LIMIT 5;
|
||||||
|
|
||||||
|
EXPLAIN UPDATE t1 SET a = 1 WHERE i = 10;
|
||||||
|
EXPLAIN UPDATE t1 SET a = 1 WHERE i < 10;
|
||||||
|
EXPLAIN DELETE FROM t1 WHERE i = 10;
|
||||||
|
EXPLAIN DELETE FROM t1 WHERE i < 10;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
SET note_verbosity=DEFAULT;
|
||||||
|
@@ -4422,12 +4422,14 @@ SELECT * FROM v1 WHERE a > 'JJ' OR a <> 0 AND a = 'VV';
|
|||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index
|
1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `a` part[0] for lookup: `test`.`t1`.`a` of type `varchar` < "0" of type `int`
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0
|
||||||
EXPLAIN EXTENDED
|
EXPLAIN EXTENDED
|
||||||
SELECT * FROM t1 WHERE a > 'JJ' OR a <> 0 AND a = 'VV';
|
SELECT * FROM t1 WHERE a > 'JJ' OR a <> 0 AND a = 'VV';
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index
|
1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `a` part[0] for lookup: `test`.`t1`.`a` of type `varchar` < "0" of type `int`
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0
|
||||||
# t1 and v1 should return the same result set
|
# t1 and v1 should return the same result set
|
||||||
SELECT * FROM v1 WHERE a > 'JJ' OR a AND a = 'VV';
|
SELECT * FROM v1 WHERE a > 'JJ' OR a AND a = 'VV';
|
||||||
@@ -4448,12 +4450,14 @@ SELECT * FROM v1 WHERE a > 'JJ' OR a AND a = 'VV';
|
|||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index
|
1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `a` part[0] for lookup: `test`.`t1`.`a` of type `varchar` < "0" of type `int`
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0
|
||||||
EXPLAIN EXTENDED
|
EXPLAIN EXTENDED
|
||||||
SELECT * FROM t1 WHERE a > 'JJ' OR a AND a = 'VV';
|
SELECT * FROM t1 WHERE a > 'JJ' OR a AND a = 'VV';
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index
|
1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `a` part[0] for lookup: `test`.`t1`.`a` of type `varchar` < "0" of type `int`
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@@ -2382,6 +2382,10 @@ key_len NULL
|
|||||||
ref NULL
|
ref NULL
|
||||||
rows 6
|
rows 6
|
||||||
Extra Using where
|
Extra Using where
|
||||||
|
Warnings:
|
||||||
|
Level Note
|
||||||
|
Code 1105
|
||||||
|
Message Cannot use key `PRIMARY` part[0] for lookup: `test`.`bar`.`c` of type `char` > "2" of type `int`
|
||||||
EXPLAIN SELECT c FROM foo WHERE c>2;;
|
EXPLAIN SELECT c FROM foo WHERE c>2;;
|
||||||
id 1
|
id 1
|
||||||
select_type SIMPLE
|
select_type SIMPLE
|
||||||
@@ -2393,6 +2397,10 @@ key_len NULL
|
|||||||
ref NULL
|
ref NULL
|
||||||
rows 6
|
rows 6
|
||||||
Extra Using where
|
Extra Using where
|
||||||
|
Warnings:
|
||||||
|
Level Note
|
||||||
|
Code 1105
|
||||||
|
Message Cannot use key `PRIMARY` part[0] for lookup: `test`.`foo`.`c` of type `char` > "2" of type `int`
|
||||||
EXPLAIN SELECT c FROM foo2 WHERE c>2;;
|
EXPLAIN SELECT c FROM foo2 WHERE c>2;;
|
||||||
id 1
|
id 1
|
||||||
select_type SIMPLE
|
select_type SIMPLE
|
||||||
@@ -2404,6 +2412,10 @@ key_len 5
|
|||||||
ref NULL
|
ref NULL
|
||||||
rows 6
|
rows 6
|
||||||
Extra Using where; Using index
|
Extra Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Level Note
|
||||||
|
Code 1105
|
||||||
|
Message Cannot use key `PRIMARY` part[0] for lookup: `test`.`foo2`.`c` of type `char` > "2" of type `int`
|
||||||
DROP TABLE foo, bar, foo2;
|
DROP TABLE foo, bar, foo2;
|
||||||
#
|
#
|
||||||
# Bug#41348: INSERT INTO tbl SELECT * FROM temp_tbl overwrites locking type of temp table
|
# Bug#41348: INSERT INTO tbl SELECT * FROM temp_tbl overwrites locking type of temp table
|
||||||
|
@@ -98,6 +98,8 @@ c
|
|||||||
EXPLAIN SELECT * FROM t1 WHERE c>CAST('::1' AS INET6);
|
EXPLAIN SELECT * FROM t1 WHERE c>CAST('::1' AS INET6);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index c c 67 NULL 3 Using where; Using index
|
1 SIMPLE t1 index c c 67 NULL 3 Using where; Using index
|
||||||
|
Warnings:
|
||||||
|
Note 1105 Cannot use key `c` part[0] for lookup: `test`.`t1`.`c` of type `varchar` > "cast('::1' as inet6)" of type `inet6`
|
||||||
SELECT * FROM t1 WHERE c=CAST('::1' AS INET6);
|
SELECT * FROM t1 WHERE c=CAST('::1' AS INET6);
|
||||||
c
|
c
|
||||||
0::1
|
0::1
|
||||||
|
@@ -11284,6 +11284,7 @@ void Field::set_warning_truncated_wrong_value(const char *type_arg,
|
|||||||
void Field::raise_note_cannot_use_key_part(THD *thd,
|
void Field::raise_note_cannot_use_key_part(THD *thd,
|
||||||
uint keynr, uint part,
|
uint keynr, uint part,
|
||||||
const LEX_CSTRING &op,
|
const LEX_CSTRING &op,
|
||||||
|
CHARSET_INFO *op_collation,
|
||||||
Item *value,
|
Item *value,
|
||||||
Data_type_compatibility reason)
|
Data_type_compatibility reason)
|
||||||
const
|
const
|
||||||
@@ -11304,7 +11305,7 @@ void Field::raise_note_cannot_use_key_part(THD *thd,
|
|||||||
case Data_type_compatibility::INCOMPATIBLE_COLLATION:
|
case Data_type_compatibility::INCOMPATIBLE_COLLATION:
|
||||||
{
|
{
|
||||||
const LEX_CSTRING colf(charset()->coll_name);
|
const LEX_CSTRING colf(charset()->coll_name);
|
||||||
const LEX_CSTRING colv(value->collation.collation->coll_name);
|
const LEX_CSTRING colv(op_collation->coll_name);
|
||||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE,
|
||||||
ER_UNKNOWN_ERROR,
|
ER_UNKNOWN_ERROR,
|
||||||
"Cannot use key %`.*s part[%u] for lookup: "
|
"Cannot use key %`.*s part[%u] for lookup: "
|
||||||
|
@@ -1642,6 +1642,7 @@ public:
|
|||||||
void print_key_value_binary(String *out, const uchar* key, uint32 length);
|
void print_key_value_binary(String *out, const uchar* key, uint32 length);
|
||||||
void raise_note_cannot_use_key_part(THD *thd, uint keynr, uint part,
|
void raise_note_cannot_use_key_part(THD *thd, uint keynr, uint part,
|
||||||
const LEX_CSTRING &op,
|
const LEX_CSTRING &op,
|
||||||
|
CHARSET_INFO *op_collation,
|
||||||
Item *value,
|
Item *value,
|
||||||
const Data_type_compatibility reason)
|
const Data_type_compatibility reason)
|
||||||
const;
|
const;
|
||||||
|
@@ -79,6 +79,38 @@ public:
|
|||||||
CASE_SEARCHED_FUNC, // Used by ColumnStore/Spider
|
CASE_SEARCHED_FUNC, // Used by ColumnStore/Spider
|
||||||
CASE_SIMPLE_FUNC, // Used by ColumnStore/spider,
|
CASE_SIMPLE_FUNC, // Used by ColumnStore/spider,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
A function bitmap. Useful when some operation needs to be applied only
|
||||||
|
to certain functions. For now we only need to distinguish some
|
||||||
|
comparison predicates.
|
||||||
|
*/
|
||||||
|
enum Bitmap : ulonglong
|
||||||
|
{
|
||||||
|
BITMAP_NONE= 0,
|
||||||
|
BITMAP_EQ= 1ULL << EQ_FUNC,
|
||||||
|
BITMAP_EQUAL= 1ULL << EQUAL_FUNC,
|
||||||
|
BITMAP_NE= 1ULL << NE_FUNC,
|
||||||
|
BITMAP_LT= 1ULL << LT_FUNC,
|
||||||
|
BITMAP_LE= 1ULL << LE_FUNC,
|
||||||
|
BITMAP_GE= 1ULL << GE_FUNC,
|
||||||
|
BITMAP_GT= 1ULL << GT_FUNC,
|
||||||
|
BITMAP_LIKE= 1ULL << LIKE_FUNC,
|
||||||
|
BITMAP_BETWEEN= 1ULL << BETWEEN,
|
||||||
|
BITMAP_IN= 1ULL << IN_FUNC,
|
||||||
|
BITMAP_MULT_EQUAL= 1ULL << MULT_EQUAL_FUNC,
|
||||||
|
BITMAP_OTHER= 1ULL << 63,
|
||||||
|
BITMAP_ALL= 0xFFFFFFFFFFFFFFFFULL,
|
||||||
|
BITMAP_ANY_EQUALITY= BITMAP_EQ | BITMAP_EQUAL | BITMAP_MULT_EQUAL,
|
||||||
|
BITMAP_EXCEPT_ANY_EQUALITY= BITMAP_ALL & ~BITMAP_ANY_EQUALITY,
|
||||||
|
};
|
||||||
|
|
||||||
|
ulonglong bitmap_bit() const
|
||||||
|
{
|
||||||
|
Functype type= functype();
|
||||||
|
return 1ULL << (type > 63 ? 63 : type);
|
||||||
|
}
|
||||||
|
|
||||||
static scalar_comparison_op functype_to_scalar_comparison_op(Functype type)
|
static scalar_comparison_op functype_to_scalar_comparison_op(Functype type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@@ -2690,7 +2690,7 @@ SQL_SELECT::test_quick_select(THD *thd,
|
|||||||
bool ordered_output,
|
bool ordered_output,
|
||||||
bool remove_false_parts_of_where,
|
bool remove_false_parts_of_where,
|
||||||
bool only_single_index_range_scan,
|
bool only_single_index_range_scan,
|
||||||
bool suppress_unusable_key_notes)
|
Item_func::Bitmap note_unusable_keys)
|
||||||
{
|
{
|
||||||
uint idx;
|
uint idx;
|
||||||
double scan_time;
|
double scan_time;
|
||||||
@@ -2784,9 +2784,9 @@ SQL_SELECT::test_quick_select(THD *thd,
|
|||||||
param.max_key_parts= 0;
|
param.max_key_parts= 0;
|
||||||
param.remove_false_where_parts= remove_false_parts_of_where;
|
param.remove_false_where_parts= remove_false_parts_of_where;
|
||||||
param.force_default_mrr= ordered_output;
|
param.force_default_mrr= ordered_output;
|
||||||
param.note_unusable_keys= (!suppress_unusable_key_notes &&
|
param.note_unusable_keys= thd->give_notes_for_unusable_keys() ?
|
||||||
thd->give_notes_for_unusable_keys());
|
note_unusable_keys :
|
||||||
|
Item_func::BITMAP_NONE;
|
||||||
param.possible_keys.clear_all();
|
param.possible_keys.clear_all();
|
||||||
|
|
||||||
thd->no_errors=1; // Don't warn about NULL
|
thd->no_errors=1; // Don't warn about NULL
|
||||||
@@ -3993,7 +3993,7 @@ bool prune_partitions(THD *thd, TABLE *table, Item *pprune_cond)
|
|||||||
range_par->remove_jump_scans= FALSE;
|
range_par->remove_jump_scans= FALSE;
|
||||||
range_par->real_keynr[0]= 0;
|
range_par->real_keynr[0]= 0;
|
||||||
range_par->alloced_sel_args= 0;
|
range_par->alloced_sel_args= 0;
|
||||||
range_par->note_unusable_keys= 0;
|
range_par->note_unusable_keys= Item_func::BITMAP_NONE;
|
||||||
|
|
||||||
thd->no_errors=1; // Don't warn about NULL
|
thd->no_errors=1; // Don't warn about NULL
|
||||||
thd->mem_root=&alloc;
|
thd->mem_root=&alloc;
|
||||||
@@ -8756,9 +8756,11 @@ Item_func_like::get_mm_leaf(RANGE_OPT_PARAM *param,
|
|||||||
if (field->result_type() == STRING_RESULT &&
|
if (field->result_type() == STRING_RESULT &&
|
||||||
field->charset() != compare_collation())
|
field->charset() != compare_collation())
|
||||||
{
|
{
|
||||||
if (param->note_unusable_keys)
|
if (param->note_unusable_keys & BITMAP_LIKE)
|
||||||
field->raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
|
field->raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
|
||||||
func_name_cstring(), value,
|
func_name_cstring(),
|
||||||
|
compare_collation(),
|
||||||
|
value,
|
||||||
Data_type_compatibility::
|
Data_type_compatibility::
|
||||||
INCOMPATIBLE_COLLATION);
|
INCOMPATIBLE_COLLATION);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
@@ -8774,9 +8776,11 @@ Item_func_like::get_mm_leaf(RANGE_OPT_PARAM *param,
|
|||||||
field->type_handler() == &type_handler_enum ||
|
field->type_handler() == &type_handler_enum ||
|
||||||
field->type_handler() == &type_handler_set)
|
field->type_handler() == &type_handler_set)
|
||||||
{
|
{
|
||||||
if (param->note_unusable_keys)
|
if (param->note_unusable_keys & BITMAP_LIKE)
|
||||||
field->raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
|
field->raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
|
||||||
func_name_cstring(), value,
|
func_name_cstring(),
|
||||||
|
compare_collation(),
|
||||||
|
value,
|
||||||
Data_type_compatibility::
|
Data_type_compatibility::
|
||||||
INCOMPATIBLE_DATA_TYPE);
|
INCOMPATIBLE_DATA_TYPE);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
@@ -8881,7 +8885,8 @@ Field::can_optimize_scalar_range(const RANGE_OPT_PARAM *param,
|
|||||||
TODO: Perhaps we also need to raise a similar note when
|
TODO: Perhaps we also need to raise a similar note when
|
||||||
a partition could not be used (when using_real_indexes==false).
|
a partition could not be used (when using_real_indexes==false).
|
||||||
*/
|
*/
|
||||||
if (param->using_real_indexes && param->note_unusable_keys)
|
if (param->using_real_indexes && param->note_unusable_keys &&
|
||||||
|
(param->note_unusable_keys & cond->bitmap_bit()))
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(keynr < table->s->keys);
|
DBUG_ASSERT(keynr < table->s->keys);
|
||||||
/*
|
/*
|
||||||
@@ -8895,6 +8900,7 @@ Field::can_optimize_scalar_range(const RANGE_OPT_PARAM *param,
|
|||||||
*/
|
*/
|
||||||
raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
|
raise_note_cannot_use_key_part(param->thd, keynr, key_part->part,
|
||||||
scalar_comparison_op_to_lex_cstring(op),
|
scalar_comparison_op_to_lex_cstring(op),
|
||||||
|
cond->compare_collation(),
|
||||||
value, compat);
|
value, compat);
|
||||||
}
|
}
|
||||||
return compat;
|
return compat;
|
||||||
|
@@ -713,7 +713,10 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool remove_false_where_parts;
|
bool remove_false_where_parts;
|
||||||
|
|
||||||
bool note_unusable_keys; // Give SQL notes for unusable keys
|
/*
|
||||||
|
Which functions should give SQL notes for unusable keys.
|
||||||
|
*/
|
||||||
|
Item_func::Bitmap note_unusable_keys;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
used_key_no -> table_key_no translation table. Only makes sense if
|
used_key_no -> table_key_no translation table. Only makes sense if
|
||||||
@@ -1718,12 +1721,14 @@ class SQL_SELECT :public Sql_alloc {
|
|||||||
true - for ERROR and IMPOSSIBLE_RANGE
|
true - for ERROR and IMPOSSIBLE_RANGE
|
||||||
false - Ok
|
false - Ok
|
||||||
*/
|
*/
|
||||||
bool check_quick(THD *thd, bool force_quick_range, ha_rows limit)
|
bool check_quick(THD *thd, bool force_quick_range, ha_rows limit,
|
||||||
|
Item_func::Bitmap note_unusable_keys)
|
||||||
{
|
{
|
||||||
key_map tmp;
|
key_map tmp;
|
||||||
tmp.set_all();
|
tmp.set_all();
|
||||||
return test_quick_select(thd, tmp, 0, limit, force_quick_range,
|
return test_quick_select(thd, tmp, 0, limit, force_quick_range,
|
||||||
FALSE, FALSE, FALSE) != OK;
|
FALSE, FALSE, FALSE,
|
||||||
|
note_unusable_keys) != OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1753,7 +1758,7 @@ class SQL_SELECT :public Sql_alloc {
|
|||||||
bool ordered_output,
|
bool ordered_output,
|
||||||
bool remove_false_parts_of_where,
|
bool remove_false_parts_of_where,
|
||||||
bool only_single_index_range_scan,
|
bool only_single_index_range_scan,
|
||||||
bool suppress_unusable_key_notes = 0);
|
Item_func::Bitmap note_unusable_keys);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum SQL_SELECT::quick_select_return_type quick_select_return;
|
typedef enum SQL_SELECT::quick_select_return_type quick_select_return;
|
||||||
|
@@ -530,7 +530,8 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
|
|||||||
select=make_select(table, 0, 0, conds, (SORT_INFO*) 0, 0, &error);
|
select=make_select(table, 0, 0, conds, (SORT_INFO*) 0, 0, &error);
|
||||||
if (unlikely(error))
|
if (unlikely(error))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
if ((select && select->check_quick(thd, safe_update, limit)) || !limit)
|
if ((select && select->check_quick(thd, safe_update, limit,
|
||||||
|
Item_func::BITMAP_ALL)) || !limit)
|
||||||
{
|
{
|
||||||
query_plan.set_impossible_where();
|
query_plan.set_impossible_where();
|
||||||
if (thd->lex->describe || thd->lex->analyze_stmt)
|
if (thd->lex->describe || thd->lex->analyze_stmt)
|
||||||
|
@@ -667,7 +667,8 @@ SQL_SELECT *prepare_simple_select(THD *thd, Item *cond,
|
|||||||
|
|
||||||
SQL_SELECT *res= make_select(table, 0, 0, cond, 0, 0, error);
|
SQL_SELECT *res= make_select(table, 0, 0, cond, 0, 0, error);
|
||||||
if (unlikely(*error) ||
|
if (unlikely(*error) ||
|
||||||
(likely(res) && unlikely(res->check_quick(thd, 0, HA_POS_ERROR))) ||
|
(likely(res) && unlikely(res->check_quick(thd, 0, HA_POS_ERROR,
|
||||||
|
Item_func::BITMAP_ALL))) ||
|
||||||
(likely(res) && res->quick && unlikely(res->quick->reset())))
|
(likely(res) && res->quick && unlikely(res->quick->reset())))
|
||||||
{
|
{
|
||||||
delete res;
|
delete res;
|
||||||
|
@@ -1958,9 +1958,14 @@ bool JOIN::make_range_rowid_filters()
|
|||||||
bool force_index_save= tab->table->force_index;
|
bool force_index_save= tab->table->force_index;
|
||||||
tab->table->force_index= true;
|
tab->table->force_index= true;
|
||||||
quick_select_return rc;
|
quick_select_return rc;
|
||||||
|
/*
|
||||||
|
EQ_FUNC and EQUAL_FUNC already sent unusable key notes (if any)
|
||||||
|
during update_ref_and_keys(). Have only other functions raise notes
|
||||||
|
from can_optimize_scalar_range().
|
||||||
|
*/
|
||||||
rc= sel->test_quick_select(thd, filter_map, (table_map) 0,
|
rc= sel->test_quick_select(thd, filter_map, (table_map) 0,
|
||||||
(ha_rows) HA_POS_ERROR, true, false, true,
|
(ha_rows) HA_POS_ERROR, true, false, true,
|
||||||
true);
|
true, Item_func::BITMAP_EXCEPT_ANY_EQUALITY);
|
||||||
tab->table->force_index= force_index_save;
|
tab->table->force_index= force_index_save;
|
||||||
if (rc == SQL_SELECT::ERROR || thd->is_error())
|
if (rc == SQL_SELECT::ERROR || thd->is_error())
|
||||||
{
|
{
|
||||||
@@ -5188,10 +5193,16 @@ static bool get_quick_record_count(THD *thd, SQL_SELECT *select,
|
|||||||
{
|
{
|
||||||
select->head=table;
|
select->head=table;
|
||||||
table->reginfo.impossible_range=0;
|
table->reginfo.impossible_range=0;
|
||||||
|
/*
|
||||||
|
EQ_FUNC and EQUAL_FUNC already sent unusable key notes (if any)
|
||||||
|
during update_ref_and_keys(). Have only other functions raise notes
|
||||||
|
from can_optimize_scalar_range().
|
||||||
|
*/
|
||||||
error= select->test_quick_select(thd, *(key_map *)keys, (table_map) 0,
|
error= select->test_quick_select(thd, *(key_map *)keys, (table_map) 0,
|
||||||
limit, 0, FALSE,
|
limit, 0, FALSE,
|
||||||
TRUE, /* remove_where_parts*/
|
TRUE, /* remove_where_parts*/
|
||||||
FALSE, TRUE);
|
FALSE,
|
||||||
|
Item_func::BITMAP_EXCEPT_ANY_EQUALITY);
|
||||||
|
|
||||||
if (error == SQL_SELECT::OK && select->quick)
|
if (error == SQL_SELECT::OK && select->quick)
|
||||||
{
|
{
|
||||||
@@ -7000,6 +7011,7 @@ add_key_part(DYNAMIC_ARRAY *keyuse_array, KEY_FIELD *key_field)
|
|||||||
{
|
{
|
||||||
field->raise_note_cannot_use_key_part(thd, key, part,
|
field->raise_note_cannot_use_key_part(thd, key, part,
|
||||||
equal_str,
|
equal_str,
|
||||||
|
key_field->cond->compare_collation(),
|
||||||
key_field->val,
|
key_field->val,
|
||||||
compat);
|
compat);
|
||||||
}
|
}
|
||||||
@@ -12706,7 +12718,8 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
|
|||||||
HA_POS_ERROR :
|
HA_POS_ERROR :
|
||||||
join->unit->lim.get_select_limit()),
|
join->unit->lim.get_select_limit()),
|
||||||
0,
|
0,
|
||||||
FALSE, FALSE, FALSE)) ==
|
FALSE, FALSE, FALSE,
|
||||||
|
Item_func::BITMAP_ALL)) ==
|
||||||
SQL_SELECT::IMPOSSIBLE_RANGE)
|
SQL_SELECT::IMPOSSIBLE_RANGE)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -12721,7 +12734,8 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
|
|||||||
OPTION_FOUND_ROWS ?
|
OPTION_FOUND_ROWS ?
|
||||||
HA_POS_ERROR :
|
HA_POS_ERROR :
|
||||||
join->unit->lim.get_select_limit()),
|
join->unit->lim.get_select_limit()),
|
||||||
0, FALSE, FALSE, FALSE, TRUE)) ==
|
0, FALSE, FALSE, FALSE,
|
||||||
|
Item_func::BITMAP_NONE)) ==
|
||||||
SQL_SELECT::IMPOSSIBLE_RANGE)
|
SQL_SELECT::IMPOSSIBLE_RANGE)
|
||||||
DBUG_RETURN(1); // Impossible WHERE
|
DBUG_RETURN(1); // Impossible WHERE
|
||||||
}
|
}
|
||||||
@@ -22746,7 +22760,9 @@ test_if_quick_select(JOIN_TAB *tab)
|
|||||||
res= tab->select->test_quick_select(tab->join->thd, tab->keys,
|
res= tab->select->test_quick_select(tab->join->thd, tab->keys,
|
||||||
(table_map) 0, HA_POS_ERROR, 0,
|
(table_map) 0, HA_POS_ERROR, 0,
|
||||||
FALSE, /*remove where parts*/FALSE,
|
FALSE, /*remove where parts*/FALSE,
|
||||||
FALSE, /* no warnings */ TRUE);
|
FALSE,
|
||||||
|
/* no unusable key notes */
|
||||||
|
Item_func::BITMAP_NONE);
|
||||||
if (tab->explain_plan && tab->explain_plan->range_checked_fer)
|
if (tab->explain_plan && tab->explain_plan->range_checked_fer)
|
||||||
tab->explain_plan->range_checked_fer->collect_data(tab->select->quick);
|
tab->explain_plan->range_checked_fer->collect_data(tab->select->quick);
|
||||||
|
|
||||||
@@ -24797,7 +24813,8 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
|||||||
HA_POS_ERROR :
|
HA_POS_ERROR :
|
||||||
tab->join->unit->
|
tab->join->unit->
|
||||||
lim.get_select_limit(),
|
lim.get_select_limit(),
|
||||||
TRUE, TRUE, FALSE, FALSE);
|
TRUE, TRUE, FALSE, FALSE,
|
||||||
|
Item_func::BITMAP_ALL);
|
||||||
// if we cannot use quick select
|
// if we cannot use quick select
|
||||||
if (res != SQL_SELECT::OK || !tab->select->quick)
|
if (res != SQL_SELECT::OK || !tab->select->quick)
|
||||||
{
|
{
|
||||||
@@ -24902,7 +24919,8 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
|||||||
join->select_options & OPTION_FOUND_ROWS ?
|
join->select_options & OPTION_FOUND_ROWS ?
|
||||||
HA_POS_ERROR :
|
HA_POS_ERROR :
|
||||||
join->unit->lim.get_select_limit(),
|
join->unit->lim.get_select_limit(),
|
||||||
TRUE, FALSE, FALSE, FALSE);
|
TRUE, FALSE, FALSE, FALSE,
|
||||||
|
Item_func::BITMAP_ALL);
|
||||||
if (res == SQL_SELECT::ERROR)
|
if (res == SQL_SELECT::ERROR)
|
||||||
{
|
{
|
||||||
*fatal_error= true;
|
*fatal_error= true;
|
||||||
|
@@ -579,7 +579,8 @@ int mysql_update(THD *thd,
|
|||||||
|
|
||||||
select= make_select(table, 0, 0, conds, (SORT_INFO*) 0, 0, &error);
|
select= make_select(table, 0, 0, conds, (SORT_INFO*) 0, 0, &error);
|
||||||
if (unlikely(error || !limit || thd->is_error() ||
|
if (unlikely(error || !limit || thd->is_error() ||
|
||||||
(select && select->check_quick(thd, safe_update, limit))))
|
(select && select->check_quick(thd, safe_update, limit,
|
||||||
|
Item_func::BITMAP_ALL))))
|
||||||
{
|
{
|
||||||
query_plan.set_impossible_where();
|
query_plan.set_impossible_where();
|
||||||
if (thd->lex->describe || thd->lex->analyze_stmt)
|
if (thd->lex->describe || thd->lex->analyze_stmt)
|
||||||
|
Reference in New Issue
Block a user