mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.0
into gw.mysql.r18.ru:/usr/home/ram/work/4.0.b2231
This commit is contained in:
@ -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%";
|
|||||||
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:
|
|||||||
|
|
||||||
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
|
|||||||
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 {
|
|||||||
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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user