From 83c6946232b4ecc4a691b4f34155d434b804b362 Mon Sep 17 00:00:00 2001 From: "bar@bar.mysql.r18.ru" <> Date: Tue, 16 Sep 2003 15:43:17 +0500 Subject: [PATCH] Bug fix: http://bugs.mysql.com/bug.php?id=1264 --- include/m_ctype.h | 3 +++ mysql-test/r/ctype_many.result | 4 ++-- sql/field.cc | 8 ++------ strings/ctype-big5.c | 1 + strings/ctype-bin.c | 1 + strings/ctype-euc_kr.c | 1 + strings/ctype-gb2312.c | 1 + strings/ctype-gbk.c | 1 + strings/ctype-latin1.c | 1 + strings/ctype-simple.c | 11 +++++++++++ strings/ctype-sjis.c | 1 + strings/ctype-tis620.c | 1 + strings/ctype-ucs2.c | 21 ++++++++++++++++++++- strings/ctype-ujis.c | 1 + strings/ctype-utf8.c | 1 + 15 files changed, 48 insertions(+), 9 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index 4ae6734a48c..8116058d687 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -131,6 +131,7 @@ typedef struct my_charset_handler_st int (*mbcharlen)(struct charset_info_st *, uint); uint (*numchars)(struct charset_info_st *, const char *b, const char *e); uint (*charpos)(struct charset_info_st *, const char *b, const char *e, uint pos); + uint (*lengthsp)(struct charset_info_st *, const char *ptr, uint length); /* Unicode convertion */ int (*mb_wc)(struct charset_info_st *cs,my_wc_t *wc, @@ -240,6 +241,8 @@ extern void my_hash_sort_simple(CHARSET_INFO *cs, const uchar *key, uint len, ulong *nr1, ulong *nr2); +extern uint my_lengthsp_8bit(CHARSET_INFO *cs, const char *ptr, uint length); + /* Functions for 8bit */ extern void my_caseup_str_8bit(CHARSET_INFO *, char *); diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result index a1a1bd75db6..ebc84db7115 100644 --- a/mysql-test/r/ctype_many.result +++ b/mysql-test/r/ctype_many.result @@ -1433,7 +1433,7 @@ CYR CAPIT EM М М CYR CAPIT EN Н Н Н CYR CAPIT O О О О CYR CAPIT PE П П П -CYR CAPIT ER Р Р +CYR CAPIT ER Р Р Р CYR CAPIT ES С С С CYR CAPIT TE Т Т Т CYR CAPIT U У У У @@ -1574,7 +1574,7 @@ CYR CAPIT EM CYR CAPIT EN Н  CYR CAPIT O О  CYR CAPIT PE П  -CYR CAPIT ER Р  +CYR CAPIT ER Р  CYR CAPIT ES С ! CYR CAPIT TE Т " CYR CAPIT U У # diff --git a/sql/field.cc b/sql/field.cc index 47e05c3da3b..68c9922e887 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -3975,12 +3975,8 @@ String *Field_string::val_str(String *val_buffer __attribute__((unused)), String *val_ptr) { char *end=ptr+field_length; -#ifdef WANT_TRUE_BINARY_STRINGS - if (!binary) -#endif - while (end > ptr && end[-1] == ' ') - end--; - val_ptr->set((const char*) ptr,(uint) (end - ptr),field_charset); + uint length= field_charset->cset->lengthsp(field_charset, ptr, field_length); + val_ptr->set((const char*) ptr, length, field_charset); return val_ptr; } diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 88309aadaa0..ddcec46474d 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -6243,6 +6243,7 @@ static MY_CHARSET_HANDLER my_charset_big5_handler= mbcharlen_big5, my_numchars_mb, my_charpos_mb, + my_lengthsp_8bit, my_mb_wc_big5, /* mb_wc */ my_wc_mb_big5, /* wc_mb */ my_caseup_str_mb, diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index 10ea23e07eb..9441268739a 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -280,6 +280,7 @@ static MY_CHARSET_HANDLER my_charset_handler= NULL, /* mbcharlen */ my_numchars_8bit, my_charpos_8bit, + my_lengthsp_8bit, my_mb_wc_bin, my_wc_mb_bin, my_caseup_str_bin, diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index e8d2c8c4d1d..bb3e66a8c6f 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -8652,6 +8652,7 @@ static MY_CHARSET_HANDLER my_charset_handler= mbcharlen_euc_kr, my_numchars_mb, my_charpos_mb, + my_lengthsp_8bit, my_mb_wc_euc_kr, /* mb_wc */ my_wc_mb_euc_kr, /* wc_mb */ my_caseup_str_mb, diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 72548305ad1..b8cee35b186 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -5702,6 +5702,7 @@ static MY_CHARSET_HANDLER my_charset_handler= mbcharlen_gb2312, my_numchars_mb, my_charpos_mb, + my_lengthsp_8bit, my_mb_wc_gb2312, /* mb_wc */ my_wc_mb_gb2312, /* wc_mb */ my_caseup_str_mb, diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 84819d2e1a8..4a84eabaf8c 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -9899,6 +9899,7 @@ static MY_CHARSET_HANDLER my_charset_handler= mbcharlen_gbk, my_numchars_mb, my_charpos_mb, + my_lengthsp_8bit, my_mb_wc_gbk, my_wc_mb_gbk, my_caseup_str_mb, diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index d40e7b4b18f..edbd350f364 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -180,6 +180,7 @@ static MY_CHARSET_HANDLER my_charset_handler= NULL, my_numchars_8bit, my_charpos_8bit, + my_lengthsp_8bit, my_mb_wc_latin1, my_wc_mb_latin1, my_caseup_str_8bit, diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 8f3e66f782e..ca0097579bd 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -1020,12 +1020,23 @@ uint my_charpos_8bit(CHARSET_INFO *cs __attribute__((unused)), return pos; } +uint my_lengthsp_8bit(CHARSET_INFO *cs __attribute__((unused)), + const char *ptr, uint length) +{ + const char *end= ptr+length; + while (end > ptr && end[-1] == ' ') + end--; + return (uint) (end-ptr); +} + + MY_CHARSET_HANDLER my_charset_8bit_handler= { NULL, /* ismbchar */ NULL, /* mbcharlen */ my_numchars_8bit, my_charpos_8bit, + my_lengthsp_8bit, my_mb_wc_8bit, my_wc_mb_8bit, my_caseup_str_8bit, diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index d8443165462..9827c19e7fb 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -4486,6 +4486,7 @@ static MY_CHARSET_HANDLER my_charset_handler= mbcharlen_sjis, my_numchars_mb, my_charpos_mb, + my_lengthsp_8bit, my_mb_wc_sjis, /* mb_wc */ my_wc_mb_sjis, /* wc_mb */ my_caseup_str_8bit, diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 33bd41f3236..8a6e00b973a 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -719,6 +719,7 @@ static MY_CHARSET_HANDLER my_charset_handler= NULL, /* mbcharlen */ my_numchars_8bit, my_charpos_8bit, + my_lengthsp_8bit, my_mb_wc_8bit, /* mb_wc */ my_wc_mb_8bit, /* wc_mb */ my_caseup_str_8bit, diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 6c0cfd3e874..a20502c65d4 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -1001,6 +1001,24 @@ uint my_charpos_ucs2(CHARSET_INFO *cs __attribute__((unused)), return pos*2; } +static +void my_fill_ucs2(CHARSET_INFO *cs __attribute__((unused)), + char *s, uint l, int fill) +{ + for ( ; l >= 2; s[0]= 0, s[1]= fill, s+=2, l-=2); +} + +static +uint my_lengthsp_ucs2(CHARSET_INFO *cs __attribute__((unused)), + const char *ptr, uint length) +{ + const char *end= ptr+length; + while (end > ptr+1 && end[-1] == ' ' && end[-2] == '\0') + end-=2; + return (uint) (end-ptr); +} + + static MY_COLLATION_HANDLER my_collation_ci_handler = { @@ -1019,6 +1037,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_mbcharlen_ucs2, /* mbcharlen */ my_numchars_ucs2, my_charpos_ucs2, + my_lengthsp_ucs2, my_ucs2_uni, /* mb_wc */ my_uni_ucs2, /* wc_mb */ my_caseup_str_ucs2, @@ -1028,7 +1047,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_snprintf_ucs2, my_l10tostr_ucs2, my_ll10tostr_ucs2, - my_fill_8bit, + my_fill_ucs2, my_strntol_ucs2, my_strntoul_ucs2, my_strntoll_ucs2, diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index c6cf6ff79ba..5ef6c1b7486 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -8443,6 +8443,7 @@ static MY_CHARSET_HANDLER my_charset_handler= mbcharlen_ujis, my_numchars_mb, my_charpos_mb, + my_lengthsp_8bit, my_mb_wc_euc_jp, /* mb_wc */ my_wc_mb_euc_jp, /* wc_mb */ my_caseup_str_mb, diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 4ac397c4c48..450c2d7aa93 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1968,6 +1968,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_mbcharlen_utf8, my_numchars_mb, my_charpos_mb, + my_lengthsp_8bit, my_utf8_uni, my_uni_utf8, my_caseup_str_utf8,