Commit 3eff4316 authored by unknown's avatar unknown

1. New data types, from the user point of view:

   BINARY(N) and VARBIBARY(N)
2. More 4.0 compatibility and more BINARY keyword consistency:
2a. CREATE TABLE a (a CHAR(N) BINARY) 
    is now synonym for
    CREATE TABLE a (a CHAR(N) COLLATE xxxx_bin)
2b. SELECT BINARY x
    is still synonin for
    SELECT x COLLATE xxxxx_bin.

parent c1e76fc0
...@@ -78,6 +78,7 @@ enum enum_server_command ...@@ -78,6 +78,7 @@ enum enum_server_command
#define PART_KEY_FLAG 16384 /* Intern; Part of some key */ #define PART_KEY_FLAG 16384 /* Intern; Part of some key */
#define GROUP_FLAG 32768 /* Intern: Group field */ #define GROUP_FLAG 32768 /* Intern: Group field */
#define UNIQUE_FLAG 65536 /* Intern: Used by sql_yacc */ #define UNIQUE_FLAG 65536 /* Intern: Used by sql_yacc */
#define BINCMP_FLAG 131072 /* Intern: Used by sql_yacc */
#define REFRESH_GRANT 1 /* Refresh grant tables */ #define REFRESH_GRANT 1 /* Refresh grant tables */
#define REFRESH_LOG 2 /* Start on new log file */ #define REFRESH_LOG 2 /* Start on new log file */
......
...@@ -321,7 +321,7 @@ alter table t1 change a a char(10) character set cp1251; ...@@ -321,7 +321,7 @@ alter table t1 change a a char(10) character set cp1251;
select a,hex(a) from t1; select a,hex(a) from t1;
a hex(a) a hex(a)
F2E5F1F2 F2E5F1F2
alter table t1 change a a char(10) binary; alter table t1 change a a binary(10);
select a,hex(a) from t1; select a,hex(a) from t1;
a hex(a) a hex(a)
F2E5F1F2 F2E5F1F2
......
...@@ -51,11 +51,11 @@ CONVERT(DATE "2004-01-22 21:45:33",CHAR) ...@@ -51,11 +51,11 @@ CONVERT(DATE "2004-01-22 21:45:33",CHAR)
select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4)); select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4));
CONVERT(DATE "2004-01-22 21:45:33",CHAR(4)) CONVERT(DATE "2004-01-22 21:45:33",CHAR(4))
2004 2004
select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4) BINARY); select CONVERT(DATE "2004-01-22 21:45:33",BINARY(4));
CONVERT(DATE "2004-01-22 21:45:33",CHAR(4) BINARY) CONVERT(DATE "2004-01-22 21:45:33",BINARY(4))
2004 2004
select CAST(DATE "2004-01-22 21:45:33" AS CHAR(4) BINARY); select CAST(DATE "2004-01-22 21:45:33" AS BINARY(4));
CAST(DATE "2004-01-22 21:45:33" AS CHAR(4) BINARY) CAST(DATE "2004-01-22 21:45:33" AS BINARY(4))
2004 2004
set names binary; set names binary;
select cast(_latin1'test' as char character set latin2); select cast(_latin1'test' as char character set latin2);
...@@ -91,11 +91,11 @@ ab a ab a a ...@@ -91,11 +91,11 @@ ab a ab a a
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`c1` char(2) binary NOT NULL default '', `c1` binary(2) NOT NULL default '',
`c2` char(2) binary NOT NULL default '', `c2` binary(2) NOT NULL default '',
`c3` char(2) binary NOT NULL default '', `c3` binary(2) NOT NULL default '',
`c4` char(2) binary NOT NULL default '', `c4` binary(2) NOT NULL default '',
`c5` char(2) binary NOT NULL default '' `c5` binary(2) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
select select
......
...@@ -73,7 +73,7 @@ create table t1 select date_format("2004-01-19 10:10:10", "%Y-%m-%d"); ...@@ -73,7 +73,7 @@ create table t1 select date_format("2004-01-19 10:10:10", "%Y-%m-%d");
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`date_format("2004-01-19 10:10:10", "%Y-%m-%d")` char(10) binary default NULL `date_format("2004-01-19 10:10:10", "%Y-%m-%d")` binary(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
select * from t1; select * from t1;
date_format("2004-01-19 10:10:10", "%Y-%m-%d") date_format("2004-01-19 10:10:10", "%Y-%m-%d")
......
...@@ -364,7 +364,7 @@ str_to_date(a,b) ...@@ -364,7 +364,7 @@ str_to_date(a,b)
create table t2 select str_to_date(a,b) from t1; create table t2 select str_to_date(a,b) from t1;
describe t2; describe t2;
Field Type Null Key Default Extra Field Type Null Key Default Extra
str_to_date(a,b) char(29) YES NULL str_to_date(a,b) binary(29) YES NULL
select str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f") as f1, select str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f") as f1,
str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S") as f2, str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S") as f2,
str_to_date("2003-01-02", "%Y-%m-%d") as f3, str_to_date("2003-01-02", "%Y-%m-%d") as f3,
......
...@@ -150,7 +150,7 @@ believe in myself ...@@ -150,7 +150,7 @@ believe in myself
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
t1ID int(10) unsigned NOT NULL auto_increment, t1ID int(10) unsigned NOT NULL auto_increment,
art char(1) binary NOT NULL default '', art binary(1) NOT NULL default '',
KNR char(5) NOT NULL default '', KNR char(5) NOT NULL default '',
RECHNR char(6) NOT NULL default '', RECHNR char(6) NOT NULL default '',
POSNR char(2) NOT NULL default '', POSNR char(2) NOT NULL default '',
......
...@@ -13,9 +13,9 @@ user ...@@ -13,9 +13,9 @@ user
show create table db; show create table db;
Table Create Table Table Create Table
db CREATE TABLE `db` ( db CREATE TABLE `db` (
`Host` char(60) binary NOT NULL default '', `Host` char(60) character set latin1 collate latin1_bin NOT NULL default '',
`Db` char(64) binary NOT NULL default '', `Db` char(64) character set latin1 collate latin1_bin NOT NULL default '',
`User` char(16) binary NOT NULL default '', `User` char(16) character set latin1 collate latin1_bin NOT NULL default '',
`Select_priv` enum('N','Y') NOT NULL default 'N', `Select_priv` enum('N','Y') NOT NULL default 'N',
`Insert_priv` enum('N','Y') NOT NULL default 'N', `Insert_priv` enum('N','Y') NOT NULL default 'N',
`Update_priv` enum('N','Y') NOT NULL default 'N', `Update_priv` enum('N','Y') NOT NULL default 'N',
...@@ -34,8 +34,8 @@ db CREATE TABLE `db` ( ...@@ -34,8 +34,8 @@ db CREATE TABLE `db` (
show create table host; show create table host;
Table Create Table Table Create Table
host CREATE TABLE `host` ( host CREATE TABLE `host` (
`Host` char(60) binary NOT NULL default '', `Host` char(60) character set latin1 collate latin1_bin NOT NULL default '',
`Db` char(64) binary NOT NULL default '', `Db` char(64) character set latin1 collate latin1_bin NOT NULL default '',
`Select_priv` enum('N','Y') NOT NULL default 'N', `Select_priv` enum('N','Y') NOT NULL default 'N',
`Insert_priv` enum('N','Y') NOT NULL default 'N', `Insert_priv` enum('N','Y') NOT NULL default 'N',
`Update_priv` enum('N','Y') NOT NULL default 'N', `Update_priv` enum('N','Y') NOT NULL default 'N',
...@@ -53,9 +53,9 @@ host CREATE TABLE `host` ( ...@@ -53,9 +53,9 @@ host CREATE TABLE `host` (
show create table user; show create table user;
Table Create Table Table Create Table
user CREATE TABLE `user` ( user CREATE TABLE `user` (
`Host` varchar(60) binary NOT NULL default '', `Host` varchar(60) character set latin1 collate latin1_bin NOT NULL default '',
`User` varchar(16) binary NOT NULL default '', `User` varchar(16) character set latin1 collate latin1_bin NOT NULL default '',
`Password` varchar(41) binary NOT NULL default '', `Password` varchar(41) character set latin1 collate latin1_bin NOT NULL default '',
`Select_priv` enum('N','Y') NOT NULL default 'N', `Select_priv` enum('N','Y') NOT NULL default 'N',
`Insert_priv` enum('N','Y') NOT NULL default 'N', `Insert_priv` enum('N','Y') NOT NULL default 'N',
`Update_priv` enum('N','Y') NOT NULL default 'N', `Update_priv` enum('N','Y') NOT NULL default 'N',
...@@ -89,7 +89,7 @@ user CREATE TABLE `user` ( ...@@ -89,7 +89,7 @@ user CREATE TABLE `user` (
show create table func; show create table func;
Table Create Table Table Create Table
func CREATE TABLE `func` ( func CREATE TABLE `func` (
`name` char(64) binary NOT NULL default '', `name` char(64) character set latin1 collate latin1_bin NOT NULL default '',
`ret` tinyint(1) NOT NULL default '0', `ret` tinyint(1) NOT NULL default '0',
`dl` char(128) NOT NULL default '', `dl` char(128) NOT NULL default '',
`type` enum('function','aggregate') NOT NULL default 'function', `type` enum('function','aggregate') NOT NULL default 'function',
...@@ -98,10 +98,10 @@ func CREATE TABLE `func` ( ...@@ -98,10 +98,10 @@ func CREATE TABLE `func` (
show create table tables_priv; show create table tables_priv;
Table Create Table Table Create Table
tables_priv CREATE TABLE `tables_priv` ( tables_priv CREATE TABLE `tables_priv` (
`Host` char(60) binary NOT NULL default '', `Host` char(60) character set latin1 collate latin1_bin NOT NULL default '',
`Db` char(64) binary NOT NULL default '', `Db` char(64) character set latin1 collate latin1_bin NOT NULL default '',
`User` char(16) binary NOT NULL default '', `User` char(16) character set latin1 collate latin1_bin NOT NULL default '',
`Table_name` char(64) binary NOT NULL default '', `Table_name` char(64) character set latin1 collate latin1_bin NOT NULL default '',
`Grantor` char(77) NOT NULL default '', `Grantor` char(77) NOT NULL default '',
`Timestamp` timestamp NOT NULL, `Timestamp` timestamp NOT NULL,
`Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') NOT NULL default '', `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') NOT NULL default '',
...@@ -112,11 +112,11 @@ tables_priv CREATE TABLE `tables_priv` ( ...@@ -112,11 +112,11 @@ tables_priv CREATE TABLE `tables_priv` (
show create table columns_priv; show create table columns_priv;
Table Create Table Table Create Table
columns_priv CREATE TABLE `columns_priv` ( columns_priv CREATE TABLE `columns_priv` (
`Host` char(60) binary NOT NULL default '', `Host` char(60) character set latin1 collate latin1_bin NOT NULL default '',
`Db` char(64) binary NOT NULL default '', `Db` char(64) character set latin1 collate latin1_bin NOT NULL default '',
`User` char(16) binary NOT NULL default '', `User` char(16) character set latin1 collate latin1_bin NOT NULL default '',
`Table_name` char(64) binary NOT NULL default '', `Table_name` char(64) character set latin1 collate latin1_bin NOT NULL default '',
`Column_name` char(64) binary NOT NULL default '', `Column_name` char(64) character set latin1 collate latin1_bin NOT NULL default '',
`Timestamp` timestamp NOT NULL, `Timestamp` timestamp NOT NULL,
`Column_priv` set('Select','Insert','Update','References') NOT NULL default '', `Column_priv` set('Select','Insert','Update','References') NOT NULL default '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`) PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
......
...@@ -7,7 +7,7 @@ b text YES NULL ...@@ -7,7 +7,7 @@ b text YES NULL
c blob YES NULL c blob YES NULL
d mediumtext YES NULL d mediumtext YES NULL
e longtext YES NULL e longtext YES NULL
CREATE TABLE t2 (a char(257), b varchar(70000) binary, c varchar(70000000)); CREATE TABLE t2 (a char(257), b varbinary(70000), c varchar(70000000));
Warnings: Warnings:
Warning 1246 Converting column 'a' from CHAR to TEXT Warning 1246 Converting column 'a' from CHAR to TEXT
Warning 1246 Converting column 'b' from CHAR to BLOB Warning 1246 Converting column 'b' from CHAR to BLOB
...@@ -57,7 +57,7 @@ select * from t1; ...@@ -57,7 +57,7 @@ select * from t1;
a a
Where Where
drop table t1; drop table t1;
create table t1 (t text,c char(10),b blob, d char(10) binary); create table t1 (t text,c char(10),b blob, d binary(10));
insert into t1 values (NULL,NULL,NULL,NULL); insert into t1 values (NULL,NULL,NULL,NULL);
insert into t1 values ("","","",""); insert into t1 values ("","","","");
insert into t1 values ("hello","hello","hello","hello"); insert into t1 values ("hello","hello","hello","hello");
...@@ -73,14 +73,14 @@ Field Type Collation Null Key Default Extra Privileges Comment ...@@ -73,14 +73,14 @@ Field Type Collation Null Key Default Extra Privileges Comment
t text latin1_swedish_ci YES NULL select,insert,update,references t text latin1_swedish_ci YES NULL select,insert,update,references
c varchar(10) latin1_swedish_ci YES NULL select,insert,update,references c varchar(10) latin1_swedish_ci YES NULL select,insert,update,references
b blob NULL YES NULL select,insert,update,references b blob NULL YES NULL select,insert,update,references
d varchar(10) binary YES NULL select,insert,update,references d varbinary(10) NULL YES NULL select,insert,update,references
lock tables t1 WRITE; lock tables t1 WRITE;
show full fields from t1; show full fields from t1;
Field Type Collation Null Key Default Extra Privileges Comment Field Type Collation Null Key Default Extra Privileges Comment
t text latin1_swedish_ci YES NULL select,insert,update,references t text latin1_swedish_ci YES NULL select,insert,update,references
c varchar(10) latin1_swedish_ci YES NULL select,insert,update,references c varchar(10) latin1_swedish_ci YES NULL select,insert,update,references
b blob NULL YES NULL select,insert,update,references b blob NULL YES NULL select,insert,update,references
d varchar(10) binary YES NULL select,insert,update,references d varbinary(10) NULL YES NULL select,insert,update,references
unlock tables; unlock tables;
select t from t1 where t like "hello"; select t from t1 where t like "hello";
t t
......
...@@ -649,7 +649,7 @@ f ...@@ -649,7 +649,7 @@ f
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`f` char(12) binary default NULL `f` binary(12) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT y from t2 UNION select da from t2; create table t1 SELECT y from t2 UNION select da from t2;
...@@ -660,7 +660,7 @@ y ...@@ -660,7 +660,7 @@ y
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`y` char(10) binary default NULL `y` binary(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT y from t2 UNION select dt from t2; create table t1 SELECT y from t2 UNION select dt from t2;
...@@ -671,7 +671,7 @@ y ...@@ -671,7 +671,7 @@ y
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`y` char(19) binary default NULL `y` binary(19) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
create table t1 SELECT da from t2 UNION select dt from t2; create table t1 SELECT da from t2 UNION select dt from t2;
......
...@@ -193,7 +193,7 @@ insert into t1 values (' ...@@ -193,7 +193,7 @@ insert into t1 values ('
select a,hex(a) from t1; select a,hex(a) from t1;
alter table t1 change a a char(10) character set cp1251; alter table t1 change a a char(10) character set cp1251;
select a,hex(a) from t1; select a,hex(a) from t1;
alter table t1 change a a char(10) binary; alter table t1 change a a binary(10);
select a,hex(a) from t1; select a,hex(a) from t1;
alter table t1 change a a char(10) character set cp1251; alter table t1 change a a char(10) character set cp1251;
select a,hex(a) from t1; select a,hex(a) from t1;
......
...@@ -19,8 +19,8 @@ select CONVERT("2004-01-22 21:45:33",DATE); ...@@ -19,8 +19,8 @@ select CONVERT("2004-01-22 21:45:33",DATE);
select CONVERT(DATE "2004-01-22 21:45:33" USING latin1); select CONVERT(DATE "2004-01-22 21:45:33" USING latin1);
select CONVERT(DATE "2004-01-22 21:45:33",CHAR); select CONVERT(DATE "2004-01-22 21:45:33",CHAR);
select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4)); select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4));
select CONVERT(DATE "2004-01-22 21:45:33",CHAR(4) BINARY); select CONVERT(DATE "2004-01-22 21:45:33",BINARY(4));
select CAST(DATE "2004-01-22 21:45:33" AS CHAR(4) BINARY); select CAST(DATE "2004-01-22 21:45:33" AS BINARY(4));
# #
# Character set convertion # Character set convertion
......
...@@ -118,7 +118,7 @@ drop table t1; ...@@ -118,7 +118,7 @@ drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
t1ID int(10) unsigned NOT NULL auto_increment, t1ID int(10) unsigned NOT NULL auto_increment,
art char(1) binary NOT NULL default '', art binary(1) NOT NULL default '',
KNR char(5) NOT NULL default '', KNR char(5) NOT NULL default '',
RECHNR char(6) NOT NULL default '', RECHNR char(6) NOT NULL default '',
POSNR char(2) NOT NULL default '', POSNR char(2) NOT NULL default '',
......
...@@ -16,7 +16,7 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7; ...@@ -16,7 +16,7 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7;
CREATE TABLE t1 (a blob, b text, c blob(250), d text(70000), e text(70000000)); CREATE TABLE t1 (a blob, b text, c blob(250), d text(70000), e text(70000000));
show columns from t1; show columns from t1;
CREATE TABLE t2 (a char(257), b varchar(70000) binary, c varchar(70000000)); CREATE TABLE t2 (a char(257), b varbinary(70000), c varchar(70000000));
show columns from t2; show columns from t2;
create table t3 (a long, b long byte); create table t3 (a long, b long byte);
show create TABLE t3; show create TABLE t3;
...@@ -62,7 +62,7 @@ drop table t1; ...@@ -62,7 +62,7 @@ drop table t1;
# #
# test of blob, text, char and char binary # test of blob, text, char and char binary
# #
create table t1 (t text,c char(10),b blob, d char(10) binary); create table t1 (t text,c char(10),b blob, d binary(10));
insert into t1 values (NULL,NULL,NULL,NULL); insert into t1 values (NULL,NULL,NULL,NULL);
insert into t1 values ("","","",""); insert into t1 values ("","","","");
insert into t1 values ("hello","hello","hello","hello"); insert into t1 values ("hello","hello","hello","hello");
......
...@@ -4224,7 +4224,8 @@ void Field_string::sql_type(String &res) const ...@@ -4224,7 +4224,8 @@ void Field_string::sql_type(String &res) const
(field_length > 3 && (field_length > 3 &&
(table->db_options_in_use & (table->db_options_in_use &
HA_OPTION_PACK_RECORD) ? HA_OPTION_PACK_RECORD) ?
"varchar" : "char"), (has_charset() ? "varchar" : "varbinary") :
(has_charset() ? "char" : "binary")),
(int) field_length / charset()->mbmaxlen); (int) field_length / charset()->mbmaxlen);
res.length(length); res.length(length);
} }
......
...@@ -864,7 +864,8 @@ class Field_string :public Field_str { ...@@ -864,7 +864,8 @@ class Field_string :public Field_str {
uint max_packed_col_length(uint max_length); uint max_packed_col_length(uint max_length);
uint size_of() const { return sizeof(*this); } uint size_of() const { return sizeof(*this); }
enum_field_types real_type() const { return FIELD_TYPE_STRING; } enum_field_types real_type() const { return FIELD_TYPE_STRING; }
bool has_charset(void) const { return TRUE; } bool has_charset(void) const
{ return charset() == &my_charset_bin ? FALSE : TRUE; }
field_cast_enum field_cast_type() { return FIELD_CAST_STRING; } field_cast_enum field_cast_type() { return FIELD_CAST_STRING; }
}; };
...@@ -911,7 +912,8 @@ class Field_varstring :public Field_str { ...@@ -911,7 +912,8 @@ class Field_varstring :public Field_str {
uint max_packed_col_length(uint max_length); uint max_packed_col_length(uint max_length);
uint size_of() const { return sizeof(*this); } uint size_of() const { return sizeof(*this); }
enum_field_types real_type() const { return FIELD_TYPE_VAR_STRING; } enum_field_types real_type() const { return FIELD_TYPE_VAR_STRING; }
bool has_charset(void) const { return TRUE; } bool has_charset(void) const
{ return charset() == &my_charset_bin ? FALSE : TRUE; }
field_cast_enum field_cast_type() { return FIELD_CAST_VARSTRING; } field_cast_enum field_cast_type() { return FIELD_CAST_VARSTRING; }
}; };
......
...@@ -1247,26 +1247,21 @@ store_create_info(THD *thd, TABLE *table, String *packet) ...@@ -1247,26 +1247,21 @@ store_create_info(THD *thd, TABLE *table, String *packet)
field->sql_type(type); field->sql_type(type);
packet->append(type.ptr(),type.length()); packet->append(type.ptr(),type.length());
if (field->has_charset()) if (field->has_charset() && !limited_mysql_mode && !foreign_db_mode)
{ {
if (field->charset() == &my_charset_bin) if (field->charset() != table->table_charset)
packet->append(" binary", 7);
else if (!limited_mysql_mode && !foreign_db_mode)
{ {
if (field->charset() != table->table_charset) packet->append(" character set ", 15);
{ packet->append(field->charset()->csname);
packet->append(" character set ", 15); }
packet->append(field->charset()->csname); /*
} For string types dump collation name only if
/* collation is not primary for the given charset
For string types dump collation name only if */
collation is not primary for the given charset if (!(field->charset()->state & MY_CS_PRIMARY))
*/ {
if (!(field->charset()->state & MY_CS_PRIMARY)) packet->append(" collate ", 9);
{ packet->append(field->charset()->name);
packet->append(" collate ", 9);
packet->append(field->charset()->name);
}
} }
} }
......
...@@ -476,6 +476,18 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, ...@@ -476,6 +476,18 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
*/ */
if (create_info->table_charset && sql_field->charset != &my_charset_bin) if (create_info->table_charset && sql_field->charset != &my_charset_bin)
sql_field->charset= create_info->table_charset; sql_field->charset= create_info->table_charset;
CHARSET_INFO *savecs= sql_field->charset;
if ((sql_field->flags & BINCMP_FLAG) &&
!(sql_field->charset= get_charset_by_csname(sql_field->charset->csname,
MY_CS_BINSORT,MYF(0))))
{
char tmp[64];
strmake(strmake(tmp, savecs->csname, sizeof(tmp)-4), "_bin", 4);
my_error(ER_UNKNOWN_COLLATION, MYF(0), tmp);
DBUG_RETURN(-1);
}
sql_field->create_length_to_internal_length(); sql_field->create_length_to_internal_length();
/* Don't pack keys in old tables if the user has requested this */ /* Don't pack keys in old tables if the user has requested this */
......
...@@ -1450,6 +1450,7 @@ attribute: ...@@ -1450,6 +1450,7 @@ attribute:
| UNIQUE_SYM { Lex->type|= UNIQUE_FLAG; } | UNIQUE_SYM { Lex->type|= UNIQUE_FLAG; }
| UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; } | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; }
| COMMENT_SYM TEXT_STRING_sys { Lex->comment= &$2; } | COMMENT_SYM TEXT_STRING_sys { Lex->comment= &$2; }
| BINARY { Lex->type|= BINCMP_FLAG; }
| COLLATE_SYM collation_name | COLLATE_SYM collation_name
{ {
if (Lex->charset && !my_charset_same(Lex->charset,$2)) if (Lex->charset && !my_charset_same(Lex->charset,$2))
...@@ -1531,7 +1532,6 @@ opt_binary: ...@@ -1531,7 +1532,6 @@ opt_binary:
/* empty */ { Lex->charset=NULL; } /* empty */ { Lex->charset=NULL; }
| ASCII_SYM { Lex->charset=&my_charset_latin1; } | ASCII_SYM { Lex->charset=&my_charset_latin1; }
| BYTE_SYM { Lex->charset=&my_charset_bin; } | BYTE_SYM { Lex->charset=&my_charset_bin; }
| BINARY { Lex->charset=&my_charset_bin; }
| UNICODE_SYM | UNICODE_SYM
{ {
if (!(Lex->charset=get_charset_by_csname("ucs2",MY_CS_PRIMARY,MYF(0)))) if (!(Lex->charset=get_charset_by_csname("ucs2",MY_CS_PRIMARY,MYF(0))))
...@@ -3089,7 +3089,7 @@ in_sum_expr: ...@@ -3089,7 +3089,7 @@ in_sum_expr:
}; };
cast_type: cast_type:
BINARY { $$=ITEM_CAST_BINARY; Lex->charset= NULL; Lex->length= (char*)0; } BINARY opt_len { $$=ITEM_CAST_CHAR; Lex->charset= &my_charset_bin; }
| CHAR_SYM opt_len opt_binary { $$=ITEM_CAST_CHAR; } | CHAR_SYM opt_len opt_binary { $$=ITEM_CAST_CHAR; }
| NCHAR_SYM opt_len { $$=ITEM_CAST_CHAR; Lex->charset= national_charset_info; } | NCHAR_SYM opt_len { $$=ITEM_CAST_CHAR; Lex->charset= national_charset_info; }
| SIGNED_SYM { $$=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->length= (char*)0; } | SIGNED_SYM { $$=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->length= (char*)0; }
......
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