Commit 5167b5f0 authored by unknown's avatar unknown
Browse files

Bug #6379: ENUM values are incorrectly converted

- add_field_to_list() now uses <List>String
instead of TYPELIB to be able to distinguish
literals 'aaa' and hex literals 0xaabbcc.
- move some code from add_field_to_list() where
  we don't know column charset yet, to 
  mysql_prepare_table(), where we do.

parent ef13523d
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -1693,3 +1693,35 @@ oe
ue
ss
DROP TABLE t1;
CREATE TABLE t1 (
a ENUM('','','') character set utf8 default ''
);
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `a` enum('','','') character set utf8 default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
insert into t1 values (''), (''), ('');
select a from t1 order by a;
a



drop table t1;
set names utf8;
CREATE TABLE t1 (
a ENUM('ä','ö','ü') character set latin1 default 'ü'
);
insert into t1 values ('ä'),('ö'),('ü');
set names latin1;
show create table t1;
Table	Create Table
t1	CREATE TABLE `t1` (
  `a` enum('','','') default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
select a from t1 order by a;
a



drop table t1;
+28 −0
Original line number Diff line number Diff line
@@ -72,3 +72,31 @@ CREATE TABLE t1 (c enum('ae','oe','ue','ss') collate latin1_german2_ci);
INSERT INTO t1 VALUES (''),(''),(''),('');
SELECT * FROM t1;
DROP TABLE t1;

#
# Bug #6379: ENUM values are incorrectly converted
#
# Check latin1 -> utf8 conversion
#
CREATE TABLE t1 (
  a ENUM('','','') character set utf8 default ''
);
show create table t1;
insert into t1 values (''), (''), ('');
select a from t1 order by a;
drop table t1;

#
# Now check utf8 -> latin1 conversion
# This test emulates loading a script generated with mysqldump
#
set names utf8;
CREATE TABLE t1 (
  a ENUM('ä','ö','ü') character set latin1 default 'ü'
);
insert into t1 values ('ä'),('ö'),('ü');
# Now check what has been loaded
set names latin1;
show create table t1;
select a from t1 order by a;
drop table t1;
+1 −0
Original line number Diff line number Diff line
@@ -1198,6 +1198,7 @@ class create_field :public Sql_alloc {
  uint decimals,flags,pack_length;
  Field::utype unireg_check;
  TYPELIB *interval;			// Which interval to use
  List<String> interval_list;
  CHARSET_INFO *charset;
  Field::geometry_type geom_type;
  Field *field;				// For alter table
+2 −1
Original line number Diff line number Diff line
@@ -688,7 +688,8 @@ bool add_field_to_list(THD *thd, char *field_name, enum enum_field_types type,
		       uint type_modifier,
		       Item *default_value, Item *on_update_value,
		       LEX_STRING *comment,
		       char *change, TYPELIB *interval,CHARSET_INFO *cs,
		       char *change, List<String> *interval_list,
		       CHARSET_INFO *cs,
		       uint uint_geom_type);
void store_position_for_column(const char *name);
bool add_to_list(THD *thd, SQL_LIST &list,Item *group,bool asc=0);
+0 −1
Original line number Diff line number Diff line
@@ -592,7 +592,6 @@ typedef struct st_lex
  List<set_var_base>  var_list;
  List<Item_param>    param_list;
  SQL_LIST	      proc_list, auxilliary_table_list, save_list;
  TYPELIB	      *interval;
  create_field	      *last_field;
  char		      *savepoint_name;		// Transaction savepoint id
  udf_func udf;
Loading