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:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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,
|
||||||
|
Reference in New Issue
Block a user