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 *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)