summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <ram@gw.mysql.r18.ru>2003-12-30 19:23:38 +0400
committerunknown <ram@gw.mysql.r18.ru>2003-12-30 19:23:38 +0400
commit824111e6c4583441719bd6fa431b6aedcab8fff6 (patch)
tree9d651b5aef31bc35f35f5032256af6b1e127a0a1
parentd9ada7c257a4af713393cc536938e80156810418 (diff)
downloadmariadb-git-824111e6c4583441719bd6fa431b6aedcab8fff6.tar.gz
Fix for the bug #2231: string column, INDEX+LIKE, don't take the ESCAPE character.
(acctually i don't like the fix, any suggestions?)
-rw-r--r--mysql-test/r/func_like.result6
-rw-r--r--mysql-test/t/func_like.test9
-rw-r--r--sql/item_cmpfunc.h9
-rw-r--r--sql/opt_range.cc11
4 files changed, 26 insertions, 9 deletions
diff --git a/mysql-test/r/func_like.result b/mysql-test/r/func_like.result
index f923c16b2ac..0f94348a5f8 100644
--- a/mysql-test/r/func_like.result
+++ b/mysql-test/r/func_like.result
@@ -37,3 +37,9 @@ select * from t1 where a like "%abc\d%";
a
abcd
drop table t1;
+create table t1 (a varchar(10), key(a));
+insert into t1 values ('a'), ('a\\b');
+select * from t1 where a like 'a\\%' escape '#';
+a
+a\b
+drop table t1;
diff --git a/mysql-test/t/func_like.test b/mysql-test/t/func_like.test
index a5d1193fd74..1e14c70a76a 100644
--- a/mysql-test/t/func_like.test
+++ b/mysql-test/t/func_like.test
@@ -21,3 +21,12 @@ select * from t1 where a like "%abcd%";
select * from t1 where a like "%abc\d%";
drop table t1;
+
+#
+# Bug #2231
+#
+
+create table t1 (a varchar(10), key(a));
+insert into t1 values ('a'), ('a\\b');
+select * from t1 where a like 'a\\%' escape '#';
+drop table t1;
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index 58c7ea8d00d..9f19e7575d5 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -505,8 +505,6 @@ public:
class Item_func_like :public Item_bool_func2
{
- char escape;
-
// Turbo Boyer-Moore data
bool canDoTurboBM; // pattern is '%abcd%' case
const char* pattern;
@@ -523,10 +521,11 @@ class Item_func_like :public Item_bool_func2
enum { alphabet_size = 256 };
public:
+ char escape;
+
Item_func_like(Item *a,Item *b, char* escape_arg)
- :Item_bool_func2(a,b), escape(*escape_arg), canDoTurboBM(false),
- pattern(0), pattern_len(0), bmGs(0), bmBc(0)
- {}
+ :Item_bool_func2(a,b), canDoTurboBM(false), pattern(0), pattern_len(0),
+ bmGs(0), bmBc(0), escape(*escape_arg) {}
longlong val_int();
enum Functype functype() const { return LIKE_FUNC; }
optimize_type select_optimize() const;
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 7e5ca50d349..c918635b61f 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -290,6 +290,7 @@ typedef struct st_qsel_param {
char min_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH],
max_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH];
bool quick; // Don't calulate possible keys
+ char escape;
} PARAM;
static SEL_TREE * get_mm_parts(PARAM *param,Field *field,
@@ -637,7 +638,9 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
param.table=head;
param.keys=0;
param.mem_root= &alloc;
-
+ if (cond->type() == Item::FUNC_ITEM &&
+ ((Item_func*)cond)->functype() == Item_func::LIKE_FUNC)
+ param.escape= ((Item_func_like*)cond)->escape;
param.thd->no_errors=1; // Don't warn about NULL
init_sql_alloc(&alloc, param.thd->variables.range_alloc_block_size, 0);
if (!(param.key_parts = (KEY_PART*) alloc_root(&alloc,
@@ -994,7 +997,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part,
if (maybe_null)
max_str[0]= min_str[0]=0;
if (field->binary())
- like_error=like_range(res->ptr(),res->length(),wild_prefix,field_length,
+ like_error=like_range(res->ptr(),res->length(),param->escape,field_length,
min_str+offset,max_str+offset,(char) 255,
&min_length,&max_length);
else
@@ -1002,12 +1005,12 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part,
#ifdef USE_STRCOLL
if (use_strcoll(default_charset_info))
like_error= my_like_range(default_charset_info,
- res->ptr(),res->length(),wild_prefix,
+ res->ptr(),res->length(),param->escape,
field_length, min_str+maybe_null,
max_str+maybe_null,&min_length,&max_length);
else
#endif
- like_error=like_range(res->ptr(),res->length(),wild_prefix,
+ like_error=like_range(res->ptr(),res->length(),param->escape,
field_length,
min_str+offset,max_str+offset,
max_sort_char,&min_length,&max_length);