Below is the list of changes that have just been committed into a local
5.0 repository of bar. When bar does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2161 06/04/17 15:01:55 bar@stripped +4 -0
Merge mysql.com:/usr/home/bar/mysql-4.1.b18691
into mysql.com:/usr/home/bar/mysql-5.0
sql/item_timefunc.cc
1.106 06/04/17 15:01:44 bar@stripped +9 -11
After merge fix
sql/item_timefunc.h
1.65 06/04/17 14:57:03 bar@stripped +0 -0
Auto merged
mysql-test/t/ctype_ucs.test
1.41 06/04/17 14:57:02 bar@stripped +0 -0
Auto merged
mysql-test/r/ctype_ucs.result
1.43 06/04/17 14:57:02 bar@stripped +0 -0
Auto merged
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: bar
# Host: bar.intranet.mysql.r18.ru
# Root: /usr/home/bar/mysql-5.0/RESYNC
--- 1.105/sql/item_timefunc.cc 2006-04-11 16:13:48 +05:00
+++ 1.106/sql/item_timefunc.cc 2006-04-17 15:01:44 +05:00
@@ -2378,8 +2378,8 @@ String *Item_char_typecast::val_str(Stri
// Convert character set if differ
uint dummy_errors;
if (!(res= args[0]->val_str(&tmp_value)) ||
- str->copy(res->ptr(), res->length(), res->charset(),
- cast_cs, &dummy_errors))
+ str->copy(res->ptr(), res->length(), from_cs,
+ cast_cs, &dummy_errors))
{
null_value= 1;
return 0;
@@ -2434,21 +2434,39 @@ String *Item_char_typecast::val_str(Stri
void Item_char_typecast::fix_length_and_dec()
{
uint32 char_length;
- /*
- 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.
+ /*
+ 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.
+
+ There is a special trick to convert form a number to ucs2.
+ As numbers have my_charset_bin as their character set,
+ it wouldn't do conversion to ucs2 without an additional action.
+ To force conversion, we should pretend to be non-binary.
+ Let's choose from_cs this way:
+ - If the argument in a number and cast_cs is ucs2 (i.e. mbminlen > 1),
+ then from_cs is set to latin1, to perform latin1 -> ucs2 conversion.
+ - If the argument is a number and cast_cs is ASCII-compatible
+ (i.e. mbminlen == 1), then from_cs is set to cast_cs,
+ which allows just to take over the args[0]->val_str() result
+ and thus avoid unnecessary character set conversion.
+ - If the argument is not a number, then from_cs is set to
+ the argument's charset.
*/
- 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);
+ from_cs= (args[0]->result_type() == INT_RESULT ||
+ args[0]->result_type() == REAL_RESULT) ?
+ (cast_cs->mbminlen == 1 ? cast_cs : &my_charset_latin1) :
+ args[0]->collation.collation;
+ charset_conversion= (cast_cs->mbmaxlen > 1) ||
+ !my_charset_same(from_cs, cast_cs) &&
+ from_cs != &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;
+ args[0]->max_length/from_cs->mbmaxlen;
max_length= char_length * cast_cs->mbmaxlen;
}
--- 1.64/sql/item_timefunc.h 2006-04-11 16:13:48 +05:00
+++ 1.65/sql/item_timefunc.h 2006-04-17 14:57:03 +05:00
@@ -717,7 +717,7 @@ public:
class Item_char_typecast :public Item_typecast
{
int cast_length;
- CHARSET_INFO *cast_cs;
+ CHARSET_INFO *cast_cs, *from_cs;
bool charset_conversion;
String tmp_value;
public:
--- 1.42/mysql-test/r/ctype_ucs.result 2006-04-07 12:32:18 +05:00
+++ 1.43/mysql-test/r/ctype_ucs.result 2006-04-17 14:57:02 +05:00
@@ -674,6 +674,18 @@ Warnings:
Warning 1264 Out of range value adjusted for column 'Field1' at row 1
DROP TABLE t1;
SET NAMES latin1;
+SELECT CONVERT(103, CHAR(50) UNICODE);
+CONVERT(103, CHAR(50) UNICODE)
+103
+SELECT CONVERT(103.0, CHAR(50) UNICODE);
+CONVERT(103.0, CHAR(50) UNICODE)
+103.0
+SELECT CONVERT(-103, CHAR(50) UNICODE);
+CONVERT(-103, CHAR(50) UNICODE)
+-103
+SELECT CONVERT(-103.0, CHAR(50) UNICODE);
+CONVERT(-103.0, CHAR(50) UNICODE)
+-103.0
CREATE TABLE t1 (
a varchar(255) NOT NULL default '',
KEY a (a)
--- 1.40/mysql-test/t/ctype_ucs.test 2006-04-07 12:32:18 +05:00
+++ 1.41/mysql-test/t/ctype_ucs.test 2006-04-17 14:57:02 +05:00
@@ -410,6 +410,14 @@ DROP TABLE t1;
SET NAMES latin1;
#
+# Bug#18691 Converting number to UNICODE string returns invalid result
+#
+SELECT CONVERT(103, CHAR(50) UNICODE);
+SELECT CONVERT(103.0, CHAR(50) UNICODE);
+SELECT CONVERT(-103, CHAR(50) UNICODE);
+SELECT CONVERT(-103.0, CHAR(50) UNICODE);
+
+#
# Bug#9557 MyISAM utf8 table crash
#
CREATE TABLE t1 (
| Thread |
|---|
| • bk commit into 5.0 tree (bar:1.2161) | bar | 17 Apr |