summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-03-18 13:42:45 +0400
committerunknown <bar@bar.mysql.r18.ru>2003-03-18 13:42:45 +0400
commit18d3292bb7cd47db17207f8cdbf74e925b34e74b (patch)
tree654a6c026a9f32264dd951b278c97e12c4456e3a
parent2dae38c71357665601f9eb8bc4186fa9be6d4dee (diff)
downloadmariadb-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.result43
-rw-r--r--mysql-test/t/ctype_recoding.test28
-rw-r--r--mysys/charset.c2
-rw-r--r--sql/sql_show.cc4
-rw-r--r--sql/sql_string.cc28
-rw-r--r--sql/sql_string.h1
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);