mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
MDEV-9711 NO PAD collations
Based on the patch from Daniil Medvedev (a Google Summer of Code task)
This commit is contained in:
@@ -71,14 +71,14 @@ size_t my_strnxfrmlen_simple(CHARSET_INFO *cs, size_t len)
|
||||
*/
|
||||
|
||||
|
||||
size_t my_strnxfrm_simple(CHARSET_INFO * cs,
|
||||
uchar *dst, size_t dstlen, uint nweights,
|
||||
const uchar *src, size_t srclen, uint flags)
|
||||
size_t my_strnxfrm_simple_internal(CHARSET_INFO * cs,
|
||||
uchar *dst, size_t dstlen, uint *nweights,
|
||||
const uchar *src, size_t srclen)
|
||||
{
|
||||
const uchar *map= cs->sort_order;
|
||||
uchar *d0= dst;
|
||||
uint frmlen;
|
||||
if ((frmlen= MY_MIN(dstlen, nweights)) > srclen)
|
||||
if ((frmlen= MY_MIN(dstlen, *nweights)) > srclen)
|
||||
frmlen= srclen;
|
||||
if (dst != src)
|
||||
{
|
||||
@@ -92,8 +92,32 @@ size_t my_strnxfrm_simple(CHARSET_INFO * cs,
|
||||
for (end= dst + frmlen; dst < end; dst++)
|
||||
*dst= map[(uchar) *dst];
|
||||
}
|
||||
*nweights-= frmlen;
|
||||
return dst - d0;
|
||||
}
|
||||
|
||||
|
||||
size_t my_strnxfrm_simple(CHARSET_INFO * cs,
|
||||
uchar *dst, size_t dstlen, uint nweights,
|
||||
const uchar *src, size_t srclen, uint flags)
|
||||
{
|
||||
uchar *d0= dst;
|
||||
dst= d0 + my_strnxfrm_simple_internal(cs, dst, dstlen, &nweights,
|
||||
src, srclen);
|
||||
return my_strxfrm_pad_desc_and_reverse(cs, d0, dst, d0 + dstlen,
|
||||
nweights - frmlen, flags, 0);
|
||||
nweights, flags, 0);
|
||||
}
|
||||
|
||||
|
||||
size_t my_strnxfrm_simple_nopad(CHARSET_INFO * cs,
|
||||
uchar *dst, size_t dstlen, uint nweights,
|
||||
const uchar *src, size_t srclen, uint flags)
|
||||
{
|
||||
uchar *d0= dst;
|
||||
dst= d0 + my_strnxfrm_simple_internal(cs, dst, dstlen, &nweights,
|
||||
src, srclen);
|
||||
return my_strxfrm_pad_desc_and_reverse_nopad(cs, d0, dst, d0 + dstlen,
|
||||
nweights, flags, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -184,6 +208,14 @@ int my_strnncollsp_simple(CHARSET_INFO * cs, const uchar *a, size_t a_length,
|
||||
}
|
||||
|
||||
|
||||
int my_strnncollsp_simple_nopad(CHARSET_INFO * cs,
|
||||
const uchar *a, size_t a_length,
|
||||
const uchar *b, size_t b_length)
|
||||
{
|
||||
return my_strnncoll_simple(cs, a, a_length, b, b_length, FALSE);
|
||||
}
|
||||
|
||||
|
||||
size_t my_caseup_str_8bit(CHARSET_INFO * cs,char *str)
|
||||
{
|
||||
register const uchar *map= cs->to_upper;
|
||||
@@ -297,13 +329,28 @@ size_t my_snprintf_8bit(CHARSET_INFO *cs __attribute__((unused)),
|
||||
}
|
||||
|
||||
|
||||
void my_hash_sort_simple_nopad(CHARSET_INFO *cs,
|
||||
const uchar *key, size_t len,
|
||||
ulong *nr1, ulong *nr2)
|
||||
{
|
||||
register const uchar *sort_order=cs->sort_order;
|
||||
const uchar *end= key + len;
|
||||
register ulong m1= *nr1, m2= *nr2;
|
||||
for (; key < (uchar*) end ; key++)
|
||||
{
|
||||
MY_HASH_ADD(m1, m2, (uint) sort_order[(uint) *key]);
|
||||
}
|
||||
*nr1= m1;
|
||||
*nr2= m2;
|
||||
}
|
||||
|
||||
|
||||
void my_hash_sort_simple(CHARSET_INFO *cs,
|
||||
const uchar *key, size_t len,
|
||||
ulong *nr1, ulong *nr2)
|
||||
const uchar *key, size_t len,
|
||||
ulong *nr1, ulong *nr2)
|
||||
{
|
||||
register const uchar *sort_order=cs->sort_order;
|
||||
const uchar *end;
|
||||
register ulong m1= *nr1, m2= *nr2;
|
||||
uint16 space_weight= sort_order[' '];
|
||||
|
||||
/*
|
||||
@@ -338,13 +385,7 @@ void my_hash_sort_simple(CHARSET_INFO *cs,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (; key < (uchar*) end ; key++)
|
||||
{
|
||||
MY_HASH_ADD(m1, m2, (uint) sort_order[(uint) *key]);
|
||||
}
|
||||
*nr1= m1;
|
||||
*nr2= m2;
|
||||
my_hash_sort_simple_nopad(cs, key, end - key, nr1, nr2);
|
||||
}
|
||||
|
||||
|
||||
@@ -1996,6 +2037,28 @@ my_strxfrm_pad_desc_and_reverse(CHARSET_INFO *cs,
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
my_strxfrm_pad_desc_and_reverse_nopad(CHARSET_INFO *cs,
|
||||
uchar *str, uchar *frmend, uchar *strend,
|
||||
uint nweights, uint flags, uint level)
|
||||
{
|
||||
if (nweights && frmend < strend && (flags & MY_STRXFRM_PAD_WITH_SPACE))
|
||||
{
|
||||
uint fill_length= MY_MIN((uint) (strend - frmend), nweights * cs->mbminlen);
|
||||
memset(frmend, 0x00, fill_length);
|
||||
frmend+= fill_length;
|
||||
}
|
||||
my_strxfrm_desc_and_reverse(str, frmend, flags, level);
|
||||
if ((flags & MY_STRXFRM_PAD_TO_MAXLEN) && frmend < strend)
|
||||
{
|
||||
uint fill_length= strend - frmend;
|
||||
memset(frmend, 0x00, fill_length);
|
||||
frmend= strend;
|
||||
}
|
||||
return frmend - str;
|
||||
}
|
||||
|
||||
|
||||
MY_CHARSET_HANDLER my_charset_8bit_handler=
|
||||
{
|
||||
my_cset_init_8bit,
|
||||
@@ -2043,3 +2106,19 @@ MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler =
|
||||
my_hash_sort_simple,
|
||||
my_propagate_simple
|
||||
};
|
||||
|
||||
|
||||
MY_COLLATION_HANDLER my_collation_8bit_simple_nopad_ci_handler =
|
||||
{
|
||||
my_coll_init_simple, /* init */
|
||||
my_strnncoll_simple,
|
||||
my_strnncollsp_simple_nopad,
|
||||
my_strnxfrm_simple_nopad,
|
||||
my_strnxfrmlen_simple,
|
||||
my_like_range_simple,
|
||||
my_wildcmp_8bit,
|
||||
my_strcasecmp_8bit,
|
||||
my_instr_simple,
|
||||
my_hash_sort_simple_nopad,
|
||||
my_propagate_simple
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user