From 815c23f1e6431a6e20e8915fa92a71f7a754d5b7 Mon Sep 17 00:00:00 2001
From: unknown <bar@bar.intranet.mysql.r18.ru>
Date: Tue, 6 Apr 2004 19:57:33 +0500
Subject: [PATCH] Fixed charsetnr sent to the client

---
 client/mysqltest.c           |  5 ++-
 mysql-test/r/metadata.result | 70 ++++++++++++++++++------------------
 mysql-test/r/union.result    |  6 ++--
 sql/field.cc                 | 12 +++++++
 sql/protocol.cc              |  5 ++-
 sql/table.cc                 |  1 -
 6 files changed, 58 insertions(+), 41 deletions(-)

diff --git a/client/mysqltest.c b/client/mysqltest.c
index 00165ab4f45..be5dac1c9d9 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -2358,7 +2358,7 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
 
 	if (display_metadata)
 	{
-	  dynstr_append(ds,"Catalog\tDatabase\tTable\tTable_alias\tColumn\tColumn_alias\tName\tType\tLength\tMax length\tIs_null\tFlags\tDecimals\n");
+	  dynstr_append(ds,"Catalog\tDatabase\tTable\tTable_alias\tColumn\tColumn_alias\tName\tType\tLength\tMax length\tIs_null\tFlags\tDecimals\tCharsetnr\n");
 	  for (field= mysql_fetch_fields(res), field_end= field+num_fields ;
 	       field < field_end ;
 	       field++)
@@ -2394,6 +2394,9 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
 	    dynstr_append_mem(ds, "\t", 1);
 	    int10_to_str((int) field->decimals, buff, 10);
 	    dynstr_append(ds, buff);
+	    dynstr_append_mem(ds, "\t", 1);
+	    int10_to_str((int) field->charsetnr, buff, 10);
+	    dynstr_append(ds, buff);
 	    dynstr_append_mem(ds, "\n", 1);
 	  }
 	}
diff --git a/mysql-test/r/metadata.result b/mysql-test/r/metadata.result
index 59914447087..80a01a0ca90 100644
--- a/mysql-test/r/metadata.result
+++ b/mysql-test/r/metadata.result
@@ -1,36 +1,36 @@
 drop table if exists t1,t2;
 select 1, 1.0, -1, "hello", NULL;
-Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals
-def					1	8	1	1	N	32769	0
-def					1.0	5	3	3	N	32769	1
-def					-1	8	1	2	N	32769	0
-def					hello	254	5	5	N	1	31
-def					NULL	6	0	0	Y	32768	0
+Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
+def					1	8	1	1	N	32769	0	8
+def					1.0	5	3	3	N	32769	1	8
+def					-1	8	1	2	N	32769	0	8
+def					hello	254	5	5	N	1	31	8
+def					NULL	6	0	0	Y	32768	0	8
 1	1.0	-1	hello	NULL
 1	1.0	-1	hello	NULL
 create table t1 (a tinyint, b smallint, c mediumint, d int, e bigint, f float(3,2), g double(4,3), h decimal(5,4), i year, j date, k timestamp, l datetime, m enum('a','b'), n set('a','b'), o char(10));
 select * from t1;
-Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals
-def	test	t1	t1	a	a	1	4	0	Y	32768	0
-def	test	t1	t1	b	b	2	6	0	Y	32768	0
-def	test	t1	t1	c	c	9	9	0	Y	32768	0
-def	test	t1	t1	d	d	3	11	0	Y	32768	0
-def	test	t1	t1	e	e	8	20	0	Y	32768	0
-def	test	t1	t1	f	f	4	3	0	Y	32768	2
-def	test	t1	t1	g	g	5	4	0	Y	32768	3
-def	test	t1	t1	h	h	0	7	0	Y	32768	4
-def	test	t1	t1	i	i	13	4	0	Y	32864	0
-def	test	t1	t1	j	j	10	10	0	Y	0	0
-def	test	t1	t1	k	k	7	19	0	N	1089	0
-def	test	t1	t1	l	l	12	19	0	Y	0	0
-def	test	t1	t1	m	m	254	1	0	Y	256	0
-def	test	t1	t1	n	n	254	3	0	Y	2048	0
-def	test	t1	t1	o	o	254	10	0	Y	0	0
+Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
+def	test	t1	t1	a	a	1	4	0	Y	32768	0	63
+def	test	t1	t1	b	b	2	6	0	Y	32768	0	63
+def	test	t1	t1	c	c	9	9	0	Y	32768	0	63
+def	test	t1	t1	d	d	3	11	0	Y	32768	0	63
+def	test	t1	t1	e	e	8	20	0	Y	32768	0	63
+def	test	t1	t1	f	f	4	3	0	Y	32768	2	63
+def	test	t1	t1	g	g	5	4	0	Y	32768	3	63
+def	test	t1	t1	h	h	0	7	0	Y	32768	4	63
+def	test	t1	t1	i	i	13	4	0	Y	32864	0	63
+def	test	t1	t1	j	j	10	10	0	Y	128	0	63
+def	test	t1	t1	k	k	7	19	0	N	1217	0	63
+def	test	t1	t1	l	l	12	19	0	Y	128	0	63
+def	test	t1	t1	m	m	254	1	0	Y	256	0	8
+def	test	t1	t1	n	n	254	3	0	Y	2048	0	8
+def	test	t1	t1	o	o	254	10	0	Y	0	0	8
 a	b	c	d	e	f	g	h	i	j	k	l	m	n	o
 select a b, b c from t1 as t2;
-Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals
-def	test	t1	t2	a	b	1	4	0	Y	32768	0
-def	test	t1	t2	b	c	2	6	0	Y	32768	0
+Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
+def	test	t1	t2	a	b	1	4	0	Y	32768	0	63
+def	test	t1	t2	b	c	2	6	0	Y	32768	0	63
 b	c
 drop table t1;
 CREATE TABLE t1 (id tinyint(3) default NULL, data varchar(255) default NULL);
@@ -38,24 +38,24 @@ INSERT INTO t1 VALUES (1,'male'),(2,'female');
 CREATE TABLE t2 (id tinyint(3) unsigned default NULL, data char(3) default '0');
 INSERT INTO t2 VALUES (1,'yes'),(2,'no');
 select t1.id, t1.data, t2.data from t1, t2 where t1.id = t2.id;
-Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals
-def	test	t1	t1	id	id	1	3	1	Y	32768	0
-def	test	t1	t1	data	data	253	255	6	Y	0	0
-def	test	t2	t2	data	data	254	3	3	Y	0	0
+Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
+def	test	t1	t1	id	id	1	3	1	Y	32768	0	63
+def	test	t1	t1	data	data	253	255	6	Y	0	0	8
+def	test	t2	t2	data	data	254	3	3	Y	0	0	8
 id	data	data
 1	male	yes
 2	female	no
 select t1.id, t1.data, t2.data from t1, t2 where t1.id = t2.id order by t1.id;
-Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals
-def	test	t1	t1	id	id	1	3	1	Y	32768	0
-def	test	t1	t1	data	data	253	255	6	Y	0	0
-def	test	t2	t2	data	data	254	3	3	Y	0	0
+Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
+def	test	t1	t1	id	id	1	3	1	Y	32768	0	63
+def	test	t1	t1	data	data	253	255	6	Y	0	0	8
+def	test	t2	t2	data	data	254	3	3	Y	0	0	8
 id	data	data
 1	male	yes
 2	female	no
 select t1.id from t1 union select t2.id from t2;
-Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals
-def	test	t1	t1	id	id	1	3	1	Y	32768	0
+Catalog	Database	Table	Table_alias	Column	Column_alias	Name	Type	Length	Max length	Is_null	Flags	Decimals	Charsetnr
+def	test	t1	t1	id	id	1	3	1	Y	32768	0	63
 id
 1
 2
diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result
index 8e288f9725f..a39a4e8a85f 100644
--- a/mysql-test/r/union.result
+++ b/mysql-test/r/union.result
@@ -693,7 +693,7 @@ testc
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
-  `dt` char(19) default NULL
+  `dt` binary(19) default NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 drop table t1;
 create table t1 SELECT dt from t2 UNION select sv from t2;
@@ -704,7 +704,7 @@ testv
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
-  `dt` char(19) default NULL
+  `dt` binary(19) default NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 drop table t1;
 create table t1 SELECT sc from t2 UNION select sv from t2;
@@ -726,7 +726,7 @@ tetetetetest
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE `t1` (
-  `dt` longblob
+  `dt` blob
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 drop table t1;
 create table t1 SELECT sv from t2 UNION select b from t2;
diff --git a/sql/field.cc b/sql/field.cc
index 8408bfdf578..30ae20de94b 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5623,6 +5623,18 @@ Field *make_field(char *ptr, uint32 field_length,
     null_pos=0;
     null_bit=0;
   }
+
+  switch (field_type)
+  {
+    case FIELD_TYPE_DATE:
+    case FIELD_TYPE_NEWDATE:
+    case FIELD_TYPE_TIME:
+    case FIELD_TYPE_DATETIME:
+    case FIELD_TYPE_TIMESTAMP:
+      field_charset= &my_charset_bin;
+    default: break;
+  }
+
   if (f_is_alpha(pack_flag))
   {
     if (!f_is_packed(pack_flag))
diff --git a/sql/protocol.cc b/sql/protocol.cc
index 61af6ffceaf..fb4d2a57ab6 100644
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@ -530,7 +530,10 @@ bool Protocol::send_fields(List<Item> *list, uint flag)
       /* Store fixed length fields */
       pos= (char*) local_packet->ptr()+local_packet->length();
       *pos++= 12;				// Length of packed fields
-      int2store(pos, field.charsetnr);
+      if (item->collation.collation == &my_charset_bin || thd_charset == NULL)
+        int2store(pos, field.charsetnr);
+      else
+        int2store(pos, thd_charset->number);      
       int4store(pos+2, field.length);
       pos[6]= field.type;
       int2store(pos+7,field.flags);
diff --git a/sql/table.cc b/sql/table.cc
index b25517bce10..23d99466a83 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -465,7 +465,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
       goto err_not_open;			/* purecov: inspected */
     }
     reg_field->comment=comment;
-    reg_field->set_charset(charset);
     if (!(reg_field->flags & NOT_NULL_FLAG))
     {
       if ((null_bit<<=1) == 256)