Commit 6cbbbd69 authored by bar@bar.mysql.r18.ru's avatar bar@bar.mysql.r18.ru

Fix for SHOW, it didn't display CHARACTER SET and COLLATE clause

for binary collations
parent c4dc670d
...@@ -483,4 +483,31 @@ Z ...@@ -483,4 +483,31 @@ Z
z z
SELECT DISTINCT latin1_f COLLATE koi8r FROM t1; SELECT DISTINCT latin1_f COLLATE koi8r FROM t1;
COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1' COLLATION 'koi8r' is not valid for CHARACTER SET 'latin1'
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`latin1_f` char(32) NOT NULL default ''
) TYPE=MyISAM CHARSET=latin1
SHOW FIELDS FROM t1;
Field Type Collation Null Key Default Extra
latin1_f char(32) latin1
ALTER TABLE t1 CHANGE latin1_f
latin1_f CHAR(32) CHARACTER SET latin1 COLLATE latin1_bin;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`latin1_f` char(32) character set latin1 collate latin1_bin default NULL
) TYPE=MyISAM CHARSET=latin1
SHOW FIELDS FROM t1;
Field Type Collation Null Key Default Extra
latin1_f char(32) character set latin1 latin1_bin YES NULL
ALTER TABLE t1 CHARACTER SET latin1 COLLATE latin1_bin;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`latin1_f` char(32) collate latin1_bin default NULL
) TYPE=MyISAM CHARSET=latin1 COLLATE=latin1_bin
SHOW FIELDS FROM t1;
Field Type Collation Null Key Default Extra
latin1_f char(32) latin1_bin YES NULL
DROP TABLE t1; DROP TABLE t1;
...@@ -112,4 +112,19 @@ SELECT DISTINCT latin1_f COLLATE koi8r FROM t1; ...@@ -112,4 +112,19 @@ SELECT DISTINCT latin1_f COLLATE koi8r FROM t1;
--FROM t1 --FROM t1
--HAVING (_latin1'Mu"ller' COLLATE latin1_de) = k --HAVING (_latin1'Mu"ller' COLLATE latin1_de) = k
#
# Check that SHOW displays COLLATE clause
#
SHOW CREATE TABLE t1;
SHOW FIELDS FROM t1;
ALTER TABLE t1 CHANGE latin1_f
latin1_f CHAR(32) CHARACTER SET latin1 COLLATE latin1_bin;
SHOW CREATE TABLE t1;
SHOW FIELDS FROM t1;
ALTER TABLE t1 CHARACTER SET latin1 COLLATE latin1_bin;
SHOW CREATE TABLE t1;
SHOW FIELDS FROM t1;
DROP TABLE t1; DROP TABLE t1;
...@@ -248,7 +248,7 @@ void Field_str::make_field(Send_field *field) ...@@ -248,7 +248,7 @@ void Field_str::make_field(Send_field *field)
void Field_str::add_binary_or_charset(String &res) const void Field_str::add_binary_or_charset(String &res) const
{ {
if (binary()) if (charset() == &my_charset_bin)
res.append(" binary"); res.append(" binary");
else if (field_charset != table->table_charset && else if (field_charset != table->table_charset &&
!(current_thd->variables.sql_mode & MODE_NO_FIELD_OPTIONS) && !(current_thd->variables.sql_mode & MODE_NO_FIELD_OPTIONS) &&
...@@ -3875,13 +3875,18 @@ void Field_datetime::sql_type(String &res) const ...@@ -3875,13 +3875,18 @@ void Field_datetime::sql_type(String &res) const
/* Copy a string and fill with space */ /* Copy a string and fill with space */
static bool use_conversion(CHARSET_INFO *cs1, CHARSET_INFO *cs2)
{
return (cs1 != &my_charset_bin) && (cs2 != &my_charset_bin) && (cs1!=cs2);
}
int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
{ {
int error= 0; int error= 0;
char buff[80]; char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin); String tmpstr(buff,sizeof(buff), &my_charset_bin);
/* Convert character set if nesessary */ /* Convert character set if nesessary */
if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) if (use_conversion(cs, field_charset))
{ {
tmpstr.copy(from, length, cs, field_charset); tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr(); from= tmpstr.ptr();
...@@ -4063,7 +4068,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -4063,7 +4068,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
char buff[80]; char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin); String tmpstr(buff,sizeof(buff), &my_charset_bin);
/* Convert character set if nesessary */ /* Convert character set if nesessary */
if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) if (use_conversion(cs, field_charset))
{ {
tmpstr.copy(from, length, cs, field_charset); tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr(); from= tmpstr.ptr();
...@@ -4380,7 +4385,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -4380,7 +4385,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
char buff[80]; char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin); String tmpstr(buff,sizeof(buff), &my_charset_bin);
/* Convert character set if nesessary */ /* Convert character set if nesessary */
if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) if (use_conversion(cs, field_charset))
{ {
tmpstr.copy(from, length, cs, field_charset); tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr(); from= tmpstr.ptr();
...@@ -4627,7 +4632,7 @@ void Field_blob::sql_type(String &res) const ...@@ -4627,7 +4632,7 @@ void Field_blob::sql_type(String &res) const
case 4: str="long"; length=4; break; case 4: str="long"; length=4; break;
} }
res.set_latin1(str,length); res.set_latin1(str,length);
if (binary()) if (charset() == &my_charset_bin)
res.append("blob"); res.append("blob");
else else
{ {
...@@ -4857,7 +4862,7 @@ int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -4857,7 +4862,7 @@ int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
char buff[80]; char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin); String tmpstr(buff,sizeof(buff), &my_charset_bin);
/* Convert character set if nesessary */ /* Convert character set if nesessary */
if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) if (use_conversion(cs, field_charset))
{ {
tmpstr.copy(from, length, cs, field_charset); tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr(); from= tmpstr.ptr();
...@@ -5072,7 +5077,7 @@ int Field_set::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -5072,7 +5077,7 @@ int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
char buff[80]; char buff[80];
String tmpstr(buff,sizeof(buff), &my_charset_bin); String tmpstr(buff,sizeof(buff), &my_charset_bin);
/* Convert character set if nesessary */ /* Convert character set if nesessary */
if ((cs != field_charset) && (cs!=&my_charset_bin) && (!binary())) if (use_conversion(cs, field_charset))
{ {
tmpstr.copy(from, length, cs, field_charset); tmpstr.copy(from, length, cs, field_charset);
from= tmpstr.ptr(); from= tmpstr.ptr();
......
...@@ -160,8 +160,6 @@ public: ...@@ -160,8 +160,6 @@ public:
{ get_image(buff,length,cs); } { get_image(buff,length,cs); }
virtual void set_key_image(char *buff,uint length, CHARSET_INFO *cs) virtual void set_key_image(char *buff,uint length, CHARSET_INFO *cs)
{ set_image(buff,length,cs); } { set_image(buff,length,cs); }
inline int cmp_image(char *buff,uint length)
{ return memcmp(ptr,buff,length); }
inline longlong val_int_offset(uint row_offset) inline longlong val_int_offset(uint row_offset)
{ {
ptr+=row_offset; ptr+=row_offset;
...@@ -265,7 +263,7 @@ public: ...@@ -265,7 +263,7 @@ public:
unireg_check_arg, field_name_arg, table_arg) unireg_check_arg, field_name_arg, table_arg)
{ {
field_charset=charset; field_charset=charset;
if (binary()) if (charset->state & MY_CS_BINSORT)
flags|=BINARY_FLAG; flags|=BINARY_FLAG;
} }
Item_result result_type () const { return STRING_RESULT; } Item_result result_type () const { return STRING_RESULT; }
...@@ -277,13 +275,6 @@ public: ...@@ -277,13 +275,6 @@ public:
void set_charset(CHARSET_INFO *charset) { field_charset=charset; } void set_charset(CHARSET_INFO *charset) { field_charset=charset; }
bool binary() const { return field_charset->state & MY_CS_BINSORT ? 1 : 0; } bool binary() const { return field_charset->state & MY_CS_BINSORT ? 1 : 0; }
inline int cmp_image(char *buff,uint length)
{
if (binary())
return memcmp(ptr,buff,length);
else
return my_strncasecmp(field_charset,ptr,buff,length);
}
friend class create_field; friend class create_field;
}; };
......
...@@ -1074,7 +1074,7 @@ store_create_info(THD *thd, TABLE *table, String *packet) ...@@ -1074,7 +1074,7 @@ store_create_info(THD *thd, TABLE *table, String *packet)
For string types dump collation name only if For string types dump collation name only if
collation is not primary for the given charset collation is not primary for the given charset
*/ */
if (!field->binary() && !(field->charset()->state & MY_CS_PRIMARY) && if (!(field->charset()->state & MY_CS_PRIMARY) &&
!limited_mysql_mode && !foreign_db_mode) !limited_mysql_mode && !foreign_db_mode)
{ {
packet->append(" collate ", 9); packet->append(" collate ", 9);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment