summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorunknown <bar@mysql.com>2004-10-21 14:48:37 +0500
committerunknown <bar@mysql.com>2004-10-21 14:48:37 +0500
commit655e1a9d8afde07a77446deb4ed75759f3741274 (patch)
tree1b927731719500bd82d43b78d0cf6138b1217910 /strings
parent8f8236008193394ea2785c0095adf02839cde83a (diff)
downloadmariadb-git-655e1a9d8afde07a77446deb4ed75759f3741274.tar.gz
Bug #5679 utf8_unicode_ci LIKE--trailing % doesn't equal zero characters
Diffstat (limited to 'strings')
-rw-r--r--strings/ctype-uca.c56
1 files changed, 53 insertions, 3 deletions
diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c
index 446fc821337..4763a7b7e1b 100644
--- a/strings/ctype-uca.c
+++ b/strings/ctype-uca.c
@@ -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 );