Bug#45168: assertion with convert() and empty set value
The assertion in String::copy was added in order to avoid valgrind errors when the destination was the same as the source. Eased restriction to allow for the case when str == NULL.
This commit is contained in:
parent
eecf06873e
commit
acc642c87c
@ -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;
|
|||||||
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)
|
|||||||
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,
|
|||||||
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))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user