Commit 37b2b7fa authored by Martin Hansson's avatar Martin Hansson

Merge

parents ac47882b aa8677bc
...@@ -146,3 +146,16 @@ NULL ...@@ -146,3 +146,16 @@ NULL
0 0
0 0
drop table t1; drop table t1;
CREATE TABLE t1( a SET('a', 'b', 'c') );
CREATE TABLE t2( a SET('a', 'b', 'c') );
INSERT INTO t1 VALUES ('d');
Warnings:
Warning 1265 Data truncated for column 'a' at row 1
INSERT INTO t2 VALUES ('');
SELECT CONVERT( a USING latin1 ) FROM t1;
CONVERT( a USING latin1 )
SELECT CONVERT( a USING latin1 ) FROM t2;
CONVERT( a USING latin1 )
DROP TABLE t1, t2;
...@@ -84,3 +84,16 @@ engine=myisam default charset=latin1; ...@@ -84,3 +84,16 @@ engine=myisam default charset=latin1;
insert into t1 values (''),(null),(null),(''),(''),(''); insert into t1 values (''),(null),(null),(''),(''),('');
select find_in_set(f1,f1) as a from t1,(select find_in_set(f1,f1) as b from t1) a; select find_in_set(f1,f1) as a from t1,(select find_in_set(f1,f1) as b from t1) a;
drop table t1; drop table t1;
#
# Bug#45168: assertion with convert() and empty set value
#
CREATE TABLE t1( a SET('a', 'b', 'c') );
CREATE TABLE t2( a SET('a', 'b', 'c') );
INSERT INTO t1 VALUES ('d');
INSERT INTO t2 VALUES ('');
SELECT CONVERT( a USING latin1 ) FROM t1;
SELECT CONVERT( a USING latin1 ) FROM t2;
DROP TABLE t1, t2;
...@@ -2710,13 +2710,12 @@ String *Item_func_conv_charset::val_str(String *str) ...@@ -2710,13 +2710,12 @@ String *Item_func_conv_charset::val_str(String *str)
return null_value ? 0 : &str_value; return null_value ? 0 : &str_value;
/* /*
Here we don't pass 'str' as a parameter to args[0]->val_str() Here we don't pass 'str' as a parameter to args[0]->val_str()
as 'str' may points to 'str_value' (e.g. see Item::save_in_field()), as 'str' may point to 'str_value' (e.g. see Item::save_in_field()),
which we use below to convert string. which we use below to convert string.
Use argument's 'str_value' instead. Use argument's 'str_value' instead.
*/ */
String *arg= args[0]->val_str(&args[0]->str_value);; String *arg= args[0]->val_str(&args[0]->str_value);
uint dummy_errors; uint dummy_errors;
arg= args[0]->val_str(&args[0]->str_value);
if (!arg) if (!arg)
{ {
null_value=1; null_value=1;
......
...@@ -322,14 +322,23 @@ bool String::set_or_copy_aligned(const char *str,uint32 arg_length, ...@@ -322,14 +322,23 @@ bool String::set_or_copy_aligned(const char *str,uint32 arg_length,
return copy_aligned(str, arg_length, offset, cs); return copy_aligned(str, arg_length, offset, cs);
} }
/* Copy with charset conversion */
/**
Copies the character data into this String, with optional character set
conversion.
@return
FALSE ok
TRUE Could not allocate result buffer
*/
bool String::copy(const char *str, uint32 arg_length, bool String::copy(const char *str, uint32 arg_length,
CHARSET_INFO *from_cs, CHARSET_INFO *to_cs, uint *errors) CHARSET_INFO *from_cs, CHARSET_INFO *to_cs, uint *errors)
{ {
uint32 offset; uint32 offset;
DBUG_ASSERT(str != Ptr); DBUG_ASSERT(!str || str != Ptr);
if (!needs_conversion(arg_length, from_cs, to_cs, &offset)) if (!needs_conversion(arg_length, from_cs, to_cs, &offset))
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment