mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 11:27:39 +02:00
Bug #5679 utf8_unicode_ci LIKE--trailing % doesn't equal zero characters
This commit is contained in:
parent
8f82360081
commit
655e1a9d8a
2 changed files with 81 additions and 4 deletions
|
|
@ -7052,6 +7052,28 @@ static int my_strnncoll_uca(CHARSET_INFO *cs,
|
|||
NOTES:
|
||||
Works exactly the same with my_strnncoll_uca(),
|
||||
but ignores trailing spaces.
|
||||
|
||||
In the while() comparison these situations are possible:
|
||||
1. (s_res>0) and (t_res>0) and (s_res == t_res)
|
||||
Weights are the same so far, continue comparison
|
||||
2. (s_res>0) and (t_res>0) and (s_res!=t_res)
|
||||
A difference has been found, return.
|
||||
3. (s_res>0) and (t_res<0)
|
||||
We have reached the end of the second string, or found
|
||||
an illegal multibyte sequence in the second string.
|
||||
Compare the first string to an infinite array of
|
||||
space characters until difference is found, or until
|
||||
the end of the first string.
|
||||
4. (s_res<0) and (t_res>0)
|
||||
We have reached the end of the first string, or found
|
||||
an illegal multibyte sequence in the first string.
|
||||
Compare the second string to an infinite array of
|
||||
space characters until difference is found or until
|
||||
the end of the second steing.
|
||||
5. (s_res<0) and (t_res<0)
|
||||
Both scanners returned -1. It means we have riched
|
||||
the end-of-string of illegal-sequence in both strings
|
||||
at the same time. Return 0, strings are equal.
|
||||
|
||||
RETURN
|
||||
Difference between two strings, according to the collation:
|
||||
|
|
@ -7070,9 +7092,6 @@ static int my_strnncollsp_uca(CHARSET_INFO *cs,
|
|||
int s_res;
|
||||
int t_res;
|
||||
|
||||
slen= cs->cset->lengthsp(cs, (char*) s, slen);
|
||||
tlen= cs->cset->lengthsp(cs, (char*) t, tlen);
|
||||
|
||||
scanner_handler->init(&sscanner, cs, s, slen);
|
||||
scanner_handler->init(&tscanner, cs, t, tlen);
|
||||
|
||||
|
|
@ -7080,6 +7099,37 @@ static int my_strnncollsp_uca(CHARSET_INFO *cs,
|
|||
{
|
||||
s_res= scanner_handler->next(&sscanner);
|
||||
t_res= scanner_handler->next(&tscanner);
|
||||
|
||||
if (s_res > 0 && t_res < 0)
|
||||
{
|
||||
/* Calculate weight for SPACE character */
|
||||
t_res= cs->sort_order_big[0][0x20 * cs->sort_order[0]];
|
||||
|
||||
/* compare the first string to spaces */
|
||||
do
|
||||
{
|
||||
if (s_res != t_res)
|
||||
return (s_res - t_res);
|
||||
s_res= scanner_handler->next(&sscanner);
|
||||
} while (s_res > 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (s_res < 0 && t_res > 0)
|
||||
{
|
||||
/* Calculate weight for SPACE character */
|
||||
s_res= cs->sort_order_big[0][0x20 * cs->sort_order[0]];
|
||||
|
||||
/* compare the second string to spaces */
|
||||
do
|
||||
{
|
||||
if (s_res != t_res)
|
||||
return (s_res - t_res);
|
||||
t_res= scanner_handler->next(&tscanner);
|
||||
} while (t_res > 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
} while ( s_res == t_res && s_res >0);
|
||||
|
||||
return ( s_res - t_res );
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue