Skip to content

Commit 9d884fd

Browse files
author
Alexander Barkov
committed
MDEV-8599 "WHERE varchar_field LIKE temporal_const" does not use range optimizer
1 parent 6e091dc commit 9d884fd

File tree

5 files changed

+243
-170
lines changed

5 files changed

+243
-170
lines changed

mysql-test/r/func_like.result

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,5 +227,30 @@ Warnings:
227227
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a` = 10.0) and (`test`.`t1`.`a` like 10.00))
228228
DROP TABLE t1;
229229
#
230+
# MDEV-8599 "WHERE varchar_field LIKE temporal_const" does not use range optimizer
231+
#
232+
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1, KEY(a)) ENGINE=MyISAM;
233+
INSERT INTO t1 VALUES ('00:00:00');
234+
INSERT INTO t1 VALUES ('00:00:01');
235+
INSERT INTO t1 VALUES ('00:00:02');
236+
INSERT INTO t1 VALUES ('00:00:03');
237+
INSERT INTO t1 VALUES ('00:00:04');
238+
INSERT INTO t1 VALUES ('00:00:05');
239+
INSERT INTO t1 VALUES ('00:00:06');
240+
INSERT INTO t1 VALUES ('00:00:07');
241+
EXPLAIN SELECT * FROM t1 WHERE a LIKE '00:00:00';
242+
id select_type table type possible_keys key key_len ref rows Extra
243+
1 SIMPLE t1 range a a 13 NULL 1 Using where; Using index
244+
EXPLAIN SELECT * FROM t1 WHERE a LIKE TIME'00:00:00';
245+
id select_type table type possible_keys key key_len ref rows Extra
246+
1 SIMPLE t1 range a a 13 NULL 1 Using where; Using index
247+
SELECT * FROM t1 WHERE a LIKE '00:00:00';
248+
a
249+
00:00:00
250+
SELECT * FROM t1 WHERE a LIKE TIME'00:00:00';
251+
a
252+
00:00:00
253+
DROP TABLE t1;
254+
#
230255
# End of 10.1 tests
231256
#

mysql-test/t/func_like.test

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,25 @@ SELECT * FROM t1 WHERE a=10.0 AND a LIKE 10.00;
163163
EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=10.0 AND a LIKE 10.00;
164164
DROP TABLE t1;
165165

166+
--echo #
167+
--echo # MDEV-8599 "WHERE varchar_field LIKE temporal_const" does not use range optimizer
168+
--echo #
169+
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1, KEY(a)) ENGINE=MyISAM;
170+
INSERT INTO t1 VALUES ('00:00:00');
171+
INSERT INTO t1 VALUES ('00:00:01');
172+
INSERT INTO t1 VALUES ('00:00:02');
173+
INSERT INTO t1 VALUES ('00:00:03');
174+
INSERT INTO t1 VALUES ('00:00:04');
175+
INSERT INTO t1 VALUES ('00:00:05');
176+
INSERT INTO t1 VALUES ('00:00:06');
177+
INSERT INTO t1 VALUES ('00:00:07');
178+
EXPLAIN SELECT * FROM t1 WHERE a LIKE '00:00:00';
179+
EXPLAIN SELECT * FROM t1 WHERE a LIKE TIME'00:00:00';
180+
SELECT * FROM t1 WHERE a LIKE '00:00:00';
181+
SELECT * FROM t1 WHERE a LIKE TIME'00:00:00';
182+
DROP TABLE t1;
183+
184+
166185
--echo #
167186
--echo # End of 10.1 tests
168187
--echo #

sql/item_cmpfunc.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ class Arg_comparator: public Sql_alloc
120120
friend class Item_func;
121121
};
122122

123+
124+
class SEL_ARG;
125+
struct KEY_PART;
126+
123127
class Item_bool_func :public Item_int_func
124128
{
125129
protected:
@@ -147,6 +151,9 @@ class Item_bool_func :public Item_int_func
147151
SEL_TREE *get_ne_mm_tree(RANGE_OPT_PARAM *param,
148152
Field *field, Item *lt_value, Item *gt_value,
149153
Item_result cmp_type);
154+
virtual SEL_ARG *get_mm_leaf(RANGE_OPT_PARAM *param, Field *field,
155+
KEY_PART *key_part,
156+
Item_func::Functype type, Item *value);
150157
public:
151158
Item_bool_func() :Item_int_func() {}
152159
Item_bool_func(Item *a) :Item_int_func(a) {}
@@ -1437,6 +1444,9 @@ class Item_func_null_predicate :public Item_bool_func
14371444
DBUG_ENTER("Item_func_null_predicate::get_func_mm_tree");
14381445
DBUG_RETURN(get_mm_parts(param, field, functype(), value, cmp_type));
14391446
}
1447+
SEL_ARG *get_mm_leaf(RANGE_OPT_PARAM *param, Field *field,
1448+
KEY_PART *key_part,
1449+
Item_func::Functype type, Item *value);
14401450
public:
14411451
Item_func_null_predicate(Item *a) :Item_bool_func(a) { }
14421452
void add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level,
@@ -1552,6 +1562,10 @@ class Item_func_like :public Item_bool_func2
15521562
DTCollation cmp_collation;
15531563
String cmp_value1, cmp_value2;
15541564
bool with_sargable_pattern() const;
1565+
protected:
1566+
SEL_ARG *get_mm_leaf(RANGE_OPT_PARAM *param, Field *field,
1567+
KEY_PART *key_part,
1568+
Item_func::Functype type, Item *value);
15551569
public:
15561570
int escape;
15571571

0 commit comments

Comments
 (0)