mirror of
https://github.com/MariaDB/server.git
synced 2026-05-14 19:07:15 +02:00
Merge moonbone.local:/home/evgen/bk-trees/mysql-5.0-opt
into moonbone.local:/work/merge-5.1
This commit is contained in:
commit
a989f7261e
10 changed files with 539 additions and 18 deletions
|
|
@ -527,27 +527,20 @@ my_bool my_like_range_mb(CHARSET_INFO *cs,
|
|||
char *min_str,char *max_str,
|
||||
uint *min_length,uint *max_length)
|
||||
{
|
||||
uint mblen;
|
||||
const char *end= ptr + ptr_length;
|
||||
char *min_org= min_str;
|
||||
char *min_end= min_str + res_length;
|
||||
char *max_end= max_str + res_length;
|
||||
uint charlen= res_length / cs->mbmaxlen;
|
||||
uint maxcharlen= res_length / cs->mbmaxlen;
|
||||
|
||||
for (; ptr != end && min_str != min_end && charlen > 0 ; ptr++, charlen--)
|
||||
for (; ptr != end && min_str != min_end && maxcharlen ; maxcharlen--)
|
||||
{
|
||||
/* We assume here that escape, w_any, w_namy are one-byte characters */
|
||||
if (*ptr == escape && ptr+1 != end)
|
||||
{
|
||||
ptr++; /* Skip escape */
|
||||
*min_str++= *max_str++ = *ptr;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == w_one || *ptr == w_many) /* '_' and '%' in SQL */
|
||||
{
|
||||
charlen= my_charpos(cs, min_org, min_str, res_length/cs->mbmaxlen);
|
||||
|
||||
if (charlen < (uint) (min_str - min_org))
|
||||
min_str= min_org + charlen;
|
||||
|
||||
ptr++; /* Skip escape */
|
||||
else if (*ptr == w_one || *ptr == w_many) /* '_' and '%' in SQL */
|
||||
{
|
||||
/*
|
||||
Calculate length of keys:
|
||||
'a\0\0... is the smallest possible string when we have space expand
|
||||
|
|
@ -571,7 +564,16 @@ my_bool my_like_range_mb(CHARSET_INFO *cs,
|
|||
pad_max_char(cs, max_str, max_end);
|
||||
return 0;
|
||||
}
|
||||
*min_str++= *max_str++ = *ptr;
|
||||
if ((mblen= my_ismbchar(cs, ptr, end)) > 1)
|
||||
{
|
||||
if (ptr+mblen > end || min_str+mblen > min_end)
|
||||
break;
|
||||
while (mblen--)
|
||||
*min_str++= *max_str++= *ptr++;
|
||||
}
|
||||
else
|
||||
*min_str++= *max_str++= *ptr++;
|
||||
|
||||
}
|
||||
|
||||
*min_length= *max_length = (uint) (min_str - min_org);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue