summaryrefslogtreecommitdiff
path: root/sql/item_timefunc.cc
diff options
context:
space:
mode:
authorunknown <bar@mysql.com>2005-01-27 14:51:16 +0400
committerunknown <bar@mysql.com>2005-01-27 14:51:16 +0400
commit199a139da1cbbb8846c21e634fb9e4242372b67c (patch)
treef4555a1ceff5f9fa9d9d5dc151efad4d1e09ef0a /sql/item_timefunc.cc
parent513a70a34bbd650a6f4e4194934a6abcafee863d (diff)
downloadmariadb-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.cc17
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;