mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +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
|
|
@ -7,8 +7,35 @@ DROP TABLE IF EXISTS t1;
|
|||
#
|
||||
# Test Unicode collations.
|
||||
#
|
||||
|
||||
set names utf8;
|
||||
|
||||
#
|
||||
# Check trailing spaces
|
||||
#
|
||||
set collation_connection=utf8_unicode_ci;
|
||||
|
||||
select 'a' = 'a', 'a' = 'a ', 'a ' = 'a';
|
||||
|
||||
select 'a\t' = 'a' , 'a\t' < 'a' , 'a\t' > 'a';
|
||||
select 'a\t' = 'a ', 'a\t' < 'a ', 'a\t' > 'a ';
|
||||
|
||||
select 'a' = 'a\t', 'a' < 'a\t', 'a' > 'a\t';
|
||||
select 'a ' = 'a\t', 'a ' < 'a\t', 'a ' > 'a\t';
|
||||
|
||||
select 'a a' > 'a', 'a \t' < 'a';
|
||||
|
||||
#
|
||||
# Bug #5679 utf8_unicode_ci LIKE--trailing % doesn't equal zero characters
|
||||
#
|
||||
CREATE TABLE t (
|
||||
c char(20) NOT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
INSERT INTO t VALUES ('a'),('ab'),('aba');
|
||||
ALTER TABLE t ADD INDEX (c);
|
||||
SELECT c FROM t WHERE c LIKE 'a%';
|
||||
#should find 3 rows but only found 2
|
||||
DROP TABLE t;
|
||||
|
||||
create table t1 (c1 char(10) character set utf8 collate utf8_bin);
|
||||
|
||||
#
|
||||
|
|
|
|||
|
|
@ -7053,6 +7053,28 @@ static int my_strnncoll_uca(CHARSET_INFO *cs,
|
|||
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:
|
||||
0 - means strings are equal
|
||||
|
|
@ -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