diff options
author | unknown <bar@bar.mysql.r18.ru> | 2003-03-18 13:42:45 +0400 |
---|---|---|
committer | unknown <bar@bar.mysql.r18.ru> | 2003-03-18 13:42:45 +0400 |
commit | 18d3292bb7cd47db17207f8cdbf74e925b34e74b (patch) | |
tree | 654a6c026a9f32264dd951b278c97e12c4456e3a | |
parent | 2dae38c71357665601f9eb8bc4186fa9be6d4dee (diff) | |
download | mariadb-git-18d3292bb7cd47db17207f8cdbf74e925b34e74b.tar.gz |
SHOW CREATE TABLE didn't display field names in the proper charset
mysys/charset.c:
Clear all fields at the end of previous charset
-rw-r--r-- | mysql-test/r/ctype_recoding.result | 43 | ||||
-rw-r--r-- | mysql-test/t/ctype_recoding.test | 28 | ||||
-rw-r--r-- | mysys/charset.c | 2 | ||||
-rw-r--r-- | sql/sql_show.cc | 4 | ||||
-rw-r--r-- | sql/sql_string.cc | 28 | ||||
-rw-r--r-- | sql/sql_string.h | 1 |
6 files changed, 104 insertions, 2 deletions
diff --git a/mysql-test/r/ctype_recoding.result b/mysql-test/r/ctype_recoding.result new file mode 100644 index 00000000000..3422595c71f --- /dev/null +++ b/mysql-test/r/ctype_recoding.result @@ -0,0 +1,43 @@ +SET NAMES koi8r; +DROP TABLE IF EXISTS ÔÁÂÌÉÃÁ; +CREATE TABLE ÔÁÂÌÉÃÁ +( +ÐÏÌÅ CHAR(32) CHARACTER SET koi8r NOT NULL +); +SHOW TABLES; +Tables_in_test +ÔÁÂÌÉÃÁ +SHOW CREATE TABLE ÔÁÂÌÉÃÁ; +Table Create Table +ÔÁÂÌÉÃÁ CREATE TABLE `ÔÁÂÌÉÃÁ` ( + `ÐÏÌÅ` char(32) character set koi8r NOT NULL default '' +) TYPE=MyISAM CHARSET=latin1 +SHOW FIELDS FROM ÔÁÂÌÉÃÁ; +Field Type Collation Null Key Default Extra +ÐÏÌÅ char(32) character set koi8r koi8r +SET NAMES cp1251; +SHOW TABLES; +Tables_in_test +òàáëèöà +SHOW CREATE TABLE òàáëèöà; +Table Create Table +òàáëèöà CREATE TABLE `òàáëèöà` ( + `ïîëå` char(32) character set koi8r NOT NULL default '' +) TYPE=MyISAM CHARSET=latin1 +SHOW FIELDS FROM òàáëèöà; +Field Type Collation Null Key Default Extra +ïîëå char(32) character set koi8r koi8r +SET NAMES utf8; +SHOW TABLES; +Tables_in_test +таблица +SHOW CREATE TABLE таблица; +Table Create Table +таблица CREATE TABLE `таблица` ( + `поле` char(32) character set koi8r NOT NULL default '' +) TYPE=MyISAM CHARSET=latin1 +SHOW FIELDS FROM таблица; +Field Type Collation Null Key Default Extra +поле char(32) character set koi8r koi8r +SET NAMES koi8r; +DROP TABLE ÔÁÂÌÉÃÁ; diff --git a/mysql-test/t/ctype_recoding.test b/mysql-test/t/ctype_recoding.test new file mode 100644 index 00000000000..c0b7139c791 --- /dev/null +++ b/mysql-test/t/ctype_recoding.test @@ -0,0 +1,28 @@ +SET NAMES koi8r; + +--disable_warnings +DROP TABLE IF EXISTS ÔÁÂÌÉÃÁ; +--enable_warnings + +CREATE TABLE ÔÁÂÌÉÃÁ +( + ÐÏÌÅ CHAR(32) CHARACTER SET koi8r NOT NULL +); + +SHOW TABLES; +SHOW CREATE TABLE ÔÁÂÌÉÃÁ; +SHOW FIELDS FROM ÔÁÂÌÉÃÁ; + +SET NAMES cp1251; +SHOW TABLES; +SHOW CREATE TABLE òàáëèöà; +SHOW FIELDS FROM òàáëèöà; + + +SET NAMES utf8; +SHOW TABLES; +SHOW CREATE TABLE таблица; +SHOW FIELDS FROM таблица; + +SET NAMES koi8r; +DROP TABLE ÔÁÂÌÉÃÁ; diff --git a/mysys/charset.c b/mysys/charset.c index 0b2fd514019..ce44353b065 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -341,6 +341,8 @@ static int add_collation(CHARSET_INFO *cs) all_charsets[cs->number]->state |= cs->state; } cs->number= 0; + cs->primary_number= 0; + cs->binary_number= 0; cs->name= NULL; cs->state= 0; cs->sort_order= NULL; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 5db7d2f1406..00df2c44fd6 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1014,12 +1014,12 @@ append_identifier(THD *thd, String *packet, const char *name) if (thd->options & OPTION_QUOTE_SHOW_CREATE) { packet->append(&qtype, 1); - packet->append(name); + packet->append(name, 0, system_charset_info); packet->append(&qtype, 1); } else { - packet->append(name); + packet->append(name, 0, system_charset_info); } } diff --git a/sql/sql_string.cc b/sql/sql_string.cc index ae3875834f0..54a76319be7 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -338,6 +338,34 @@ bool String::append(const char *s,uint32 arg_length) } +/* + Append a string in the given charset to the string + with character set recoding +*/ + + +bool String::append(const char *s,uint32 arg_length, CHARSET_INFO *cs) +{ + if (!arg_length) // Default argument + if (!(arg_length= (uint32) strlen(s))) + return FALSE; + if (str_charset->mbmaxlen > 1) + { + uint32 add_length=arg_length * str_charset->mbmaxlen; + if (realloc(str_length+ add_length)) + return TRUE; + str_length+= copy_and_convert(Ptr+str_length, add_length, str_charset, + s, arg_length, cs); + return FALSE; + } + if (realloc(str_length+arg_length)) + return TRUE; + memcpy(Ptr+str_length,s,arg_length); + str_length+=arg_length; + return FALSE; +} + + #ifdef TO_BE_REMOVED bool String::append(FILE* file, uint32 arg_length, myf my_flags) { diff --git a/sql/sql_string.h b/sql/sql_string.h index 8e0705844ad..469574ca2e4 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -181,6 +181,7 @@ public: CHARSET_INFO *csto); bool append(const String &s); bool append(const char *s,uint32 arg_length=0); + bool append(const char *s,uint32 arg_length, CHARSET_INFO *cs); bool append(IO_CACHE* file, uint32 arg_length); int strstr(const String &search,uint32 offset=0); // Returns offset to substring or -1 int strstr_case(const String &s,uint32 offset=0); |