diff options
author | Alexander Barkov <bar@mysql.com> | 2010-03-04 15:00:32 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mysql.com> | 2010-03-04 15:00:32 +0400 |
commit | 922cdddeb0d4b536c81c0b4995ee965ae36b5e15 (patch) | |
tree | abbce4ba908fdc0d13da5be0f0881ef25537361b /strings | |
parent | a75a9eb1331a293e9dfe119c6b19dfdb330d957f (diff) | |
download | mariadb-git-922cdddeb0d4b536c81c0b4995ee965ae36b5e15.tar.gz |
A joint patch for:
Bug#51675 Server crashes on inserting 4 byte char. after ALTER TABLE to 'utf8mb4'
Bug#51676 Server crashes on SELECT, ORDER BY on 'utf8mb4' column
include/m_ctype.h:
Defining MY_CS_REPLACEMENT_CHARACTER
mysql-test/r/ctype_utf8mb4.result:
Adding tests
mysql-test/t/ctype_utf8mb4.test:
Adding tests
strings/ctype-uca.c:
Don't use UCA data for characters higher than 0xFFFF.
strings/ctype-ucs2.c:
Using newly defined MY_CS_REPLACEMENT_CHARACTER
strings/ctype-utf8.c:
Using newly defined MY_CS_REPLACEMENT_CHARACTER
Removing unesed variable "plane".
Diffstat (limited to 'strings')
-rw-r--r-- | strings/ctype-uca.c | 2 | ||||
-rw-r--r-- | strings/ctype-ucs2.c | 6 | ||||
-rw-r--r-- | strings/ctype-utf8.c | 7 |
3 files changed, 6 insertions, 9 deletions
diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c index 7dbec5a1321..b6d413432ed 100644 --- a/strings/ctype-uca.c +++ b/strings/ctype-uca.c @@ -6983,6 +6983,8 @@ static int my_uca_scanner_next_any(my_uca_scanner *scanner) scanner->send)) <= 0)) return -1; + if (wc > 0xFFFF) + wc= MY_CS_REPLACEMENT_CHARACTER; scanner->page= wc >> 8; scanner->code= wc & 0xFF; scanner->sbeg+= mb_len; diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 6de0ea8f7e8..e3e13af85ef 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -50,8 +50,6 @@ static unsigned long lfactor[9]= { 1L, 10L, 100L, 1000L, 10000L, 100000L, 1000000L, 10000000L, 100000000L }; -#define REPLACEMENT_CHAR 0xFFFD; - #ifdef HAVE_CHARSET_mb2_or_mb4 @@ -1145,7 +1143,7 @@ my_tosort_utf16(MY_UNICASE_INFO **uni_plane, my_wc_t *wc) } else { - *wc= REPLACEMENT_CHAR; + *wc= MY_CS_REPLACEMENT_CHARACTER; } } @@ -1874,7 +1872,7 @@ my_tosort_utf32(MY_UNICASE_INFO **uni_plane, my_wc_t *wc) } else { - *wc= REPLACEMENT_CHAR; + *wc= MY_CS_REPLACEMENT_CHARACTER; } } diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 7de5cdd00ee..ace39130c12 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1720,9 +1720,6 @@ MY_UNICASE_INFO *my_unicase_turkish[256]= }; -#define REPLACEMENT_CHAR 0xFFFD; - - static inline void my_tosort_unicode(MY_UNICASE_INFO **uni_plane, my_wc_t *wc) { @@ -1734,7 +1731,7 @@ my_tosort_unicode(MY_UNICASE_INFO **uni_plane, my_wc_t *wc) } else { - *wc= REPLACEMENT_CHAR; + *wc= MY_CS_REPLACEMENT_CHARACTER; } } @@ -1757,7 +1754,7 @@ my_wildcmp_unicode(CHARSET_INFO *cs, { int result= -1; /* Not found, using wildcards */ my_wc_t s_wc, w_wc; - int scan, plane; + int scan; int (*mb_wc)(struct charset_info_st *, my_wc_t *, const uchar *, const uchar *); mb_wc= cs->cset->mb_wc; |