Bug#45263 utf32_general_ci, bad effects around CREATE TABLE AS SELECT
Problem: Item_func_hex::val_str() returned data in ASCII format, which did not match collation.collation pointing to my_charset_utf32_general_ci. Fix: changing parent class of Item_func_hex to Item_str_ascii_func, as val_str() implementation is heavily ASCII-oriented. mysql-test/r/ctype_utf32.result mysql-test/t/ctype_utf32.test Adding test case sql/item_strfunc.cc sql/item_strfunc.h - Changing parent class to Item_str_ascii_func - Clean-up in Item_func_hex::fix_length_and_dec() Using fix_char_length() instead of setting max_length directly.
This commit is contained in:
parent
d3b7cd3ff2
commit
cdce606121
@ -1091,5 +1091,14 @@ t2 CREATE TABLE `t2` (
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# Bug#45263 utf32_general_ci, bad effects around CREATE TABLE AS SELECT
|
||||
#
|
||||
SET collation_connection=utf32_general_ci;
|
||||
CREATE TABLE t1 AS SELECT HEX(0x00) AS my_col;
|
||||
SELECT * FROM t1;
|
||||
my_col
|
||||
00
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
@ -800,6 +800,15 @@ CREATE TABLE t2 AS SELECT CONCAT(s1) FROM t1;
|
||||
SHOW CREATE TABLE t2;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#45263 utf32_general_ci, bad effects around CREATE TABLE AS SELECT
|
||||
--echo #
|
||||
SET collation_connection=utf32_general_ci;
|
||||
CREATE TABLE t1 AS SELECT HEX(0x00) AS my_col;
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
@ -3081,7 +3081,7 @@ String *Item_func_collation::val_str(String *str)
|
||||
}
|
||||
|
||||
|
||||
String *Item_func_hex::val_str(String *str)
|
||||
String *Item_func_hex::val_str_ascii(String *str)
|
||||
{
|
||||
String *res;
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
@ -3120,6 +3120,7 @@ String *Item_func_hex::val_str(String *str)
|
||||
}
|
||||
null_value=0;
|
||||
tmp_value.length(res->length()*2);
|
||||
tmp_value.set_charset(&my_charset_latin1);
|
||||
|
||||
octet2hex((char*) tmp_value.ptr(), res->ptr(), res->length());
|
||||
return &tmp_value;
|
||||
|
@ -622,18 +622,18 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class Item_func_hex :public Item_str_func
|
||||
class Item_func_hex :public Item_str_ascii_func
|
||||
{
|
||||
String tmp_value;
|
||||
public:
|
||||
Item_func_hex(Item *a) :Item_str_func(a) {}
|
||||
Item_func_hex(Item *a) :Item_str_ascii_func(a) {}
|
||||
const char *func_name() const { return "hex"; }
|
||||
String *val_str(String *);
|
||||
String *val_str_ascii(String *);
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
collation.set(default_charset());
|
||||
decimals=0;
|
||||
max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
|
||||
fix_char_length(args[0]->max_length * 2);
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user