From 18d3292bb7cd47db17207f8cdbf74e925b34e74b Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Mar 2003 13:42:45 +0400 Subject: [PATCH] SHOW CREATE TABLE didn't display field names in the proper charset mysys/charset.c: Clear all fields at the end of previous charset --- mysql-test/r/ctype_recoding.result | 43 ++++++++++++++++++++++++++++++ mysql-test/t/ctype_recoding.test | 28 +++++++++++++++++++ mysys/charset.c | 2 ++ sql/sql_show.cc | 4 +-- sql/sql_string.cc | 28 +++++++++++++++++++ sql/sql_string.h | 1 + 6 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 mysql-test/r/ctype_recoding.result create mode 100644 mysql-test/t/ctype_recoding.test 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);