diff options
author | unknown <bar@mysql.com> | 2004-10-21 14:48:37 +0500 |
---|---|---|
committer | unknown <bar@mysql.com> | 2004-10-21 14:48:37 +0500 |
commit | 655e1a9d8afde07a77446deb4ed75759f3741274 (patch) | |
tree | 1b927731719500bd82d43b78d0cf6138b1217910 /strings | |
parent | 8f8236008193394ea2785c0095adf02839cde83a (diff) | |
download | mariadb-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.c | 56 |
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 ); |