diff options
author | unknown <bar@mysql.com> | 2005-01-27 14:51:16 +0400 |
---|---|---|
committer | unknown <bar@mysql.com> | 2005-01-27 14:51:16 +0400 |
commit | 199a139da1cbbb8846c21e634fb9e4242372b67c (patch) | |
tree | f4555a1ceff5f9fa9d9d5dc151efad4d1e09ef0a /sql/item_timefunc.cc | |
parent | 513a70a34bbd650a6f4e4194934a6abcafee863d (diff) | |
download | mariadb-git-199a139da1cbbb8846c21e634fb9e4242372b67c.tar.gz |
item_timefunc.cc:
CAST now always return a well-formed character string.
sql/item_timefunc.cc:
CAST now always return a well-formed character string.
Diffstat (limited to 'sql/item_timefunc.cc')
-rw-r--r-- | sql/item_timefunc.cc | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 39c88c8b0a3..bc80131e4ad 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -2115,7 +2115,6 @@ String *Item_char_typecast::val_str(String *str) String *res; uint32 length; -#if 0 if (!charset_conversion) { if (!(res= args[0]->val_str(str))) @@ -2125,7 +2124,6 @@ String *Item_char_typecast::val_str(String *str) } } else -#endif { // Convert character set if differ uint dummy_errors; @@ -2163,9 +2161,18 @@ String *Item_char_typecast::val_str(String *str) void Item_char_typecast::fix_length_and_dec() { uint32 char_length; - charset_conversion= !my_charset_same(args[0]->collation.collation, cast_cs) && - args[0]->collation.collation != &my_charset_bin && - cast_cs != &my_charset_bin; + /* + We always force character set conversion if cast_cs + is a multi-byte character set. It garantees that the + result of CAST is a well-formed string. + For single-byte character sets we allow just to copy + from the argument. A single-byte character sets string + is always well-formed. + */ + charset_conversion= (cast_cs->mbmaxlen > 1) || + !my_charset_same(args[0]->collation.collation, cast_cs) && + args[0]->collation.collation != &my_charset_bin && + cast_cs != &my_charset_bin; collation.set(cast_cs, DERIVATION_IMPLICIT); char_length= (cast_length >= 0) ? cast_length : args[0]->max_length/args[0]->collation.collation->mbmaxlen; |