diff options
Diffstat (limited to 'strings/ctype-gbk.c')
-rw-r--r-- | strings/ctype-gbk.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 0be56e8d946..858624c0600 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -2625,14 +2625,22 @@ int my_strnncoll_gbk(CHARSET_INFO *cs __attribute__((unused)), static int my_strnncollsp_gbk(CHARSET_INFO * cs __attribute__((unused)), const uchar *a, uint a_length, - const uchar *b, uint b_length) + const uchar *b, uint b_length, + my_bool diff_if_only_endspace_difference) { uint length= min(a_length, b_length); int res= my_strnncoll_gbk_internal(&a, &b, length); + +#ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE + diff_if_only_endspace_difference= 0; +#endif + if (!res && a_length != b_length) { const uchar *end; int swap= 0; + if (diff_if_only_endspace_difference) + res= 1; /* Assume 'a' is bigger */ /* Check the next not space character of the longer key. If it's < ' ', then it's smaller than the other key. @@ -2643,6 +2651,7 @@ static int my_strnncollsp_gbk(CHARSET_INFO * cs __attribute__((unused)), a_length= b_length; a= b; swap= -1; /* swap sign of result */ + res= -res; } for (end= a + a_length-length; a < end ; a++) { @@ -2728,22 +2737,26 @@ static my_bool my_like_range_gbk(CHARSET_INFO *cs __attribute__((unused)), } if (*ptr == w_many) /* '%' in SQL */ { - *min_length= (uint) (min_str - min_org); + /* + Calculate length of keys: + 'a\0\0... is the smallest possible string when we have space expand + a\ff\ff... is the biggest possible string + */ + *min_length= ((cs->state & MY_CS_BINSORT) ? (uint) (min_str - min_org) : + res_length); *max_length= res_length; do { *min_str++= 0; - *max_str++ = max_sort_char; + *max_str++= max_sort_char; } while (min_str != min_end); return 0; } *min_str++= *max_str++ = *ptr; } + *min_length= *max_length = (uint) (min_str - min_org); while (min_str != min_end) - { - *min_str++ = ' '; /* Because if key compression */ - *max_str++ = ' '; - } + *min_str++= *max_str++= ' '; /* Because if key compression */ return 0; } |