Commit 3f0d2451 authored by unknown's avatar unknown

Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.0

into gw.mysql.r18.ru:/usr/home/ram/work/4.0.b2231

parents f61cec71 aafca9f0
...@@ -37,3 +37,12 @@ select * from t1 where a like "%abc\d%"; ...@@ -37,3 +37,12 @@ select * from t1 where a like "%abc\d%";
a a
abcd abcd
drop table t1; 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
select * from t1 where a like 'a\\%' escape '#' and a like 'a\\\\b';
a
a\b
drop table t1;
...@@ -21,3 +21,13 @@ select * from t1 where a like "%abcd%"; ...@@ -21,3 +21,13 @@ select * from t1 where a like "%abcd%";
select * from t1 where a like "%abc\d%"; select * from t1 where a like "%abc\d%";
drop table t1; 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 '#';
select * from t1 where a like 'a\\%' escape '#' and a like 'a\\\\b';
drop table t1;
...@@ -505,8 +505,6 @@ public: ...@@ -505,8 +505,6 @@ public:
class Item_func_like :public Item_bool_func2 class Item_func_like :public Item_bool_func2
{ {
char escape;
// Turbo Boyer-Moore data // Turbo Boyer-Moore data
bool canDoTurboBM; // pattern is '%abcd%' case bool canDoTurboBM; // pattern is '%abcd%' case
const char* pattern; const char* pattern;
...@@ -523,10 +521,11 @@ class Item_func_like :public Item_bool_func2 ...@@ -523,10 +521,11 @@ class Item_func_like :public Item_bool_func2
enum { alphabet_size = 256 }; enum { alphabet_size = 256 };
public: public:
char escape;
Item_func_like(Item *a,Item *b, char* escape_arg) Item_func_like(Item *a,Item *b, char* escape_arg)
:Item_bool_func2(a,b), escape(*escape_arg), canDoTurboBM(false), :Item_bool_func2(a,b), canDoTurboBM(false), pattern(0), pattern_len(0),
pattern(0), pattern_len(0), bmGs(0), bmBc(0) bmGs(0), bmBc(0), escape(*escape_arg) {}
{}
longlong val_int(); longlong val_int();
enum Functype functype() const { return LIKE_FUNC; } enum Functype functype() const { return LIKE_FUNC; }
optimize_type select_optimize() const; optimize_type select_optimize() const;
......
...@@ -290,6 +290,7 @@ typedef struct st_qsel_param { ...@@ -290,6 +290,7 @@ typedef struct st_qsel_param {
char min_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH], char min_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH],
max_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH]; max_key[MAX_KEY_LENGTH+MAX_FIELD_WIDTH];
bool quick; // Don't calulate possible keys bool quick; // Don't calulate possible keys
COND *cond;
} PARAM; } PARAM;
static SEL_TREE * get_mm_parts(PARAM *param,Field *field, static SEL_TREE * get_mm_parts(PARAM *param,Field *field,
...@@ -637,7 +638,6 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, ...@@ -637,7 +638,6 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
param.table=head; param.table=head;
param.keys=0; param.keys=0;
param.mem_root= &alloc; param.mem_root= &alloc;
param.thd->no_errors=1; // Don't warn about NULL param.thd->no_errors=1; // Don't warn about NULL
init_sql_alloc(&alloc, param.thd->variables.range_alloc_block_size, 0); init_sql_alloc(&alloc, param.thd->variables.range_alloc_block_size, 0);
if (!(param.key_parts = (KEY_PART*) alloc_root(&alloc, if (!(param.key_parts = (KEY_PART*) alloc_root(&alloc,
...@@ -818,6 +818,8 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond) ...@@ -818,6 +818,8 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond)
if (cond_func->select_optimize() == Item_func::OPTIMIZE_NONE) if (cond_func->select_optimize() == Item_func::OPTIMIZE_NONE)
DBUG_RETURN(0); // Can't be calculated DBUG_RETURN(0); // Can't be calculated
param->cond= cond;
if (cond_func->functype() == Item_func::BETWEEN) if (cond_func->functype() == Item_func::BETWEEN)
{ {
if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM) if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM)
...@@ -994,23 +996,26 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, ...@@ -994,23 +996,26 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part,
if (maybe_null) if (maybe_null)
max_str[0]= min_str[0]=0; max_str[0]= min_str[0]=0;
if (field->binary()) if (field->binary())
like_error=like_range(res->ptr(),res->length(),wild_prefix,field_length, like_error=like_range(res->ptr(), res->length(),
min_str+offset,max_str+offset,(char) 255, ((Item_func_like*)(param->cond))->escape,
&min_length,&max_length); field_length, min_str + offset, max_str + offset,
(char) 255, &min_length, &max_length);
else else
{ {
#ifdef USE_STRCOLL #ifdef USE_STRCOLL
if (use_strcoll(default_charset_info)) if (use_strcoll(default_charset_info))
like_error= my_like_range(default_charset_info, like_error= my_like_range(default_charset_info, res->ptr(),
res->ptr(),res->length(),wild_prefix, res->length(),
field_length, min_str+maybe_null, ((Item_func_like*)(param->cond))->escape,
max_str+maybe_null,&min_length,&max_length); field_length, min_str + maybe_null,
max_str + maybe_null, &min_length,
&max_length);
else else
#endif #endif
like_error=like_range(res->ptr(),res->length(),wild_prefix, like_error=like_range(res->ptr(), res->length(),
field_length, ((Item_func_like*)(param->cond))->escape,
min_str+offset,max_str+offset, field_length, min_str + offset, max_str + offset,
max_sort_char,&min_length,&max_length); max_sort_char, &min_length, &max_length);
} }
if (like_error) // Can't optimize with LIKE if (like_error) // Can't optimize with LIKE
DBUG_RETURN(0); DBUG_RETURN(0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment