1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Checking Thai sort order and trailing spaces handling

This commit is contained in:
bar@bar.intranet.mysql.r18.ru
2004-03-29 16:38:38 +05:00
parent 699dafefa2
commit f84f6d5cdb
3 changed files with 2863 additions and 27 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -64,7 +64,7 @@
#define X L_MIDDLE #define X L_MIDDLE
int t_ctype[][TOT_LEVELS] = { static int t_ctype[][TOT_LEVELS] = {
/*0x00*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, /*0x00*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
/*0x01*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, /*0x01*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
/*0x02*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, /*0x02*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
@ -324,7 +324,7 @@ int t_ctype[][TOT_LEVELS] = {
/*0xFF*/ { 255 /*IGNORE*/, IGNORE, IGNORE, IGNORE, X }, /*0xFF*/ { 255 /*IGNORE*/, IGNORE, IGNORE, IGNORE, X },
}; };
uchar NEAR ctype_tis620[257] = static uchar NEAR ctype_tis620[257] =
{ {
0, /* For standard library */ 0, /* For standard library */
32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32, 32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32,
@ -345,7 +345,7 @@ uchar NEAR ctype_tis620[257] =
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
}; };
uchar NEAR to_lower_tis620[]= static uchar NEAR to_lower_tis620[]=
{ {
'\000','\001','\002','\003','\004','\005','\006','\007', '\000','\001','\002','\003','\004','\005','\006','\007',
'\010','\011','\012','\013','\014','\015','\016','\017', '\010','\011','\012','\013','\014','\015','\016','\017',
@ -381,7 +381,7 @@ uchar NEAR to_lower_tis620[]=
(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377',
}; };
uchar NEAR to_upper_tis620[]= static uchar NEAR to_upper_tis620[]=
{ {
'\000','\001','\002','\003','\004','\005','\006','\007', '\000','\001','\002','\003','\004','\005','\006','\007',
'\010','\011','\012','\013','\014','\015','\016','\017', '\010','\011','\012','\013','\014','\015','\016','\017',
@ -417,7 +417,7 @@ uchar NEAR to_upper_tis620[]=
(uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377',
}; };
uchar NEAR sort_order_tis620[]= static uchar NEAR sort_order_tis620[]=
{ {
'\000','\001','\002','\003','\004','\005','\006','\007', '\000','\001','\002','\003','\004','\005','\006','\007',
'\010','\011','\012','\013','\014','\015','\016','\017', '\010','\011','\012','\013','\014','\015','\016','\017',
@ -526,6 +526,7 @@ static uint thai2sortable(uchar *tstr, uint len)
Ret: strcmp result Ret: strcmp result
*/ */
static
int my_strnncoll_tis620(CHARSET_INFO *cs __attribute__((unused)), int my_strnncoll_tis620(CHARSET_INFO *cs __attribute__((unused)),
const uchar * s1, uint len1, const uchar * s1, uint len1,
const uchar * s2, uint len2) const uchar * s2, uint len2)
@ -551,18 +552,70 @@ int my_strnncoll_tis620(CHARSET_INFO *cs __attribute__((unused)),
} }
/*
TODO: Has to be fixed like strnncollsp in ctype-simple.c
*/
static static
int my_strnncollsp_tis620(CHARSET_INFO * cs, int my_strnncollsp_tis620(CHARSET_INFO * cs __attribute__((unused)),
const uchar *s, uint slen, const uchar *a0, uint a_length,
const uchar *t, uint tlen) const uchar *b0, uint b_length)
{ {
for ( ; slen && s[slen-1] == ' ' ; slen--); uchar buf[80] ;
for ( ; tlen && t[tlen-1] == ' ' ; tlen--); uchar *end, *a, *b;
return my_strnncoll_tis620(cs,s,slen,t,tlen); uint length;
int res= 0;
int alloced= 0;
a= buf;
if ((a_length + b_length +2) > (int) sizeof(buf))
{
a= (uchar*) malloc(a_length+b_length);
alloced= 1;
}
b= a + a_length+1;
memcpy((char*) a, (char*) a0, a_length);
a[a_length]= 0; /* if length(a0)> len1, need to put 'end of string' */
memcpy((char *)b, (char *)b0, b_length);
b[b_length]= 0; /* put end of string */
a_length= thai2sortable(a, a_length);
b_length= thai2sortable(b, b_length);
end= a + (length= min(a_length, b_length));
while (a < end)
{
if (*a++ != *b++)
{
res= ((int) a[-1] - (int) b[-1]);
goto ret;
}
}
if (a_length != b_length)
{
int swap= 0;
/*
Check the next not space character of the longer key. If it's < ' ',
then it's smaller than the other key.
*/
if (a_length < b_length)
{
/* put shorter key in s */
a_length= b_length;
a= b;
swap= -1; /* swap sign of result */
}
for (end= a + a_length-length; a < end ; a++)
{
if (*a != ' ')
{
res= ((int) *a - (int) ' ') ^ swap;
goto ret;
}
}
}
ret:
if (alloced)
free(a);
return res;
} }
@ -573,6 +626,7 @@ int my_strnncollsp_tis620(CHARSET_INFO * cs,
Ret: Conveted string size Ret: Conveted string size
*/ */
static
int my_strnxfrm_tis620(CHARSET_INFO *cs __attribute__((unused)), int my_strnxfrm_tis620(CHARSET_INFO *cs __attribute__((unused)),
uchar * dest, uint len, uchar * dest, uint len,
const uchar * src, uint srclen) const uchar * src, uint srclen)
@ -583,18 +637,6 @@ int my_strnxfrm_tis620(CHARSET_INFO *cs __attribute__((unused)),
} }
/*
strcoll replacment, compare 2 strings
Arg: 2 strings
Ret: strcmp result
*/
int my_strcoll_tis620(const uchar * s1, const uchar * s2)
{
return my_strnncoll_tis620((CHARSET_INFO *) 0, s1, strlen((char*) s1),
s2, strlen((char*) s1));
}
/* /*
Convert SQL LIKE string to C string Convert SQL LIKE string to C string
@ -614,6 +656,7 @@ int my_strcoll_tis620(const uchar * s1, const uchar * s2)
#define max_sort_chr ((char) 255) #define max_sort_chr ((char) 255)
static
my_bool my_like_range_tis620(CHARSET_INFO *cs __attribute__((unused)), my_bool my_like_range_tis620(CHARSET_INFO *cs __attribute__((unused)),
const char *ptr, uint ptr_length, const char *ptr, uint ptr_length,
pbool escape, pbool w_one, pbool w_many, pbool escape, pbool w_one, pbool w_many,