Fix for SHOW, it didn't display CHARACTER SET and COLLATE clause
for binary collations
This commit is contained in:
parent
9d02a87cf3
commit
7e2aca564e
@ -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;
|
|||||||
--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;
|
||||||
|
19
sql/field.cc
19
sql/field.cc
@ -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
|
|||||||
|
|
||||||
/* 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)
|
|||||||
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)
|
|||||||
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
|
|||||||
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)
|
|||||||
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)
|
|||||||
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();
|
||||||
|
11
sql/field.h
11
sql/field.h
@ -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:
|
|||||||
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:
|
|||||||
|
|
||||||
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)
|
|||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user