diff --git a/mysql-test/r/cast.result b/mysql-test/r/cast.result
index c60d8e19fb4e7794b0854c984e371a93b8ae2cbf..877a349d1881f020a02d314ba861a8b7a6a0baf1 100644
--- a/mysql-test/r/cast.result
+++ b/mysql-test/r/cast.result
@@ -64,12 +64,6 @@ test
 select cast(_koi8r'ÔÅÓÔ' as char character set cp1251);
 cast(_koi8r'ÔÅÓÔ' as char character set cp1251)
 ōåņō
-select convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci");
-convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci")
-test
-select convert(_koi8r'ÔÅÓÔ', "koi8r_general_ci", "cp1251_general_ci");
-convert(_koi8r'ÔÅÓÔ', "koi8r_general_ci", "cp1251_general_ci")
-ōåņō
 create table t1 select cast(_koi8r'ÔÅÓÔ' as char character set cp1251) as t;
 show create table t1;
 Table	Create Table
diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result
index 173d41ecdd16219a6e5c615fb1a7c0046224ab5e..8bfc6e98226a076a3779597a1923318212eb6d6a 100644
--- a/mysql-test/r/ctype_many.result
+++ b/mysql-test/r/ctype_many.result
@@ -340,129 +340,6 @@ CYR CAPIT SOFT SIGN	
 CYR CAPIT E	ü	ü
 CYR CAPIT YU	ā	ā
 CYR CAPIT YA	ņ	ņ
-select CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci'), comment from t1;
-CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci')	comment
-a	LAT SMALL A
-b	LAT SMALL B
-c	LAT SMALL C
-d	LAT SMALL D
-e	LAT SMALL E
-f	LAT SMALL F
-g	LAT SMALL G
-h	LAT SMALL H
-i	LAT SMALL I
-j	LAT SMALL J
-k	LAT SMALL K
-l	LAT SMALL L
-m	LAT SMALL M
-n	LAT SMALL N
-o	LAT SMALL O
-p	LAT SMALL P
-q	LAT SMALL Q
-r	LAT SMALL R
-s	LAT SMALL S
-t	LAT SMALL T
-u	LAT SMALL U
-v	LAT SMALL V
-w	LAT SMALL W
-x	LAT SMALL X
-y	LAT SMALL Y
-z	LAT SMALL Z
-A	LAT CAPIT A
-B	LAT CAPIT B
-C	LAT CAPIT C
-D	LAT CAPIT D
-E	LAT CAPIT E
-F	LAT CAPIT F
-G	LAT CAPIT G
-H	LAT CAPIT H
-I	LAT CAPIT I
-J	LAT CAPIT J
-K	LAT CAPIT K
-L	LAT CAPIT L
-M	LAT CAPIT M
-N	LAT CAPIT N
-O	LAT CAPIT O
-P	LAT CAPIT P
-Q	LAT CAPIT Q
-R	LAT CAPIT R
-S	LAT CAPIT S
-T	LAT CAPIT T
-U	LAT CAPIT U
-V	LAT CAPIT V
-W	LAT CAPIT W
-X	LAT CAPIT X
-Y	LAT CAPIT Y
-Z	LAT CAPIT Z
-â	CYR SMALL A
-ũ	CYR SMALL BE
-þ	CYR SMALL VE
-ú	CYR SMALL GE
-ä	CYR SMALL DE
-å	CYR SMALL IE
-?	CYR SMALL IO
-ã	CYR SMALL ZHE
-ĸ	CYR SMALL ZE
-ę	CYR SMALL I
-ė	CYR SMALL KA
-í	CYR SMALL EL
-î	CYR SMALL EM
-ï	CYR SMALL EN
-ð	CYR SMALL O
-ō	CYR SMALL PE
-ô	CYR SMALL ER
-õ	CYR SMALL ES
-æ	CYR SMALL TE
-č	CYR SMALL U
-ö	CYR SMALL EF
-é	CYR SMALL HA
-į	CYR SMALL TSE
-ā	CYR SMALL CHE
-ų	CYR SMALL SHA
-ü	CYR SMALL SCHA
-ņ	CYR SMALL HARD SIGN
-ý	CYR SMALL YERU
-û	CYR SMALL SOFT SIGN
-ø	CYR SMALL E
-á	CYR SMALL YU
-ó	CYR SMALL YA
-Â	CYR CAPIT A
-Ũ	CYR CAPIT BE
-Þ	CYR CAPIT VE
-Ú	CYR CAPIT GE
-Ä	CYR CAPIT DE
-Å	CYR CAPIT IE
-?	CYR CAPIT IO
-Ã	CYR CAPIT ZHE
-ß	CYR CAPIT ZE
-Ę	CYR CAPIT I
-Ė	CYR CAPIT KA
-Í	CYR CAPIT EL
-Î	CYR CAPIT EM
-Ï	CYR CAPIT EN
-Ð	CYR CAPIT O
-Ō	CYR CAPIT PE
-Ô	CYR CAPIT ER
-Õ	CYR CAPIT ES
-Æ	CYR CAPIT TE
-Č	CYR CAPIT U
-Ö	CYR CAPIT EF
-É	CYR CAPIT HA
-Į	CYR CAPIT TSE
-Ā	CYR CAPIT CHE
-Ų	CYR CAPIT SHA
-Ü	CYR CAPIT SCHA
-Ņ	CYR CAPIT HARD SIGN
-Ý	CYR CAPIT YERU
-Û	CYR CAPIT SOFT SIGN
-Ø	CYR CAPIT E
-Á	CYR CAPIT YU
-Ó	CYR CAPIT YA
-explain extended select CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci'), comment from t1;
-id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
-1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	116	
-Warnings:
-Note	1003	select high_priority convert(test.t1.koi8_ru_f,_latin1'utf8_general_ci',_latin1'cp1251_general_ci') AS `CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci')`,test.t1.comment AS `comment` from test.t1
 ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL;
 UPDATE t1 SET bin_f=koi8_ru_f;
 SELECT COUNT(DISTINCT bin_f),COUNT(DISTINCT koi8_ru_f),COUNT(DISTINCT utf8_f) FROM t1;
diff --git a/mysql-test/r/func_system.result b/mysql-test/r/func_system.result
index a0437ca1c56d22848f8cb0030fbc6656d66723bb..338902e3f3a9557803c4452e2aa23da4e43300fd 100644
--- a/mysql-test/r/func_system.result
+++ b/mysql-test/r/func_system.result
@@ -51,6 +51,20 @@ t1	CREATE TABLE `t1` (
   `version` char(40) default NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 drop table t1;
+select charset(charset(_utf8'a')), charset(collation(_utf8'a'));
+charset(charset(_utf8'a'))	charset(collation(_utf8'a'))
+utf8	utf8
+select collation(charset(_utf8'a')), collation(collation(_utf8'a'));
+collation(charset(_utf8'a'))	collation(collation(_utf8'a'))
+utf8_general_ci	utf8_general_ci
+create table t1 select charset(_utf8'a'), collation(_utf8'a');
+show create table t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `charset(_utf8'a')` char(64) character set utf8 NOT NULL default '',
+  `collation(_utf8'a')` char(64) character set utf8 NOT NULL default ''
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+drop table t1;
 select TRUE,FALSE,NULL;
 TRUE	FALSE	NULL
 1	0	NULL
diff --git a/mysql-test/t/cast.test b/mysql-test/t/cast.test
index ab0242990fc783dad4073e6c18d07f5246d854e9..fab35bb334a5f6507e7e9a1b050185c2e9a89ab9 100644
--- a/mysql-test/t/cast.test
+++ b/mysql-test/t/cast.test
@@ -28,8 +28,6 @@ select CAST(DATE "2004-01-22 21:45:33" AS CHAR(4) BINARY);
 set names binary;
 select cast(_latin1'test' as char character set latin2);
 select cast(_koi8r'ÔÅÓÔ' as char character set cp1251);
-select convert(_latin1'test', "latin1_german1_ci", "latin1_swedish_ci");
-select convert(_koi8r'ÔÅÓÔ', "koi8r_general_ci", "cp1251_general_ci");
 create table t1 select cast(_koi8r'ÔÅÓÔ' as char character set cp1251) as t;
 show create table t1;
 drop table t1;
diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test
index 7b44439aa5049b3b8ed7dea1878e96e533b338f5..26057e7c9973016e3fc946b0d7f496a044bc8bc9 100644
--- a/mysql-test/t/ctype_many.test
+++ b/mysql-test/t/ctype_many.test
@@ -147,11 +147,6 @@ UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8);
 SET CHARACTER SET koi8r;
 SELECT * FROM t1;
 
-#
-# codecovarage for Item_func_conv_charset3
-#
-select CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci'), comment from t1;
-explain extended select CONVERT(koi8_ru_f, 'cp1251_general_ci', 'utf8_general_ci'), comment from t1;
 
 ALTER TABLE t1 ADD bin_f CHAR(32) BYTE NOT NULL;
 UPDATE t1 SET bin_f=koi8_ru_f;
diff --git a/mysql-test/t/func_system.test b/mysql-test/t/func_system.test
index f3b9b4ffc3f62a83293de3a5b26c68e5201b4450..a05b80ca56b6cede21c6446c2fbafa4997579663 100644
--- a/mysql-test/t/func_system.test
+++ b/mysql-test/t/func_system.test
@@ -23,4 +23,10 @@ create table t1 (version char(40)) select database(), user(), version() as 'vers
 show create table t1;
 drop table t1;
 
+select charset(charset(_utf8'a')), charset(collation(_utf8'a'));
+select collation(charset(_utf8'a')), collation(collation(_utf8'a'));
+create table t1 select charset(_utf8'a'), collation(_utf8'a');
+show create table t1;
+drop table t1;
+
 select TRUE,FALSE,NULL;
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index fd1222d5f1a01da313a0c1f20a1bc26f8942bf33..ed6e44262c7d8b016cb358a294e8f3d054cf51f4 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -2124,42 +2124,6 @@ void Item_func_conv_charset::print(String *str)
   str->append(')');
 }
 
-String *Item_func_conv_charset3::val_str(String *str)
-{
-  char cs1[30], cs2[30];
-  String to_cs_buff(cs1, sizeof(cs1), default_charset_info);
-  String from_cs_buff(cs2, sizeof(cs2), default_charset_info);
-  String *arg= args[0]->val_str(str);
-  String *to_cs= args[1]->val_str(&to_cs_buff);
-  String *from_cs= args[2]->val_str(&from_cs_buff);
-  CHARSET_INFO *from_charset;
-  CHARSET_INFO *to_charset;
-
-  if (!arg     || args[0]->null_value ||
-      !to_cs   || args[1]->null_value ||
-      !from_cs || args[2]->null_value ||
-      !(from_charset=get_charset_by_name(from_cs->ptr(), MYF(MY_WME))) ||
-      !(to_charset=get_charset_by_name(to_cs->ptr(), MYF(MY_WME))))
-  {
-    null_value= 1;
-    return 0;
-  }
-
-  if (str_value.copy(arg->ptr(), arg->length(), from_charset, to_charset))
-  {
-    null_value= 1;
-    return 0;
-  }
-  null_value= 0;
-  return &str_value;
-}
-
-
-void Item_func_conv_charset3::fix_length_and_dec()
-{
-  max_length = args[0]->max_length;
-}
-
 String *Item_func_set_collation::val_str(String *str)
 {
   str=args[0]->val_str(str);
@@ -2226,7 +2190,7 @@ String *Item_func_charset::val_str(String *str)
   if ((null_value=(args[0]->null_value || !res->charset())))
     return 0;
   str->copy(res->charset()->csname,strlen(res->charset()->csname),
-	    &my_charset_latin1, default_charset());
+	    &my_charset_latin1, collation.collation);
   return str;
 }
 
@@ -2237,7 +2201,7 @@ String *Item_func_collation::val_str(String *str)
   if ((null_value=(args[0]->null_value || !res->charset())))
     return 0;
   str->copy(res->charset()->name,strlen(res->charset()->name),
-	    &my_charset_latin1, default_charset());
+	    &my_charset_latin1, collation.collation);
   return str;
 }
 
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index 465300e721ee5e46191dad82d8a1371332f03a0b..4832ddbd1b1c40745c4a3086c3f0a7bb3cbe99c3 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -619,16 +619,6 @@ class Item_func_set_collation :public Item_str_func
   void print(String *str) { print_op(str); }
 };
 
-class Item_func_conv_charset3 :public Item_str_func
-{
-public:
-  Item_func_conv_charset3(Item *arg1,Item *arg2,Item *arg3)
-    :Item_str_func(arg1,arg2,arg3) {}
-  String *val_str(String *);
-  void fix_length_and_dec();
-  const char *func_name() const { return "convert"; }
-};
-
 class Item_func_charset :public Item_str_func
 {
 public:
@@ -637,8 +627,8 @@ class Item_func_charset :public Item_str_func
   const char *func_name() const { return "charset"; }
   void fix_length_and_dec() 
   {
-     max_length=40; // should be enough
      collation.set(system_charset_info);
+     max_length= 64 * collation.collation->mbmaxlen; // should be enough
   };
 };
 
@@ -650,8 +640,8 @@ class Item_func_collation :public Item_str_func
   const char *func_name() const { return "collation"; }
   void fix_length_and_dec()
   {
-     max_length=40; // should be enough
      collation.set(system_charset_info);
+     max_length= 64 * collation.collation->mbmaxlen; // should be enough
   };
 };
 
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 0dbe89814663b5cd6227a5eb66e4678086b00dd9..bdeaf5a0b8610291e7ad5d9c1dbdbf3d350b2c9c 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -2574,8 +2574,6 @@ simple_expr:
 	  }
 	| CONVERT_SYM '(' expr USING charset_name ')'
 	  { $$= new Item_func_conv_charset($3,$5); }
-	| CONVERT_SYM '(' expr ',' expr ',' expr ')'
-	  { $$= new Item_func_conv_charset3($3,$7,$5); }
 	| DEFAULT '(' simple_ident ')'
 	  { $$= new Item_default_value($3); }
 	| VALUES '(' simple_ident ')'