Commit 22103951 authored by unknown's avatar unknown

ctype_utf8.result, ctype_utf8.test:

  New syntax: CHAR(x USING charset)
  Adding test case.
sql_yacc.yy:
  New syntax: CHAR(x USING charset)
  Adding new parser rule.
item_strfunc.h:
  New syntax: CHAR(x USING charset)
  Adding a new constructor.


sql/item_strfunc.h:
  New syntax: CHAR(x USING charset)
  Adding a new constructor.
sql/sql_yacc.yy:
  New syntax: CHAR(x USING charset)
  Adding new parser rule.
mysql-test/t/ctype_utf8.test:
  New syntax: CHAR(x USING charset)
  Adding test case.
mysql-test/r/ctype_utf8.result:
  New syntax: CHAR(x USING charset)
  Adding test case.
parent 8d9c66a5
...@@ -1064,46 +1064,56 @@ xxx ...@@ -1064,46 +1064,56 @@ xxx
yyy yyy
DROP TABLE t1; DROP TABLE t1;
set names utf8; set names utf8;
select hex(char(1)); select hex(char(1 using utf8));
hex(char(1)) hex(char(1 using utf8))
01 01
select char(0xd1,0x8f); select char(0xd1,0x8f using utf8);
char(0xd1,0x8f) char(0xd1,0x8f using utf8)
я я
select char(0xd18f); select char(0xd18f using utf8);
char(0xd18f) char(0xd18f using utf8)
я я
select char(53647); select char(53647 using utf8);
char(53647) char(53647 using utf8)
я я
select char(0xff,0x8f); select char(0xff,0x8f using utf8);
char(0xff,0x8f) char(0xff,0x8f using utf8)
Warnings:
Warning 1300 Invalid utf8 character string: 'FF8F'
set sql_mode=traditional; set sql_mode=traditional;
select char(0xff,0x8f); select char(0xff,0x8f using utf8);
char(0xff,0x8f) char(0xff,0x8f using utf8)
NULL
select convert(char(0xff,0x8f) using utf8); Warnings:
convert(char(0xff,0x8f) using utf8) Error 1300 Invalid utf8 character string: 'FF8F'
select char(195 using utf8);
select char(195); char(195 using utf8)
char(195) NULL
Warnings:
select convert(char(195) using utf8); Error 1300 Invalid utf8 character string: 'C3'
convert(char(195) using utf8) select char(196 using utf8);
char(196 using utf8)
select char(196); NULL
char(196) Warnings:
Error 1300 Invalid utf8 character string: 'C4'
select convert(char(196) using utf8); select char(2557 using utf8);
convert(char(196) using utf8) char(2557 using utf8)
NULL
Warnings:
Error 1300 Invalid utf8 character string: 'FD'
select hex(convert(char(2557 using latin1) using utf8));
hex(convert(char(2557 using latin1) using utf8))
09C3BD
select hex(char(195));
hex(char(195))
C3
select hex(char(196));
hex(char(196))
C4
select hex(char(2557)); select hex(char(2557));
hex(char(2557)) hex(char(2557))
09FD 09FD
select hex(convert(char(2557) using utf8));
hex(convert(char(2557) using utf8))
09FD
set names utf8; set names utf8;
create table t1 (a char(1)) default character set utf8; create table t1 (a char(1)) default character set utf8;
create table t2 (a char(1)) default character set utf8; create table t2 (a char(1)) default character set utf8;
......
...@@ -871,22 +871,32 @@ DROP TABLE t1; ...@@ -871,22 +871,32 @@ DROP TABLE t1;
# #
set names utf8; set names utf8;
# correct value # correct value
select hex(char(1)); select hex(char(1 using utf8));
select char(0xd1,0x8f); select char(0xd1,0x8f using utf8);
select char(0xd18f); select char(0xd18f using utf8);
select char(53647); select char(53647 using utf8);
# incorrect value: return with warning # incorrect value: return with warning
select char(0xff,0x8f); select char(0xff,0x8f using utf8);
# incorrect value in strict mode: return NULL with "Error" level warning # incorrect value in strict mode: return NULL with "Error" level warning
set sql_mode=traditional; set sql_mode=traditional;
select char(0xff,0x8f); select char(0xff,0x8f using utf8);
select convert(char(0xff,0x8f) using utf8); select char(195 using utf8);
select char(195); select char(196 using utf8);
select convert(char(195) using utf8); select char(2557 using utf8);
select char(196);
select convert(char(196) using utf8); #
# Check convert + char + using
#
select hex(convert(char(2557 using latin1) using utf8));
#
# char() without USING returns "binary" by default, any argument is ok
#
select hex(char(195));
select hex(char(196));
select hex(char(2557)); select hex(char(2557));
select hex(convert(char(2557) using utf8));
# #
# Bug#12891: UNION doesn't return DISTINCT result for multi-byte characters # Bug#12891: UNION doesn't return DISTINCT result for multi-byte characters
......
...@@ -480,12 +480,15 @@ public: ...@@ -480,12 +480,15 @@ public:
class Item_func_char :public Item_str_func class Item_func_char :public Item_str_func
{ {
public: public:
Item_func_char(List<Item> &list) :Item_str_func(list) {} Item_func_char(List<Item> &list) :Item_str_func(list)
{ collation.set(&my_charset_bin); }
Item_func_char(List<Item> &list, CHARSET_INFO *cs) :Item_str_func(list)
{ collation.set(cs); }
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec() void fix_length_and_dec()
{ {
collation.set(&my_charset_bin); maybe_null=0;
maybe_null=0; max_length=arg_count; max_length=arg_count * collation.collation->mbmaxlen;
} }
const char *func_name() const { return "char"; } const char *func_name() const { return "char"; }
}; };
......
...@@ -4536,6 +4536,8 @@ simple_expr: ...@@ -4536,6 +4536,8 @@ simple_expr:
{ $$= new Item_func_atan($3,$5); } { $$= new Item_func_atan($3,$5); }
| CHAR_SYM '(' expr_list ')' | CHAR_SYM '(' expr_list ')'
{ $$= new Item_func_char(*$3); } { $$= new Item_func_char(*$3); }
| CHAR_SYM '(' expr_list USING charset_name ')'
{ $$= new Item_func_char(*$3, $5); }
| CHARSET '(' expr ')' | CHARSET '(' expr ')'
{ $$= new Item_func_charset($3); } { $$= new Item_func_charset($3); }
| COALESCE '(' expr_list ')' | COALESCE '(' expr_list ')'
......
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