summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mysql.com>2003-03-02 14:07:32 +0100
committerunknown <serg@serg.mysql.com>2003-03-02 14:07:32 +0100
commitc5cd20fe8f37b4ff693bdb9cb24e8cf7d1b59194 (patch)
tree3bbe3ed618acb5ea8d0a6fbfde522de0a4b5efc1
parenta2cc82182bbebb24a75e2d54d5361b3932416b9c (diff)
downloadmariadb-git-c5cd20fe8f37b4ff693bdb9cb24e8cf7d1b59194.tar.gz
optimizer should check for "field LIKE const" not "field like STRING"
BitKeeper/etc/ignore: Added configure.lineno innobase/configure.lineno to the ignore list
-rw-r--r--.bzrignore2
-rw-r--r--mysql-test/r/func_like.result10
-rw-r--r--mysql-test/t/func_like.test11
-rw-r--r--sql/item_cmpfunc.cc12
4 files changed, 27 insertions, 8 deletions
diff --git a/.bzrignore b/.bzrignore
index f5e9775ee80..78d44a7704d 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -528,3 +528,5 @@ support-files/MacOSX/Info.plist
support-files/MacOSX/StartupParameters.plist
support-files/MacOSX/postinstall
support-files/MacOSX/preinstall
+configure.lineno
+innobase/configure.lineno
diff --git a/mysql-test/r/func_like.result b/mysql-test/r/func_like.result
index c2085ba12da..f923c16b2ac 100644
--- a/mysql-test/r/func_like.result
+++ b/mysql-test/r/func_like.result
@@ -1,10 +1,20 @@
drop table if exists t1;
create table t1 (a varchar(10), key(a));
insert into t1 values ("a"),("abc"),("abcd"),("hello"),("test");
+explain select * from t1 where a like 'abc%';
+table type possible_keys key key_len ref rows Extra
+t1 range a a 11 NULL 1 Using where; Using index
+explain select * from t1 where a like concat('abc','%');
+table type possible_keys key key_len ref rows Extra
+t1 range a a 11 NULL 1 Using where; Using index
select * from t1 where a like "abc%";
a
abc
abcd
+select * from t1 where a like concat("abc","%");
+a
+abc
+abcd
select * from t1 where a like "ABC%";
a
abc
diff --git a/mysql-test/t/func_like.test b/mysql-test/t/func_like.test
index 09746fcc817..a5d1193fd74 100644
--- a/mysql-test/t/func_like.test
+++ b/mysql-test/t/func_like.test
@@ -5,10 +5,13 @@
drop table if exists t1;
create table t1 (a varchar(10), key(a));
insert into t1 values ("a"),("abc"),("abcd"),("hello"),("test");
-select * from t1 where a like "abc%";
-select * from t1 where a like "ABC%";
-select * from t1 where a like "test%";
-select * from t1 where a like "te_t";
+explain select * from t1 where a like 'abc%';
+explain select * from t1 where a like concat('abc','%');
+select * from t1 where a like "abc%";
+select * from t1 where a like concat("abc","%");
+select * from t1 where a like "ABC%";
+select * from t1 where a like "test%";
+select * from t1 where a like "te_t";
#
# The following will test the Turbo Boyer-Moore code
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 55e8ef7c4b5..d96069a17aa 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -1409,12 +1409,16 @@ longlong Item_func_like::val_int()
Item_func::optimize_type Item_func_like::select_optimize() const
{
- if (args[1]->type() == STRING_ITEM)
+ if (args[1]->const_item())
{
- if (((Item_string *) args[1])->str_value[0] != wild_many)
+ String* res2= args[1]->val_str((String *)&tmp_value2);
+
+ if (!res2)
+ return OPTIMIZE_NONE;
+
+ if (*res2->ptr() != wild_many)
{
- if ((args[0]->result_type() != STRING_RESULT) ||
- ((Item_string *) args[1])->str_value[0] != wild_one)
+ if (args[0]->result_type() != STRING_RESULT || *res2->ptr() != wild_one)
return OPTIMIZE_OP;
}
}