min_sort_char was added, for the future UCA implementation.

UCS2 now has its own my_like_range function.
This commit is contained in:
bar@bar.intranet.mysql.r18.ru 2004-03-19 10:00:46 +04:00
commit fc17aad767
17 changed files with 143 additions and 29 deletions

View file

@ -210,7 +210,8 @@ typedef struct charset_info_st
uint strxfrm_multiply;
uint mbminlen;
uint mbmaxlen;
char max_sort_char; /* For LIKE optimization */
uint16 min_sort_char;
uint16 max_sort_char; /* For LIKE optimization */
MY_CHARSET_HANDLER *cset;
MY_COLLATION_HANDLER *coll;
@ -305,6 +306,13 @@ my_bool my_like_range_simple(CHARSET_INFO *cs,
char *min_str, char *max_str,
uint *min_length, uint *max_length);
my_bool my_like_range_ucs2(CHARSET_INFO *cs,
const char *ptr, uint ptr_length,
pbool escape, pbool w_one, pbool w_many,
uint res_length,
char *min_str, char *max_str,
uint *min_length, uint *max_length);
int my_wildcmp_8bit(CHARSET_INFO *,
const char *str,const char *str_end,

View file

@ -62,7 +62,7 @@ static void set_max_sort_char(CHARSET_INFO *cs)
if ((uchar) cs->sort_order[i] > max_char)
{
max_char=(uchar) cs->sort_order[i];
cs->max_sort_char= (char) i;
cs->max_sort_char= i;
}
}
}

View file

@ -6284,7 +6284,8 @@ CHARSET_INFO my_charset_big5_chinese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_big5_handler,
&my_collation_big5_chinese_ci_handler
};
@ -6308,7 +6309,8 @@ CHARSET_INFO my_charset_big5_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_big5_handler,
&my_collation_mb_bin_handler
};

View file

@ -388,7 +388,8 @@ CHARSET_INFO my_charset_bin =
1, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
(char) 255, /* max_sort_char */
0, /* min_sort_char */
255, /* max_sort_char */
&my_charset_handler,
&my_collation_8bit_bin_handler
};

View file

@ -634,7 +634,8 @@ CHARSET_INFO my_charset_latin2_czech_ci =
4, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_8bit_handler,
&my_collation_latin2_czech_ci_handler
};

View file

@ -8692,7 +8692,8 @@ CHARSET_INFO my_charset_euckr_korean_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -8716,7 +8717,8 @@ CHARSET_INFO my_charset_euckr_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -35,6 +35,7 @@ CHARSET_INFO compiled_charsets[] = {
0,
0,
0,
0,
NULL,
NULL
}

View file

@ -5743,7 +5743,8 @@ CHARSET_INFO my_charset_gb2312_chinese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -5766,7 +5767,8 @@ CHARSET_INFO my_charset_gb2312_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -9939,7 +9939,8 @@ CHARSET_INFO my_charset_gbk_chinese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -9962,7 +9963,8 @@ CHARSET_INFO my_charset_gbk_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -218,7 +218,8 @@ CHARSET_INFO my_charset_latin1=
1, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_8bit_simple_ci_handler
};
@ -414,7 +415,8 @@ CHARSET_INFO my_charset_latin1_german2_ci=
2, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_german2_ci_handler
};
@ -438,7 +440,8 @@ CHARSET_INFO my_charset_latin1_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_8bit_bin_handler
};

View file

@ -946,7 +946,7 @@ my_bool my_like_range_simple(CHARSET_INFO *cs,
if (*ptr == w_one) /* '_' in SQL */
{
*min_str++='\0'; /* This should be min char */
*max_str++=cs->max_sort_char;
*max_str++= (char) cs->max_sort_char;
continue;
}
if (*ptr == w_many) /* '%' in SQL */
@ -955,7 +955,7 @@ my_bool my_like_range_simple(CHARSET_INFO *cs,
*max_length=res_length;
do {
*min_str++ = ' '; /* Because if key compression */
*max_str++ = cs->max_sort_char;
*max_str++ = (char) cs->max_sort_char;
} while (min_str != min_end);
return 0;
}

View file

@ -4528,7 +4528,8 @@ CHARSET_INFO my_charset_sjis_japanese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -4551,7 +4552,8 @@ CHARSET_INFO my_charset_sjis_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -913,7 +913,8 @@ CHARSET_INFO my_charset_tis620_thai_ci=
4, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -936,7 +937,8 @@ CHARSET_INFO my_charset_tis620_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_8bit_bin_handler
};

View file

@ -1284,13 +1284,94 @@ void my_hash_sort_ucs2_bin(CHARSET_INFO *cs __attribute__((unused)),
}
}
/*
** Calculate min_str and max_str that ranges a LIKE string.
** Arguments:
** ptr Pointer to LIKE string.
** ptr_length Length of LIKE string.
** escape Escape character in LIKE. (Normally '\').
** All escape characters should be removed from min_str and max_str
** res_length Length of min_str and max_str.
** min_str Smallest case sensitive string that ranges LIKE.
** Should be space padded to res_length.
** max_str Largest case sensitive string that ranges LIKE.
** Normally padded with the biggest character sort value.
**
** The function should return 0 if ok and 1 if the LIKE string can't be
** optimized !
*/
my_bool my_like_range_ucs2(CHARSET_INFO *cs,
const char *ptr,uint ptr_length,
pbool escape, pbool w_one, pbool w_many,
uint res_length,
char *min_str,char *max_str,
uint *min_length,uint *max_length)
{
const char *end=ptr+ptr_length;
char *min_org=min_str;
char *min_end=min_str+res_length;
for (; ptr + 1 < end && min_str + 1 < min_end ; ptr+=2)
{
if (ptr[0] == '\0' && ptr[1] == escape && ptr+2 < end)
{
ptr+=2; /* Skip escape */
*min_str++= *max_str++ = ptr[0];
*min_str++= *max_str++ = ptr[1];
continue;
}
if (ptr[0] == '\0' && ptr[1] == w_one) /* '_' in SQL */
{
*min_str++= (char) cs->min_sort_char >> 8;
*min_str++= (char) cs->min_sort_char & 255;
*max_str++= (char) cs->max_sort_char >> 8;
*max_str++= (char) cs->max_sort_char & 255;
continue;
}
if (ptr[0] == '\0' && ptr[1] == w_many) /* '%' in SQL */
{
*min_length= (uint) (min_str - min_org);
*max_length=res_length;
do {
*min_str++ = '\0';
*min_str++ = ' '; /* Because if key compression */
*max_str++ = (char) cs->max_sort_char >>8;
*max_str++ = (char) cs->max_sort_char & 255;
} while (min_str + 1 < min_end);
return 0;
}
*min_str++= *max_str++ = ptr[0];
*min_str++= *max_str++ = ptr[1];
}
*min_length= *max_length = (uint) (min_str - min_org);
/* Temporary fix for handling w_one at end of string (key compression) */
{
char *tmp;
for (tmp= min_str ; tmp-1 > min_org && tmp[-1] == '\0' && tmp[-2]=='\0';)
{
*--tmp=' ';
*--tmp='\0';
}
}
while (min_str + 1 < min_end)
{
*min_str++ = *max_str++ = '\0';
*min_str++ = *max_str++ = ' '; /* Because if key compression */
}
return 0;
}
extern MY_COLLATION_HANDLER my_collation_uca_handler;
static MY_COLLATION_HANDLER my_collation_ucs2_general_ci_handler =
{
my_strnncoll_ucs2,
my_strnncoll_ucs2,
my_strnxfrm_ucs2,
my_like_range_simple,
my_like_range_ucs2,
my_wildcmp_ucs2_ci,
my_strcasecmp_ucs2,
my_instr_mb,
@ -1356,7 +1437,8 @@ CHARSET_INFO my_charset_ucs2_general_ci=
1, /* strxfrm_multiply */
2, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0xFFFF, /* max_sort_char */
&my_charset_ucs2_handler,
&my_collation_ucs2_general_ci_handler
};
@ -1380,7 +1462,8 @@ CHARSET_INFO my_charset_ucs2_bin=
1, /* strxfrm_multiply */
2, /* mbminlen */
2, /* mbmaxlen */
0,
0, /* min_sort_char */
0xFFFF, /* max_sort_char */
&my_charset_ucs2_handler,
&my_collation_ucs2_bin_handler
};

View file

@ -8483,7 +8483,8 @@ CHARSET_INFO my_charset_ujis_japanese_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
3, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -8506,7 +8507,8 @@ CHARSET_INFO my_charset_ujis_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
3, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -2009,7 +2009,8 @@ CHARSET_INFO my_charset_utf8_general_ci=
1, /* strxfrm_multiply */
1, /* mbminlen */
3, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_ci_handler
};
@ -2033,7 +2034,8 @@ CHARSET_INFO my_charset_utf8_bin=
1, /* strxfrm_multiply */
1, /* mbminlen */
3, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_handler,
&my_collation_mb_bin_handler
};

View file

@ -629,7 +629,8 @@ CHARSET_INFO my_charset_cp1250_czech_ci =
2, /* strxfrm_multiply */
1, /* mbminlen */
1, /* mbmaxlen */
0,
0, /* min_sort_char */
0, /* max_sort_char */
&my_charset_8bit_handler,
&my_collation_czech_ci_handler
};